commit a8fab5e851e1f9c082c4902132ee81c461bd11a1 Author: n8fr8 nathan@freitas.net Date: Fri Jul 6 14:53:01 2012 -0400
removed privoxy source --- external/privoxy/AUTHORS | 116 - external/privoxy/ChangeLog | 717 -- external/privoxy/GNUmakefile.in | 2156 ----- external/privoxy/INSTALL | 173 - external/privoxy/LICENSE | 339 - external/privoxy/Makefile | 108 - external/privoxy/README | 280 - external/privoxy/acconfig.h | 495 -- external/privoxy/actionlist.h | 306 - external/privoxy/actions.c | 2021 ----- external/privoxy/actions.h | 187 - external/privoxy/amiga.c | 341 - external/privoxy/amiga.h | 176 - external/privoxy/cgi.c | 2987 ------- external/privoxy/cgi.h | 289 - external/privoxy/cgiedit.c | 4924 ----------- external/privoxy/cgiedit.h | 175 - external/privoxy/cgisimple.c | 2295 ----- external/privoxy/cgisimple.h | 185 - external/privoxy/config | 1530 ---- external/privoxy/config.guess | 1530 ---- external/privoxy/config.orig | 1530 ---- external/privoxy/config.sub | 1773 ---- external/privoxy/configure.in | 1463 --- external/privoxy/cygwin.h | 80 - external/privoxy/deanimate.c | 554 -- external/privoxy/deanimate.h | 126 - external/privoxy/default.action.master | 2162 ----- external/privoxy/default.filter | 1289 --- external/privoxy/doc/gpl.html | 560 -- external/privoxy/doc/pcrs.3 | 488 - external/privoxy/doc/source/authors.sgml | 67 - external/privoxy/doc/source/buildsource.sgml | 256 - external/privoxy/doc/source/config.sgml | 36 - external/privoxy/doc/source/contacting.sgml | 262 - external/privoxy/doc/source/copyright.sgml | 47 - external/privoxy/doc/source/developer-manual.sgml | 3304 ------- external/privoxy/doc/source/faq.sgml | 3454 -------- external/privoxy/doc/source/history.sgml | 71 - external/privoxy/doc/source/install.sgml | 106 - external/privoxy/doc/source/ldp.dsl.in | 420 - external/privoxy/doc/source/license.sgml | 50 - external/privoxy/doc/source/newfeatures.sgml | 156 - external/privoxy/doc/source/p-authors.sgml | 159 - external/privoxy/doc/source/p-config.sgml | 2756 ------ external/privoxy/doc/source/privoxy-man-page.sgml | 352 - external/privoxy/doc/source/privoxy.sgml | 44 - external/privoxy/doc/source/readme.sgml | 268 - external/privoxy/doc/source/seealso.sgml | 113 - external/privoxy/doc/source/supported.sgml | 46 - external/privoxy/doc/source/temp/manpage.refs | 4 - external/privoxy/doc/source/user-manual.sgml | 9328 -------------------- external/privoxy/doc/source/webserver/index.sgml | 372 - external/privoxy/doc/webserver/README.txt | 9 - external/privoxy/doc/webserver/announce.txt | 126 - .../doc/webserver/developer-manual/coding.html | 2602 ------ .../doc/webserver/developer-manual/contact.html | 510 -- .../doc/webserver/developer-manual/copyright.html | 298 - .../doc/webserver/developer-manual/cvs.html | 330 - .../webserver/developer-manual/documentation.html | 944 -- .../doc/webserver/developer-manual/index.html | 688 -- .../webserver/developer-manual/introduction.html | 199 - .../doc/webserver/developer-manual/newrelease.html | 1956 ---- .../doc/webserver/developer-manual/quickstart.html | 150 - .../doc/webserver/developer-manual/seealso.html | 405 - .../doc/webserver/developer-manual/testing.html | 259 - .../developer-manual/webserver-update.html | 260 - .../privoxy/doc/webserver/faq/configuration.html | 1797 ---- external/privoxy/doc/webserver/faq/contact.html | 510 -- external/privoxy/doc/webserver/faq/copyright.html | 301 - external/privoxy/doc/webserver/faq/general.html | 1076 --- external/privoxy/doc/webserver/faq/index.html | 999 --- .../privoxy/doc/webserver/faq/installation.html | 569 -- external/privoxy/doc/webserver/faq/misc.html | 1745 ---- external/privoxy/doc/webserver/faq/trouble.html | 1276 --- .../privoxy/doc/webserver/images/files-in-use.jpg | Bin 16587 -> 0 bytes .../privoxy/doc/webserver/images/proxy_setup.jpg | Bin 33275 -> 0 bytes external/privoxy/doc/webserver/index.html | 328 - .../doc/webserver/man-page/privoxy-man-page.html | 294 - external/privoxy/doc/webserver/p_doc.css | 66 - external/privoxy/doc/webserver/p_feedback.css | 9 - external/privoxy/doc/webserver/privoxy-index.html | 283 - external/privoxy/doc/webserver/privoxy.css | 69 - external/privoxy/doc/webserver/robots.txt | 17 - external/privoxy/doc/webserver/team/01stefanw.jpg | Bin 10327 -> 0 bytes .../privoxy/doc/webserver/team/01stefanw_t.jpg | Bin 1896 -> 0 bytes external/privoxy/doc/webserver/team/02jon.jpg | Bin 85888 -> 0 bytes external/privoxy/doc/webserver/team/02jon_t.jpg | Bin 2039 -> 0 bytes external/privoxy/doc/webserver/team/03andreas.jpg | Bin 42354 -> 0 bytes .../privoxy/doc/webserver/team/03andreas_t.jpg | Bin 1894 -> 0 bytes external/privoxy/doc/webserver/team/04rodney.jpg | Bin 57055 -> 0 bytes external/privoxy/doc/webserver/team/04rodney_t.jpg | Bin 2138 -> 0 bytes external/privoxy/doc/webserver/team/05david.jpg | Bin 62834 -> 0 bytes external/privoxy/doc/webserver/team/05david_t.jpg | Bin 3950 -> 0 bytes external/privoxy/doc/webserver/team/05member.jpg | Bin 932 -> 0 bytes external/privoxy/doc/webserver/team/05member_t.jpg | Bin 1049 -> 0 bytes external/privoxy/doc/webserver/team/06member.jpg | Bin 932 -> 0 bytes external/privoxy/doc/webserver/team/06member_t.jpg | Bin 1049 -> 0 bytes external/privoxy/doc/webserver/team/07member.jpg | Bin 932 -> 0 bytes external/privoxy/doc/webserver/team/07member_t.jpg | Bin 1049 -> 0 bytes external/privoxy/doc/webserver/team/08member.jpg | Bin 932 -> 0 bytes external/privoxy/doc/webserver/team/08member_t.jpg | Bin 1049 -> 0 bytes external/privoxy/doc/webserver/team/20member.jpg | Bin 932 -> 0 bytes external/privoxy/doc/webserver/team/20member_t.jpg | Bin 1049 -> 0 bytes external/privoxy/doc/webserver/team/index.html | 26 - .../doc/webserver/user-manual/actions-file.html | 8214 ----------------- .../doc/webserver/user-manual/appendix.html | 2187 ----- .../privoxy/doc/webserver/user-manual/config.html | 4121 --------- .../doc/webserver/user-manual/configuration.html | 514 -- .../privoxy/doc/webserver/user-manual/contact.html | 514 -- .../doc/webserver/user-manual/copyright.html | 424 - .../doc/webserver/user-manual/files-in-use.jpg | Bin 16587 -> 0 bytes .../doc/webserver/user-manual/filter-file.html | 1652 ---- .../privoxy/doc/webserver/user-manual/index.html | 963 -- .../doc/webserver/user-manual/installation.html | 1082 --- .../doc/webserver/user-manual/introduction.html | 292 - .../privoxy/doc/webserver/user-manual/proxy2.jpg | Bin 45431 -> 0 bytes .../doc/webserver/user-manual/proxy_setup.jpg | Bin 33275 -> 0 bytes .../doc/webserver/user-manual/quickstart.html | 943 -- .../privoxy/doc/webserver/user-manual/seealso.html | 418 - .../privoxy/doc/webserver/user-manual/startup.html | 902 -- .../doc/webserver/user-manual/templates.html | 321 - .../doc/webserver/user-manual/upgradersnote.html | 296 - .../doc/webserver/user-manual/whatsnew.html | 351 - external/privoxy/encode.c | 430 - external/privoxy/encode.h | 94 - external/privoxy/errlog.c | 1547 ---- external/privoxy/errlog.h | 215 - external/privoxy/filters.c | 2709 ------ external/privoxy/filters.h | 382 - external/privoxy/gateway.c | 1379 --- external/privoxy/gateway.h | 158 - external/privoxy/genclspec.sh | 55 - external/privoxy/icons/ico00001.ico | Bin 318 -> 0 bytes external/privoxy/icons/ico00002.ico | Bin 318 -> 0 bytes external/privoxy/icons/ico00003.ico | Bin 318 -> 0 bytes external/privoxy/icons/ico00004.ico | Bin 318 -> 0 bytes external/privoxy/icons/ico00005.ico | Bin 318 -> 0 bytes external/privoxy/icons/ico00006.ico | Bin 318 -> 0 bytes external/privoxy/icons/ico00007.ico | Bin 318 -> 0 bytes external/privoxy/icons/ico00008.ico | Bin 318 -> 0 bytes external/privoxy/icons/idle.ico | Bin 318 -> 0 bytes external/privoxy/icons/off.ico | Bin 318 -> 0 bytes external/privoxy/icons/os2.ico | Bin 2968 -> 0 bytes external/privoxy/icons/os20.ico | Bin 498 -> 0 bytes external/privoxy/icons/os21.ico | Bin 498 -> 0 bytes external/privoxy/icons/os22.ico | Bin 498 -> 0 bytes external/privoxy/icons/os23.ico | Bin 498 -> 0 bytes external/privoxy/icons/os24.ico | Bin 498 -> 0 bytes external/privoxy/icons/os25.ico | Bin 498 -> 0 bytes external/privoxy/icons/os26.ico | Bin 498 -> 0 bytes external/privoxy/icons/os27.ico | Bin 498 -> 0 bytes external/privoxy/icons/os28.ico | Bin 498 -> 0 bytes external/privoxy/icons/privoxy.ico | Bin 318 -> 0 bytes external/privoxy/install-sh | 251 - external/privoxy/jbsockets.c | 1054 --- external/privoxy/jbsockets.h | 149 - external/privoxy/jcc.c | 4486 ---------- external/privoxy/jcc.c.rej | 20 - external/privoxy/jcc.h | 261 - external/privoxy/list.c | 1229 --- external/privoxy/list.h | 181 - external/privoxy/loadcfg.c | 2041 ----- external/privoxy/loadcfg.h | 199 - external/privoxy/loaders.c | 1762 ---- external/privoxy/loaders.h | 250 - external/privoxy/match-all.action | 14 - external/privoxy/miscutil.c | 1907 ---- external/privoxy/miscutil.h | 259 - external/privoxy/mkinstalldirs | 40 - external/privoxy/parsers.c | 4740 ---------- external/privoxy/parsers.c.rej | 16 - external/privoxy/parsers.h | 323 - external/privoxy/pcre/Makefile.in | 219 - external/privoxy/pcre/RunTest.in | 148 - external/privoxy/pcre/chartables.c | 183 - external/privoxy/pcre/config.guess | 1121 --- external/privoxy/pcre/config.h | 5 - external/privoxy/pcre/config.in | 33 - external/privoxy/pcre/config.sub | 1232 --- external/privoxy/pcre/configure | 1568 ---- external/privoxy/pcre/configure.in | 85 - external/privoxy/pcre/dftables | Bin 22917 -> 0 bytes external/privoxy/pcre/dftables.c | 148 - external/privoxy/pcre/dll.mk | 60 - external/privoxy/pcre/doc/ChangeLog | 655 -- external/privoxy/pcre/doc/NON-UNIX-USE | 50 - external/privoxy/pcre/doc/Tech.Notes | 243 - external/privoxy/pcre/doc/authors | 6 - external/privoxy/pcre/doc/copying | 46 - external/privoxy/pcre/doc/news | 54 - external/privoxy/pcre/doc/pcre.3 | 1810 ---- external/privoxy/pcre/doc/pcre.html | 2397 ----- external/privoxy/pcre/doc/pcre.txt | 2125 ----- external/privoxy/pcre/doc/pcregrep.1 | 76 - external/privoxy/pcre/doc/pcregrep.html | 105 - external/privoxy/pcre/doc/pcregrep.txt | 87 - external/privoxy/pcre/doc/pcreposix.3 | 149 - external/privoxy/pcre/doc/pcreposix.html | 191 - external/privoxy/pcre/doc/pcreposix.txt | 159 - external/privoxy/pcre/doc/pcretest.txt | 246 - external/privoxy/pcre/doc/perltest.txt | 29 - external/privoxy/pcre/doc/readme | 270 - external/privoxy/pcre/get.c | 227 - external/privoxy/pcre/install | 185 - external/privoxy/pcre/install-sh | 251 - external/privoxy/pcre/internal.h | 381 - external/privoxy/pcre/licence | 46 - external/privoxy/pcre/ltconfig | 3078 ------- external/privoxy/pcre/ltmain.sh | 4012 --------- external/privoxy/pcre/maketables.c | 132 - external/privoxy/pcre/pcre-config | 59 - external/privoxy/pcre/pcre-config.in | 59 - external/privoxy/pcre/pcre.c | 5151 ----------- external/privoxy/pcre/pcre.def | 19 - external/privoxy/pcre/pcre.h | 110 - external/privoxy/pcre/pcre.in | 110 - external/privoxy/pcre/pcregrep.c | 228 - external/privoxy/pcre/pcreposix.c | 280 - external/privoxy/pcre/pcreposix.h | 88 - external/privoxy/pcre/pcretest.c | 1225 --- external/privoxy/pcre/study.c | 397 - external/privoxy/pcre/vc_dftables.dsp | 296 - external/privoxy/pcrs.c | 1317 --- external/privoxy/pcrs.h | 221 - external/privoxy/privoxy-generic.init | 182 - external/privoxy/privoxy-rh.spec | 1196 --- external/privoxy/privoxy-suse.spec | 556 -- external/privoxy/privoxy.1 | 216 - external/privoxy/privoxy.init | 276 - external/privoxy/privoxy.init.suse | 127 - external/privoxy/privoxy.logrotate | 107 - external/privoxy/project.h | 1885 ---- external/privoxy/regression-tests.action | 782 -- external/privoxy/slackware/rc.privoxy.orig | 109 - external/privoxy/ssplit.c | 218 - external/privoxy/ssplit.h | 84 - external/privoxy/strptime.h | 1003 --- external/privoxy/templates/blocked | 287 - external/privoxy/templates/cgi-error-404 | 149 - external/privoxy/templates/cgi-error-bad-param | 156 - external/privoxy/templates/cgi-error-disabled | 169 - external/privoxy/templates/cgi-error-file | 139 - .../privoxy/templates/cgi-error-file-read-only | 146 - external/privoxy/templates/cgi-error-modified | 157 - external/privoxy/templates/cgi-error-parse | 176 - external/privoxy/templates/cgi-style.css | 173 - external/privoxy/templates/connect-failed | 156 - external/privoxy/templates/default | 131 - .../privoxy/templates/edit-actions-add-url-form | 216 - external/privoxy/templates/edit-actions-for-url | 1425 --- .../privoxy/templates/edit-actions-for-url-filter | 40 - external/privoxy/templates/edit-actions-list | 412 - .../privoxy/templates/edit-actions-list-button | 49 - .../privoxy/templates/edit-actions-list-section | 125 - external/privoxy/templates/edit-actions-list-url | 95 - .../privoxy/templates/edit-actions-remove-url-form | 196 - external/privoxy/templates/edit-actions-url-form | 219 - external/privoxy/templates/forwarding-failed | 167 - external/privoxy/templates/mod-local-help | 12 - external/privoxy/templates/mod-support-and-service | 61 - external/privoxy/templates/mod-title | 4 - external/privoxy/templates/mod-unstable-warning | 7 - external/privoxy/templates/no-such-domain | 158 - external/privoxy/templates/show-request | 154 - external/privoxy/templates/show-status | 343 - external/privoxy/templates/show-status-file | 146 - external/privoxy/templates/show-url-info | 340 - external/privoxy/templates/show-version | 159 - external/privoxy/templates/toggle | 180 - external/privoxy/templates/toggle-mini | 91 - external/privoxy/templates/untrusted | 191 - external/privoxy/templates/url-info-osd.xml | 14 - external/privoxy/tools/privoxy-log-parser.pl | 2064 ----- external/privoxy/tools/privoxy-regression-test.pl | 1754 ---- external/privoxy/tools/url-pattern-translator.pl | 139 - external/privoxy/trust | 85 - external/privoxy/urlmatch.c | 1452 --- external/privoxy/urlmatch.h | 136 - external/privoxy/user.action | 169 - external/privoxy/user.filter | 75 - external/privoxy/utils/changelog2doc.pl | 66 - external/privoxy/utils/docbook2man/COPYING | 340 - .../privoxy/utils/docbook2man/docbook2man-spec.pl | 1229 --- .../utils/docbook2man/docbook2man-spec.pl.1 | 99 - external/privoxy/utils/filter2docs.pl | 81 - external/privoxy/utils/ldp_print/README | 80 - external/privoxy/utils/ldp_print/VERSION | 1 - .../privoxy/utils/ldp_print/fix_print_html.lib | 227 - external/privoxy/utils/ldp_print/ldp_print | 72 - external/privoxy/utils/prepare-configfile.pl | 50 - external/privoxy/vc_config_pthreads.h | 484 - external/privoxy/vc_config_winthreads.h | 675 -- external/privoxy/vc_console.dsp | 405 - external/privoxy/vc_privoxy.dsp | 488 - external/privoxy/vc_privoxy.dsw | 59 - external/privoxy/w32.rc | 343 - external/privoxy/w32log.c | 1480 ---- external/privoxy/w32log.h | 181 - external/privoxy/w32res.h | 194 - external/privoxy/w32svrapi.c | 952 -- external/privoxy/w32svrapi.h | 146 - external/privoxy/w32taskbar.c | 313 - external/privoxy/w32taskbar.h | 82 - external/privoxy/win32.c | 366 - external/privoxy/win32.h | 94 - 306 files changed, 0 insertions(+), 179609 deletions(-)
diff --git a/external/privoxy/AUTHORS b/external/privoxy/AUTHORS deleted file mode 100644 index 3f8a609..0000000 --- a/external/privoxy/AUTHORS +++ /dev/null @@ -1,116 +0,0 @@ - Authors of Privoxy v2.9.x and 3.x -=========================================================================== - -Current Privoxy Team: - - Fabian Keil, lead developer - David Schmidt, developer - - Hal Burgiss - Mark Miller - Gerry Murphy - Lee Rian - Roland Rosenfeld - Jörg Strohmayer - -Former Privoxy Team Members: - - Johny Agotnes - Rodrigo Barbosa - Moritz Barsnick - Ian Cummings - Brian Dessent - Jon Foster - Karsten Hopp - Alexander Lazic - Daniel Leite - Gábor Lipták - Adam Lock - Guy Laroche - Justin McMurtry - Andreas Oesterhelt - Haroon Rafique - Georg Sauthoff - Thomas Steudten - Rodney Stromlund - Sviatoslav Sviridov - Sarantis Paskalis - Stefan Waldherr - -Thanks to the many people who have tested Privoxy, reported bugs, provided -patches, made suggestions or contributed in some way. These include (in -alphabetical order): - - Ken Arromdee - Devin Bayer - Gergely Bor - Reiner Buehl - Andrew J. Caines - Clifford Caoile - Frédéric Crozat - Michael T. Davis - Mattes Dolak - Matthias Drochner - Peter E. - Florian Effenberger - Markus Elfring - Dean Gaudet - Stephen Gildea - Daniel Griscom - Felix Gröbert - Aaron Hamid - Darel Henman - Magnus Holmgren - Eric M. Hopper - Ralf Horstmann - Stefan Huehner - Peter Hyman - Derek Jennings - Petr Kadlec - David Laight - Bert van Leeuwen - Don Libes - Paul Lieverse - Toby Lyward - Wil Mahan - Jindrich Makovicka - David Mediavilla - Raphael Moll - Amuro Namie - Adam Piggott - Dan Price - Roberto Ragusa - Félix Rauch - Maynard Riley - Chung-chieh Shan - Spinor S. - Bart Schelstraete - Oliver Stoeneberg - Peter Thoenen - Martin Thomas - Bobby G. Vinyard - Jochen Voss - Glenn Washburn - Song Weijia - Jörg Weinmann - Darren Wiebe - Anduin Withers - Oliver Yeoh - Jamie Zawinski - -Privoxy is based in part on code originally developed by Junkbusters Corp. and -Anonymous Coders. - -Privoxy heavily relies on Philip Hazel's PCRE. - -The code to filter compressed content makes use of zlib which is written by -Jean-loup Gailly and Mark Adler. - -On systems that lack snprintf(), Privoxy is using a version written by Mark -Martinec. On systems that lack strptime(), Privoxy is using the one from the -GNU C Library written by Ulrich Drepper. - -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/external/privoxy/ChangeLog b/external/privoxy/ChangeLog deleted file mode 100644 index 54cc625..0000000 --- a/external/privoxy/ChangeLog +++ /dev/null @@ -1,717 +0,0 @@ --------------------------------------------------------------------- -ChangeLog for Privoxy --------------------------------------------------------------------- -*** Version 3.0.12 (UNRELEASED) *** - -- The socket-timeout option now also works on platforms whose - select() implementation modifies the timeout structure. - Previously the timeout was triggered even if the connection - didn't stall. Reported by cyberpatrol. -- The Connection: keep-alive code properly deals with files - larger than 2GB. Previously the connection was closed too - early. -- The content length for files above 2GB is logged correctly. -- The user-manual directive on the show-status page links to - the documentation location specified with the directive, - not to the Privoxy website. -- When running in daemon mode, Privoxy doesn't log anything - to the console unless there are errors before the logfile - has been opened. -- The show-status page prints warnings about invalid directives - on the same line as the directives themselves. -- Fixed several justified (but harmless) compiler warnings, - mostly on 64 bit platforms. -- The mingw32 version explicitly requests the default charset - to prevent display problems with some fonts available on more - recent Windows versions. Patch by Burberry. -- The mingw32 version uses the Privoxy icon in the alt-tab - windows. Patch by Burberry. -- The timestamp and the thread id is omitted in the "Fatal error" - message box on mingw32. -- Fixed two related mingw32-only buffer overflows. Triggering - them required control over the configuration file, therefore - this isn't seen as a security issue. -- In verbose mode, or if the new option --show-skipped-tests - is used, Privoxy-Regression-Test logs skipped tests and the - skip reason. - -*** Version 3.0.11 *** - -- On most platforms, outgoing connections can be kept alive and - reused if the server supports it. Whether or not this improves - things depends on the connection. -- When dropping privileges, membership in supplementary groups - is given up as well. Not doing that can lead to Privoxy running - with more rights than necessary and violates the principle of - least privilege. Users of the --user option are advised to update. - Thanks to Matthias Drochner for reporting the problem, - providing the initial patch and testing the final version. -- Passing invalid users or groups with the --user option - didn't lead to program exit. Regression introduced in 3.0.7. -- The match all section has been moved from default.action - to a new file called match-all.action. As a result the - default.action no longer needs to be touched by the user - and can be safely overwritten by updates. -- The standard.action file has been removed. Its content - is now part of the default.action file. -- In some situations the logged content length was slightly too low. -- Crunched requests are logged with their own log level. - If you used "debug 1" in the past, you'll probably want - to additionally enable "debug 1024", otherwise only passed - requests will be logged. If you only care about crunched - requests, simply replace "debug 1" with "debug 1024". -- The crunch reason has been moved to the beginning of the - crunch message. For HTTP URLs, the protocol is logged as well. -- Log messages are shortened by printing the thread id on its - own (as opposed to putting it inside the string "Privoxy()"). -- The config option socket-timeout has been added to control - the time Privoxy waits for data to arrive on a socket. -- Support for remote toggling is controlled by the configure - option --disable-toggle only. In previous versions it also - depended on the action editor and thus configuring with the - --disable-editor option would disable remote toggling support - as well. -- Requests with invalid HTTP versions are rejected. -- The template symbol @date@ can be used to include a date(1)-like - time string. Initial patch submitted by Endre Szabo. -- Responses from shoutcast servers are accepted again. - Problem reported and fix suggested by Stefan. -- The hide-forwarded-for-headers action has been replaced with - the change-x-forwarded-for{} action which can also be used to - add X-Forwarded-For headers. The latter functionality already - existed in Privoxy versions prior to 3.0.7 but has been removed - as it was often used unintentionally (by not using the - hide-forwarded-for-headers action). -- A "clear log" view option was added to the mingw32 version - to clear out all of the lines in the Privoxy log window. - Based on a patch submitted by T Ford. -- The mingw32 version uses "critical sections" now, which prevents - log message corruption under load. As a side effect, the - "no thread-safe PRNG" warning could be removed as well. -- The mingw32 version's task bar icon is crossed out and - the color changed to gray if Privoxy is toggled off. - -*** Version 3.0.10 *** - -- Ordinary configuration file changes no longer cause program - termination on OS/2 if the name of the logfile hasn't been - changed as well. This regression probably crept in with the - logging improvements in 3.0.7. Reported by Maynard. -- The img-reorder filter is less likely to mess up JavaScript code in - img tags. Problem and solution reported by Glenn Washburn in #2014552. -- The source tar ball now includes Privoxy-Log-Parser, - a syntax-highlighter for Privoxy logs. For fancy screenshots see: - http://www.fabiankeil.de/sourcecode/privoxy-log-parser/ - Documentation is available through perldoc(1). - -*** Version 3.0.9 Beta *** - -- Added SOCKS5 support (with address resolution done by - the SOCKS5 server). Patch provided by Eric M. Hopper. -- The "blocked" CGI pages include a block reason that was - provided as argument to the last-applying block action. -- If enable-edit-actions is disabled (the default since 3.0.7 beta) - the show-status page hides the edit buttons and explains why. - Previously the user would get the "this feature has been disabled" - message after using the edit button. -- Forbidden CONNECT requests are treated like blocks by default. - The now-pointless treat-forbidden-connects-like-blocks action - has been removed. -- Not enabling limit-connect now allows CONNECT requests to all ports. - In previous versions it would only allow CONNECT requests to port 443. - Use +limit-connect{443} if you think you need the old default behaviour. -- The CGI editor gets turned off after three edit requests with invalid - file modification timestamps. This makes life harder for attackers - who can leverage browser bugs to send fake Referers and intend to - brute-force edit URLs. -- Action settings for multiple patterns in the same section are - shared in memory. As a result these sections take up less space - (and are loaded slightly faster). Problem reported by Franz Schwartau. -- Linear white space in HTTP headers will be normalized to single - spaces before parsing the header's content, headers split across - multiple lines get merged first. This should prevent problems like: - * letting the session-cookies-only action slip - some Cookies through unmodified, - * only suppressing the first line of a header, - thus creating an invalid one, and - * to incorrectly block headers with valid timestamps - that weren't properly recognized. - Headers that could trigger these problems are unlikely to appear - in "normal" web traffic, but could be intentionally generated to - fool some of Privoxy's header parsers. -- Host information is gathered outside the main thread so it's less - likely to delay other incoming connections if the host is misconfigured. -- New config option "hostname" to use a hostname other than - the one returned by the operating system. Useful to speed-up responses - for CGI requests on misconfigured systems. Requested by Max Khon. -- The CGI editor supports the "disable all filters of this type" - directives "-client-header-filter", "-server-header-filter", - "-client-header-tagger" and "-server-header-tagger". -- Fixed false-positives with the link-by-url filter and URLs that - contain the pattern "/jump/". -- The less-download-windows filter no longer messes - "Content-Type: application/x-shockwave-flash" headers up. -- In the show-url-info page's "Final results" section active and - inactive actions are listed separately. Patch provided by Lee. -- The GNUmakefile supports the DESTDIR variable. Patch for - the install target submitted by Radoslaw Zielinski. -- Embedding the content of configuration files in the show-status - page is significantly faster now. For a largish action file (1 MB) - a speedup of about 2450 times has been measured. This is mostly - interesting if you are using large action files or regularly use - Privoxy-Regression-Test while running Privoxy through Valgrind, - for stock configuration files it doesn't really matter. -- If zlib support is unavailable and there are content - filters active but the prevent-compression action is disabled, - the show-url-info page includes a warning that compression - might prevent filtering. -- The show-url-info page provides an OpenSearch Description that - allows to access the page through browser search plugins. -- Custom client-header filters that rewrite the request line - incorrectly no longer cause Privoxy to crash. Reported by din_a4. -- The obsolete kill-popups action has been removed as the - PCRS-based popup filters can do the same and are slightly - less unreliable. -- The inspect-jpegs action has been removed. -- The send-wafer and send-vanilla-wafer actions have been removed. - They weren't particular useful and their behaviour could be emulated - with add-header anyway. -- Privoxy-Regression-Test has been significantly improved. -- Most sections in the default.action file contain tests for - Privoxy-Regression-Test to verify that they are working as intended. -- Parts of Privoxy have been refactored to increase maintainability. -- Building with zlib (if available) is done by default. - -*** Version 3.0.8 *** - -- Fixed a small memory leak when listen-address only specifies the port. -- The source tar balls now include Privoxy-Regression-Test which - (upon other things) can be used to automatically detect some - packaging problems. Packagers are welcome to give it a try. -- Reverted a change in 3.0.7 that caused path patterns to be checked - even if the host pattern match already failed. While this doesn't - noticeable affect the performance, it makes it less likely to run - out of stack space with overly-complex path patterns the user might - have added. -- Updated the msn, yahoo and google filters to work as advertised again. -- The warning message shown by the show-status CGI page is easier to - understand. Previously it wasn't clear that the error message - is shown below the invalid directive. (Reported by Lee) -- When regenerating Content-Disposition headers the more common - spelling is used for the name. Previously it was written without caps. -- Less confusing log message if the content type isn't overwritten - because force-text-type wasn't used but the old type doesn't look - like content that would be filtered normally. -- Better log messages if the user tries to execute filters that - don't exist. -- Treat the non-standard Request-Range headers like standard range - headers and suppress them if content filtering is enabled. -- Prevent the log messages for CONNECT requests to unacceptable - ports from printing the limit-connect argument as [null] if - limit-connect hasn't been explicitly enabled. -- Don't disable the mingw32 log window if the logfile directive - isn't used. While it was an intentional change in 3.0.7 at least - one user perceived it as a regression and the same effect can - be achieved by disabling all debug directives. -- Fixed two minor problems related to the win32 build process: a css - file was not being in the installer and the trustfile comment in the - config.txt referenced a nonexisting file -- Minor documentation fixes. - -*** Version 3.0.7 Beta *** - -- Added zlib support to filter content with gzip and deflate - encoding. (Patch provided by Wil Mahan) -- Dedicated filters and actions are used for header filtering. - "filter-client-headers" and "filter-client-headers" are no longer - supported, use server-header-filter{} and client-header-filter{} - instead. -- Tags can be used to change actions based on HTTP headers. -- New server-header filter: less-download-windows. -- New client-header taggers: css-requests, image-requests, - client-ip-address, http-method, allow-post, complete-url, - user-agent and privoxy-control. -- New server-header taggers: content-type and privoxy-control. -- The forward-override{} action allows to change the forwarding - settings through the action files, for example based on client - headers like the User-Agent, or the request origin. -- Socks errors are no longer handled by the CGI page for - DNS resolution failures. -- CGI pages use favicons to signal whether they are error - or control pages. This is useful if you rely heavily on - browser tabs. -- The show-url-info CGI page shows the forwarding settings. -- "Crunch!" log messages (used when Privoxy answers requests - by itself) now also contain the reason. -- Allow to rewrite the request destination behind the client's back. -- Fix socks requests on big-endian platforms. Patch provided by Song Weijia. -- Fixes possible deadlocks and crashes on OpenBSD. - Patch provided by Ralf Horstmann. -- The CGI action editor allows to edit actionfiles with previously - forbidden characters like dots. -- New trust entries are saved with a comment that contains the - trusted referring URL (Suggested by Daniel Griscom). -- Filter descriptions are HTML encoded automatically. -- New config option "split-large-forms" to work - around a browser bug that caused IE6 and IE7 to ignore - the Submit button on the edit-actions-for-url CGI page. -- New config option "allow-cgi-request-crunching" to allow - requests for Privoxy's CGI pages to be blocked, redirected - or (un)trusted like ordinary requests. -- Empty filter files no longer interrupt the filtering process - prematurely and are correctly listed on the show-status CGI page. -- New config option "accept-intercepted-requests" to combine - Privoxy with any packet filter to build an intercepting proxy - for HTTP/1.1 requests (and for HTTP/1.0 requests with Host header set). -- fast-redirects{} catch redirects to https URLs as well. -- redirect{s@foo@bar@} can be used to redirect to a rewritten - version of the original URL. -- Trap unsupported gopher proxy requests. -- Fixed a bug in the User Manual delivery on Windows - (mingw32 only). Images now show up correctly and HTML - pages are no longer padded with garbage data. -- Fixed several minor memory leaks, most of them discovered with Valgrind. -- Only unlink the pidfile if it's actually used. -- Retries after connection problems with forced requests - aren't blocked again. -- On Unix SIGABRT causes a core dump as expected and is no - longer treated as normal shutdown signal. -- The "access denied" CGI page is more descriptive and - allows retries to circumvent the referrer check. -- Updated PCRS to handle unexpected PCRE errors properly. - Fixed crashes that could occur if Privoxy was build - with external PCRE versions newer than Privoxy's internal - one. (Reported by Chung-chieh Shan) -- Fixed crashes with null bytes in PCRS replacement strings - (Patch provided by Felix Gröbert). -- Fixed crashes with header time randomization on mingw32. -- The CGI style sheet is no longer delivered if the referring - page isn't a Privoxy CGI page. This prevents a JavaScript-based - Privoxy detection "attack". Note that detecting Privoxy is - still possible through other ways and Privoxy was never intended - to be invisible anyway. -- Added support for AmigaOS 4, fixed build for AmigaOS 3.x. -- The show-url-info CGI page displays a warning if Privoxy - is currently toggled off. -- The show-status CGI page suppresses the edit button - for action files if Privoxy has no write access. -- Most CGI error pages react properly to HEAD requests. -- Requests with RFC 3253 HTTP methods (used by Subversion) - are accepted. (Patch provided by Petr Kadlec) -- New config option "templdir" to change the location - of the CGI templates to make sure customized templates - aren't "updated". -- Better handling of "HTTP/1.1 100 Continue" responses. -- The background of the PNG pattern is transparent. -- Fixed XML syntax errors caused by banners-by-size and banners-by-url. -- Fixed crashes and possible action file corruptions - when lines containing hashes are written through the CGI editor. -- Supports dynamic filters which can contain variables. -- Supports tags to change the actions based on client or server headers. -- Incorrect actions are logged before program termination. -- The "actionsfile" syntax in the configuration file is consistent - with the rest of the configuration options and requires the - whole file name. This is an incompatible change, if you use - an old configuration file you might have to append ".action" - to your "actionsfile" directives. -- With the configuration file option "enforce-blocks" the - "go there anyway" mechanism can be disabled without recompiling - Privoxy. -- More precise error messages in case of incorrect acl syntax. -- Logs a warning if filtering is enabled but impossible due - to lack of zlib support or use of the prevent-compression action. -- Less noisy handling of Cookie:" and "Connection:" headers. -- Improved error messages in case of connection problems. -- Fix a command-line-parsing bug that was introduced before 3.0.5 - beta and caused Privoxy to treat the last argument as configuration - file if no configuration file was specified. -- Treat unknown command line options as fatal errors instead - of silently ignoring them. -- Use string functions with length checks more often. -- Don't log CONNECT requests twice. -- Allow to log the source address for ACL-related connection drops. -- Don't ignore applying filters if the server didn't - specify a Content-Type. Bug reported by Amuro Namie. -- Rejected CONNECT requests are logged with log level info - (enabled by default) and the reason for the block. -- New command line option "--pre-chroot-nslookup hostname" to - intialize the resolver library before chroot'ing. On some systems this - reduces the number of files that must be copied into the chroot tree. - (Patch provided by Stephen Gildea) -- Fix a long-standing memory corruption bug that could cause - Privoxy to overwrite a single byte in memory it didn't explicitly - allocate (but that probably was allocated anyway due to bucket size). -- Send template-based CGI pages as HTTP/1.1 unless the client - asked for HTTP/1.0. -- Let the first line in connection established responses - end in \r\n as required by RFC1945. Reported by Bert van Leeuwen. -- If no log file has been specified, disable logging instead of logging - to stderr. -- Don't block stderr when in daemon mode. -- Ignore missing zero-chunks when filtering chunk-encoded content. - Earlier Privoxy versions would buffer and then forward the content - unmodified which caused some browsers to simply show empty pages. -- Fix double free in cgi_edit_actions_list(). Reported by Venustech AD-LAB. -- The code to add X-Forwarded-For headers when the hide-forwarded-for-headers - action isn't being used has been removed. -- Fixed trustfile feature which previously didn't work without FEATURE_TOGGLE. - Reported by Lee. -- Minor code clean-ups, filter and action file updates. - (Some of them reported by Davide Alberani, Markus Elfring, - Stefan Huehner and Adam Piggott) - -*** Version 3.0.6 *** - -- New content filters: no-ping, google, msn, yahoo and blogspot. -- New header filters: x-httpd-php-to-html, html-to-xml, xml-to-html - and hide-tor-exit-notation. -- The special header "X-Filter: No" now disables header filtering as well. -- Improved the filters img-reorder, js-annoyances, webbugs, - banners-by-size, banners-by-link and ie-exploits to make them - less likely to break anything. -- Removed outdated URL patterns in default.action and added new ones. -- Added redirection from http://p.p/user-manual to http://p.p/user-manual/ -- Changed webinterface default values for hide-user-agent, hide-referrer - and set-image-blocker. - -*** Version 3.0.5 Beta *** - -- Windows version can be installed/started as a service. -- Windows icon stays blue when Privoxy is idle, green when busy. -- Integrated Fabian Keil's extensive patch. See: - http://www.fabiankeil.de/sourcecode/privoxy/. Includes the - following new or significantly improved actions (among many - other improvements): - - content-type-overwrite{} - crunch-client-header{string} - crunch-if-none-match - crunch-server-header{string} - fast-redirects{check-decoded-url} - filter-client-headers - filter-server-headers - force-text-mode - handle-as-empty-document - hide-accept-language{} - hide-content-disposition{} - hide-if-modified-since - hide-referrer{conditional-block} - overwrite-last-modified{} - redirect{URL} - treat-forbidden-connects-like-blocks - -- Standard-compliant clients are prevented from displaying cached - copies of Privoxy's error messages after the cause of the problem - has gone. -- Improved DNS error handling. -- Multiple filter files can now be specified in config. -- Added jpeg filtering to defend against MS jpeg vulnerability MS04-028 - with the new inspect-jpegs action. -- Removed the "arbitrary" 1000 filter limit - addresses tracker #911950 -- Thanks to Jindrich Makovicka for a race condition fix for the log - file. The race condition remains for non-pthread implementations. - Reference patch #1175720. Various other logging enhancements. -- A pile of assorted bug fixes, memory leaks, enhancements, etc. -- Moved Actions file reporting mechanism to SF tracker. -- Two new options for config: enable-remote-http-toggle and - forwarded-connect-retries. -- Trap unsupported FTP requests. -- Let text/xml be filtered. -- Numerous updates to default.action -- Increase the compiled in limit of trusted referrers from 64 to 512 - (for trustfile users). - -*** Version 3.0.3 *** - -- Fixed yet another two memory leaks. Process growth seems stopped now. -- Further tightened security against malicious toggle-off links. -- Excluded text/plain MIME types from filtering. This fixes a - couple of client-crashing, download corruption and - Privoxy performance issues, whose root cause lies in - web servers labelling content of unknown type as text/plain. -- Assorted fixes for POSIX compliance, signal handling, graceful - termination, compiler warnings, OSX support, Win32 systray, - error logging, hostname wildcards, correct detection of NetBSD. -- Workarounds for client (iTunes etc) and server (PHP < 4.2.3) bugs - including the notorious "blank page" problem. -- Various filter improvements; most notably the unsolicited-popups - filter became less destructive -- Major revamp of the actions file - -*** Version 3.0.2 *** - -- Fixed two memory leaks, one serious -- Fixed bug in pcrs which could cause crashes with user-defined filters -- Fixed bug in domain name matching -- Assorted small fixes (Win32 menu, CGI URL editor, ..) -- Added basic support for the OPTIONS and TRACE http methods -- Added workaround for Bug in Mac OSX that made Privoxy crash occasionally -- Refined the default action file through >400 items of user feedback -- Filter changes: - - Assorted refinements, optimizations and fixes in the js-annoyances, - img-reorder, banners-by-size, banners-by-link, webbugs, refresh-tags, - html-annoyances, content-cookies and fun filters - - Replaced filter "popups" by choice between two modes: - - "unsolicited-popups" tries to catch only the unsolicited ones - - "all-popups" tries to kill them all (as before) - - New filter "tiny-textforms" Help those tiny or hard-wrap textareas. - - New filter "jumping-windows" that prevents windows from resizing - and moving themselves - - New filter "demoronizer" which fixes MS's abuse of std charsets - (common cases anyway). - - Replaced "nimda" with more general "ie-exploits" filter in which - all filters for exploits shall be collected -- Improved cookie logging -- Rewrote make install target. Added uninstall and install-strip - targets. -- Fixed a potential (application-level, NOT OS-level!) security - problem involving remote toggling and action file manipulation - by mailicious websites. -- Added ability to chroot (thanks to Sviatoslav Sviridov) -- Added more action aliases for prehistoric action names -- Add Slackware support to Makefile. - -*** Version 3.0 *** - -- Fixed Windows startmenu items, log window and tray icon menus. -- Added warning for bogus install target -- Added quicktime-kioskmode filter and improved frameset-borders -- Updated default.action based on latest feedback -- New PDF doc build process -- Add a user contrib module to cvs: - http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/contrib/ - -*** Version 2.9.18 *** - -- Added workaround for IE bug that broke CGI interface -- Bugfix: String actions now reliably editable through CGI interface -- Three filters fixed (again!) -- Assorted small fixes and doc enhancements - -*** Version 2.9.16 *** - -- Major revamp of default.action to get rid of years of cruft. -- Same for default.filter -- Re-design and major improvements to the CGI editor interface. -- Address spurious 'out of memory' error due to incorrect file permissions. -- Impose buffer limits while reading client and server headers. -- Better memory and CPU optimization. -- Add Conectiva Linux package. -- user-manual directive added to config for help links from within CGI - editor. -- Multiple actions files can now be specified in config. -- Actions files are changed to: default.action, standard.action, and - user.action. user.action is for personal/local configuration. -- The usual many small and miscellaneous bug and security fixes. - -*** Version 2.9.14 Beta *** - -- Fix Solaris compile problem (gateway.h and filters.h) -- Makefile fixes for Solaris, FreeBSD (?) -- Fix build failure where certain features were disabled. -- 'blocked-compact' template is removed. Various CGI improvements, - including an adaptive 'blocked' template. -- Various tweaks for actions file to get ready for stable 3.0 -- Included a 'Bookmarklet' and PHP scripts for reporting actions file - problems via web interface at privoxy.org. Accessed via internal CGIs. -- Include cgi-style.css for templates. -- #include mechansim for common text in templates -- Various other minor fixes. - -*** 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. -- RPM spec file make over. - - -*** 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-2008 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/external/privoxy/GNUmakefile.in b/external/privoxy/GNUmakefile.in deleted file mode 100644 index 481633c..0000000 --- a/external/privoxy/GNUmakefile.in +++ /dev/null @@ -1,2156 +0,0 @@ -# Note: Makefile is built automatically from Makefile.in -# -# $Id: GNUmakefile.in,v 1.180 2009/02/28 08:28:14 fabiankeil Exp $ -# -# Written by and Copyright (C) 2001 - 2008 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. -# - -############################################################################# -# Set make command correctly -############################################################################# -@SET_MAKE@ - -############################################################################# -# 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) -RPM_VERSION = $(VERSION) -RPM_PACKAGEV = "" -SNAPVERSION = $(RPM_VERSION)-$(shell date "+%Y%m%d") - - -############################################################################# -# "make install" directories and variables -############################################################################# - -#User Group paras -USER = @USER@ -GROUP = @GROUP@ - -datarootdir = @datarootdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ -CONF_BASE = @sysconfdir@ -SBIN_DEST = @sbindir@ -MAN_DIR = @mandir@ -MAN_DEST = $(MAN_DIR)/man1 -SHARE_DEST = @datadir@ -DOC_DEST = $(SHARE_DEST)/doc/privoxy -VAR_DEST = @localstatedir@ -LOGS_DEST = $(VAR_DEST)/log/privoxy -PIDS_DEST = $(VAR_DEST)/run - -# if $prefix = /usr/local then the default CONFDEST change from -# CONF_DEST = $(CONF_BASE) to CONF_DEST = $(CONF_BASE)/privoxy -# by the target rule CONF_DEST -# -# also if the $prefix is /usr/local and there is no -# $(SHARE_DEST)/doc, it checks for $prefix/doc and installs there -# instead in this situation -# -# finally if $prefix=/usr/local and VAR_DEST=$prefix/var it -# changes this to /var for storing the logs and pidfile - -# used in source dir only, the install goes to $share_dest/doc/privoxy -DOK_WEB = doc/webserver/ - -# Install usage should be compatible with install-sh. -INSTALL = @INSTALL@ -# Binaries -BIN_MODE = 0755 -# Support files, docs, etc. -RA_MODE = 0664 -# Directory -DIR_MODE = 0755 -# Files daemon writes to. -RWD_MODE = 0660 -INSTALL_P = -m $(BIN_MODE) -INSTALL_T = -m $(RA_MODE) -INSTALL_D = -m $(DIR_MODE) -d -INSTALL_R = -m $(RWD_MODE) - -# install options for superuser install -#INSTALL_S = -g @GROUP@ -o @USER@ - -############################################################################# -# Build tools -############################################################################# - -PROGRAM = privoxy@EXEEXT@ -CC = @CC@ -ECHO = echo -GZIP_PROG = gzip - -# id -u is not universal. FIXME: need to set from configure. Breaks on -# Solaris. -#ID = id -u -ID = id -LD = @CC@ -RM = rm -f -CP = cp -f -RMDIR = rmdir -MKDIR = ./mkinstalldirs -STRIP_PROG = strip -SED = sed -GREP = grep -CAT = cat -RPM = rpm -RPMBUILD = rpmbuild -MV = mv -TAR = tar -LN = ln -TOUCH = touch -KILL = kill -CHMOD = chmod -CHOWN = chown -CHGRP = chgrp -GROUPS = groups -WDUMP = @WDUMP@ -dump -JADECAT = @JADECAT@ -JADEBIN = @JADEBIN@ -DB = $(JADEBIN) $(JADECAT) -ihtml -t sgml -D.. -d ldp.dsl#html -DB2HTML = @DB2HTML@ -MAN2HTML = @MAN2HTML@ -G2H_CMD = groff -mandoc -Thtml -TARGET_OS = @host@ -PERL = perl -DOC_DIR = doc/source -DOC_TMP = $(DOC_DIR)/tmp -DOC_STATUS = @DOC_STATUS@ - -# 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/' -CVSROOT = :pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa -#TMPDIR := $(shell mktemp -d /tmp/$(PROGRAM).XXXXXX) - -############################################################################# -# Setup for make distribution rh and suse for now -############################################################################# - -TAR_ARCH = /tmp/privoxy-$(RPM_VERSION).tar.gz -RPM_BASE = @RPM_BASE@ - -############################################################################# -# We include these files in our distributions -############################################################################# -CONFIGS = config trust default.action match-all.action user.action default.filter user.filter -# take care that no CVS .cvsignore or other crappy files -# are included here -# and escape every '#' in the find. doh. -CONFIG_FILES = $(CONFIGS) \ - `find templates/ -type f | grep -v "CVS" | grep -v ".#" | grep -v ".*~" | grep -v ".cvsignore" | grep -v "TAGS"` - -DOC_FILES = AUTHORS LICENSE README ChangeLog INSTALL \ - `find doc/webserver/ -name "*.html" | grep -v "(webserver|team)/index.html"` \ - `find doc/webserver/ -name "*.css"` \ - privoxy.1 - -############################################################################# -# 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 \ - 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 - -W32_SRC = @WIN_ONLY@w32log.c w32taskbar.c win32.c w32svrapi.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 w32svrapi.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 (maybe because dynamically linked pcreposix): -REGEX_SRC = -@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 = @LDFLAGS@ $(DEBUG_CFLAGS) $(SPECIAL_CFLAGS) - - -############################################################################# -# Build section. -# -# There should NOT be any targets above this line. -############################################################################# -all: $(PROGRAM) default.action - - -############################################################################# -# 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 conectiva-spec conectiva-dist conectiva-upload CONF_DEST LOG_DEST \ -PID_DEST check_doc install-strip uninstall GROUP_T - -############################################################################# -# Define this explicitly because Solaris is broken! -############################################################################# -%.o: %.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ - - -############################################################################# -# Strip master copy comments from default.action: -############################################################################# -default.action: default.action.master - $(GREP) -v '^#MASTER#' $< > $@ - -############################################################################# -# Win32 config files -############################################################################# - -inifiles: $(W32_INIS) - -config.txt: config - $(SED) -e 's!\trustfile trust!trustfile trust.txt!' \ - -e 's!\logfile logfile!logfile privoxy.log!' \ - -e 's!#Win32-only: !!' \ - < $< | \ - $(DOSFILTER) > $@ - # LF to CRLF in default.action - $(DOSFILTER) <default.action >default.action.txt && mv default.action.txt default.action - # LF to CRLF in default.filter - $(DOSFILTER) <default.filter >default.filter.txt && mv default.filter.txt default.filter - -trust.txt: trust - $(DOSFILTER) < $< > $@ - -############################################################################# -# Pre-dist check: -############################################################################# -dist-check: - @if [ -d CVS ]; then \ - $(ECHO) "***************************************************"; \ - $(ECHO) "*** ***"; \ - $(ECHO) "*** WARNING ***"; \ - $(ECHO) "*** ***"; \ - $(ECHO) "*** The presence of a CVS subdirectory suggests ***"; \ - $(ECHO) "*** that you are trying to build a distribution ***"; \ - $(ECHO) "*** package based on a checked out, not an ***"; \ - $(ECHO) "*** exported copy of the source tree. Please ***"; \ - $(ECHO) "*** see "Releasing a new version" in the ***"; \ - $(ECHO) "*** developer manual. ***"; \ - $(ECHO) "*** ***"; \ - $(ECHO) "***************************************************"; \ - $(ECHO) "Type "yes i am sure" if you are sure that you"; \ - $(ECHO) -n "really want to proceed: "; \ - read answer; \ - if [ "$$answer" != "yes i am sure" ]; then exit 1; fi \ - fi; - - -############################################################################# -# create tar.gz from CVS: -# This make-target is usually called through 'create-archive'. If you -# run 'make create-snapshot' without setting SNAPVERSION, you'll get a -# tar.gz with the current date in the name and as a releasenumber in the -# spec-file. But the main usage is to run it as follows (Red Hat example): -# make SNAPVERSION=1.6x create-snapshot -# This creates a tar.gz and spec-file for a Red Hat 6.x version. -############################################################################# -create-snapshot: - @tag=`cvs -d $(CVSROOT) status Makefile | awk ' /Sticky Tag/ { print $$3 } '` 2> /dev/null; \ - [ x"$$tag" = x"(none)" ] && tag=HEAD; \ - echo "*** Creating package from $$tag!"; \ - TMPDIR=$(shell mktemp -d /tmp/$(PROGRAM).XXXXXX); \ - cd $$TMPDIR ; cvs -Q -d $(CVSROOT) export -r $$tag current || echo "Um... export aborted."; \ - cd $$TMPDIR/current; \ - TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \ - if $(SED) -e 's/^(Version:).*/\1 $(RPM_VERSION)/g' \ - -e 's/^(Release:).*/\1 $(SNAPVERSION)/g' \ - privoxy-rh.spec > $$TMPFILE ; then \ - $(MV) -f $$TMPFILE privoxy-rh.spec; \ - else \ - $(ECHO) "Could not set version info in specfile."; \ - exit 1;\ - fi;\ - if $(SED) -e 's/^(Version:).*/\1 $(RPM_VERSION)/g' \ - -e 's/^(Release:).*/\1 $(SNAPVERSION)/g' \ - privoxy-suse.spec > $$TMPFILE ; then \ - $(MV) -f $$TMPFILE privoxy-suse.spec; \ - else \ - $(ECHO) "Could not set version info in specfile."; \ - exit 1;\ - fi; \ - $(RM) $$TMPFILE; \ - cd $$TMPDIR/current; \ - $(TAR) --exclude ".cvsignore" --exclude "CVS" \ - -czf /tmp/$(PROGRAM)-$(VERSION).tar.gz .; \ - $(RM) -rf $$TMPDIR - @echo "Resulting file is /tmp/$(PROGRAM)-$(VERSION).tar.gz" - - -############################################################################# -# looks at the version of Makefile and exports a corresponding source-tree -# example: if the Makefile has the sticky tag v_2_9_13, you'll get -# privoxy-*-2.4.13.tar.gz. Two different tar files will be written, one for -# Red Hat and one for SuSe (different spec-files) -############################################################################# -create-archive: - make SNAPVERSION=$(SNAPVERSION) create-snapshot - -############################################################################# -# RPM specifice stuff (SuSE or Redhat, ..) -############################################################################# -rpm-stuff: dist-check clean clobber - 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; \ - -check-release: - @if [ "$(RPM_PACKAGEV)" = "" ]; then \ - echo ; \ - echo " ERROR: NO RPM_PACKAGEV VALUE"; \ - echo " No value given for RPM_PACKAGEV. Please use:"; \ - echo " make dist-upload RPM_PACKAGEV=release"; \ - echo " where "release" is the release number you want to and"; \ - echo " where "dist" is the name of the distro (redhat or suse)"; \ - echo ; \ - echo " Ex: make redhat-upload RPM_PACKAGEV=1"; \ - echo ""; \ - echo "ATTENTION: If your distribution use a specific tag on the"; \ - echo " release field (like "cl" for Conectiva, and"; \ - echo " "mdk" for Mandrake), DO NOT put it on the value"; \ - echo " given to RPM_PACKAGEV. It will be added automaticaly."; \ - echo " Do it like you would do for a redhat package,"; \ - echo " (i.e. just the number)."; \ - echo ; \ - exit 1; \ - fi - - -############################################################################# -# Create Conectiva specfile from RedHat specfile -############################################################################# -conectiva-spec: - $(RM) privoxy-cl.spec - chmod a+x genclspec.sh - ./genclspec.sh - -############################################################################# -# Conectiva distribution for x86 -############################################################################# -conectiva-dist: rpm-stuff conectiva-spec - - $(TAR) --exclude ".cvsignore" --exclude "CVS" --exclude "privoxy-suse.spec" --exclude "privoxy-rh.spec" --exclude "PACKAGERS" -czf $(TAR_ARCH) . - $(RPMBUILD) --clean -ta $(TAR_ARCH) - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - -conectiva-upload: check-release - make redhat-upload RPM_PACKAGEV=$(RPM_PACKAGEV)cl - -############################################################################# -# redhat distribution alpha and x86 -############################################################################# -redhat-dist: rpm-stuff - echo $(CONFIG_FILES) - $(TAR) --exclude ".cvsignore" --exclude "CVS" --exclude "privoxy-suse.spec" --exclude "privoxy-cl.spec" --exclude "PACKAGERS" -czf $(TAR_ARCH) . - $(RPMBUILD) --clean -ta $(TAR_ARCH) - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - -# For testing build issues only! Use redhat-dist for official releases. -redhat-test: - echo $(CONFIG_FILES) - $(TAR) --exclude ".cvsignore" --exclude "CVS" --exclude "privoxy-suse.spec" --exclude "privoxy-cl.spec" --exclude "PACKAGERS" -czf $(TAR_ARCH) . - $(RPMBUILD) --clean -tb $(TAR_ARCH) - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - @echo "WARNING: This target is only for testing. Use redhat-dist for releases!!!" - -# anonymously ncftps the rpms to sourceforge -redhat-upload: check-release - 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) https://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 - - -############################################################################# -# Creates a Red Hat sourcepackage from CVS (not from the current sources -# on disk) -############################################################################# -redhat-srpm: - make create-archive - $(RPMBUILD) -ts --nodeps $(PROGRAM)-$(VERSION).tar.gz - - -############################################################################# -# suse distribution. works fine. no need to be root. -############################################################################# -suse-dist: rpm-stuff -# TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \ -# if $(SED) -e 's/^(Version:).*/\1 $(RPM_VERSION)/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 ".cvsignore" --exclude "CVS" --exclude "privoxy-rh.spec" --exclude "privoxy-cl.spec" --exclude "PACKAGERS" -czf $(TAR_ARCH) . - $(RPMBUILD) --clean -ta $(TAR_ARCH) - if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi - -# anonymously ncftps the rpms to sourceforge -suse-upload: check-release - 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) https://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) -r /etc/junkbuster - $(RM) -r /etc/rc.d/junkbuster* - $(RM) -r /var/run/junkbuster.pid - $(RM) -r /var/log/junkbuster - $(RM) /etc/init.d/junkbuster - $(RM) /usr/sbin/junkbuster - $(RM) /usr/sbin/rcjunkbuster - $(RM) /usr/share/man/man1/junkbuster.1.gz - $(RPM) -e privoxy-suse || true - $(RM) -r /etc/privoxy - $(RM) -r /etc/rc.d/privoxy* - $(RM) -r /var/run/privoxy.pid - $(RM) -r /var/log/privoxy - $(RM) /etc/init.d/privoxy - $(RM) /usr/sbin/privoxy - $(RM) /usr/sbin/rcprivoxy - $(RM) /usr/share/man/man1/privoxy.1.gz - -############################################################################# -# generic distribution -############################################################################# -gen-dist: dist-check - @$(ECHO) "" - @$(ECHO) "You have run autoconf && autoheader && ./configure right?" - @$(ECHO) "" - $(MAKE) $(PROGRAM) - $(STRIP_PROG) $(PROGRAM) - $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS) -# add program - (cd .. && $(TAR) -cvhf --exclude "PACKAGERS" privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$(PROGRAM)) -# add config files - for foo in $(CONFIG_FILES); do \ - (cd .. && $(TAR) -uvhf --exclude "PACKAGERS" privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$$foo;) \ - done; -# add documentation - for foo in $(DOC_FILES); do \ - (cd .. && $(TAR) -uvhf --exclude "PACKAGERS" 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 package to sourceforge -gen-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) https://sourceforge.net/project/admin/editpackages.php?group_id=11118 - @$(ECHO) ... and release the files. - @$(ECHO) ------------------------------------------------------- - -# use with care -gen-clean: - $(RM) privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar* - -############################################################################# -# solaris distribution. verified on SF machines by swa. -############################################################################# -solaris-dist: gen-dist - @$(ECHO) Done. -# anonymously ncftps the package to sourceforge -solaris-upload: gen-upload - @$(ECHO) Done. -# use with care -solaris-clean: gen-clean - @$(ECHO) Done. - -############################################################################# -# 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. verified on SF machines by swa. -############################################################################# -freebsd-dist: gen-dist - @$(ECHO) Done. -# anonymously ncftps the package to sourceforge -freebsd-upload: gen-upload - @$(ECHO) Done. -# use with care -freebsd-clean: gen-clean - @$(ECHO) Done. - -############################################################################# -# Windows distribution -############################################################################# -win-dist: - $(ECHO) Not implemented. - - -############################################################################# -# Tarball distribution: No CVS dirs, dotfiles, debian build dir, -# (FIXME:) only parts of the static / generated docs mix in doc/webserver -############################################################################# - -tarball-dist: dist-check clean clobber - $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS) - - for i in `find . -type f -a -not ( -path "*/CVS*" -o -name ".*" \ - -o -path "*/debian/*" -o -path "*/actions/*" -o -name "*.php" -o \ - -name "PACKAGERS" )`; do \ - files="$$files privoxy-$(VERSION)-$(CODE_STATUS)/$$i"; \ - done && \ - cd .. && $(TAR) -cvhf privoxy-$(VERSION)-$(CODE_STATUS)-src.tar $$files ; \ - -# and zip the archive - $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS) - $(GZIP_PROG) ../privoxy-$(VERSION)-$(CODE_STATUS)-src.tar - @$(ECHO) Tarball distribution 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) https://sourceforge.net/project/admin/editpackages.php?group_id=11118 - @$(ECHO) ... and release the files. - @$(ECHO) ------------------------------------------------------- - -tarball-clean: - $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz - -############################################################################# -# -# Documentation -# -# converts doc/source/*.sgml into html and man pages -# -############################################################################# - -# developer manual -dok-devel: - $(RM) doc/webserver/developer-manual/*.html - $(RM) -r doc/source/developer-manual - mkdir -p doc/source/developer-manual - cd doc/source/developer-manual && $(DB) ../developer-manual.sgml && cd .. && cp developer-manual/*.html ../webserver/developer-manual/ - -# user manual -dok-user: - $(RM) doc/webserver/user-manual/*.html - $(RM) -r doc/source/user-manual/ - mkdir -p doc/source/user-manual - cd doc/source/user-manual && $(DB) -iuser-man ../user-manual.sgml && cd .. && cp user-manual/*.html ../webserver/user-manual/ - # FIXME: temp fix so same stylesheet gets in more than one place so it works - # for all doc set-ups, including the 'user manual' config option in local - # system where it MUST be in same directory as html. - $(PERL) -pi.bak -e 's/</head/\n<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css">\n</head/i' doc/webserver/user-manual/*html - -# faq -dok-faq: - $(RM) doc/webserver/faq/*.html - $(RM) -r doc/source/faq - mkdir -p doc/source/faq - cd doc/source/faq && $(DB) ../faq.sgml && cd .. && cp faq/*.html ../webserver/faq/ - -# man page, one variation. Try to use the next target, just 'make man'. -dok-man: - $(RM) doc/man/* doc/webserver/man-page/*.html -ifneq ($(MAN2HTML),false) - $(ECHO) "<html><head><title>Privoxy Man page</title><link rel="stylesheet" type="text/css" href="../p_web.css"></head><body><H2>NAME</H2>" > doc/webserver/man-page/privoxy-man-page.html - man ./privoxy.1 | $(MAN2HTML) -bare >> doc/webserver/man-page/privoxy-man-page.html - $(ECHO) "</body></html>" >> doc/webserver/man-page/privoxy-man-page.html -else - $(MAKE) groff2html -endif - -# Build man page from sgml. This requires the SGMLSpm perl module. -# See CPAN, or your favorite perl repository. This is the preferred -# target for man page generation! -man: dok-release - mkdir -p doc/source/temp && cd doc/source/temp && $(RM) * ;\ - nsgmls ../privoxy-man-page.sgml | sgmlspl ../../../utils/docbook2man/docbook2man-spec.pl &&\ - perl -pi.bak -e 's/ URL:.*//; s/[ /[/g' privoxy.1 ;\ - perl -pi.bak -e "s/[ /[/g;s/á/\\['a]/g;s/é/\\['e]/g" privoxy.1; \ - perl -pi.bak -e "s/ö/\\[:o]/g" privoxy.1; \ - perl -pi.bak -e 's/([ {])-([a-z])/$$1\-$$2/g' privoxy.1; \ - perl -pi.bak -e 's/ --([a-z])/ \-\-$$1/g' privoxy.1; \ - perl -pi.bak -e 's/\fB--/\fB\-\-/g' privoxy.1; \ - $(DB) ../privoxy-man-page.sgml && $(MV) -f privoxy.1 ../../../privoxy.1 - -# For those with man2html ala RH7s. -man2html: - mkdir -p doc/webserver/man-page -ifneq ($(MAN2HTML),false) - $(MAN2HTML) privoxy.1 |grep -v "^Content-type" > tmp.html - $(PERL) -pi.bak -e 's/<A .*Contents</A>//; s/<A .*man2html</A>/man2html/' tmp.html - $(PERL) -pi.bak -e 's/(</HEAD>)/<LINK REL="STYLESHEET" TYPE="text/css" HREF="../p_doc.css"></HEAD>/' tmp.html -# Twice because my version of man2html is pulling in commas and periods in URLs. - $(PERL) -pi.bak -e 's/(<A.*),(">)/$$1$$2/g' tmp.html - $(PERL) -pi.bak -e 's,.">,">,g' tmp.html - $(PERL) -pi.bak -e "s/['a]/á/g;s/['e]/é/g" tmp.html -# Get rid of spurious from conversion. (How to do this with perl?) - $(SED) -e 's///g' tmp.html > doc/webserver/man-page/privoxy-man-page.html && $(RM) tmp.* -else - $(MAKE) groff2html -endif - - -# Otherwise we get plain groff conversion. -groff2html: - $(G2H_CMD) ./privoxy.1 | $(SED) -e 's@</head>@<link REL="STYLESHEET" TYPE="text/css" HREF="../p_doc.css"></head>@' > doc/webserver/man-page/privoxy-man-page.html - - -# readme page and INSTALL file -dok-readme: dok-release - cd doc/source && $(DB)-notoc -V nochunks readme.sgml > tmp.html &&\ - env -u LANG $(WDUMP) tmp.html > ../../README ;\ - $(DB)-notoc -V nochunks install.sgml > tmp.html &&\ - env -u LANG $(WDUMP) tmp.html > ../../INSTALL ;\ - $(RM) tmp.* - -# index.sgml is used to create both the Home Page, and a local index -# for documentation, etc. -# -# index.html for webserver: -dok-webserver: - cd doc/source/webserver && $(DB)-notoc -ip-homepage -V nochunks index.sgml > ../../webserver/index.html - $(PERL) -pi.bak -e 's/../p_doc.css/p_doc.css/;\ - s/</HEAD/\n<meta name="description" content="Privoxy helps users to protect their privacy."></HEAD/;\ - s/</HEAD/\n<meta name="MSSmartTagsPreventParsing" content="TRUE"></HEAD/;\ - s/.\d. //;\ - s/__copy/©/'\ - doc/webserver/index.html && $(RM) doc/webserver/*.bak - -# privoxy-index.html for local documentation: -dok-index: - cd doc/source/webserver && $(DB)-notoc -ip-index -V nochunks index.sgml > ../../webserver/privoxy-index.html - $(PERL) -pi.bak -e 's/../p_doc.css/p_doc.css/;\ - s/</HEAD/\n<meta name="description" content="Privoxy helps users to protect their privacy."></HEAD/;\ - s/</HEAD/\n<meta name="MSSmartTagsPreventParsing" content="TRUE"></HEAD/;\ - s/.\d. //;\ - s/__copy/©/' \ - doc/webserver/privoxy-index.html && $(RM) doc/webserver/*.bak - -# Main documentation target. -dok: dok-release dok-devel dok-user dok-faq dok-readme dok-webserver dok-authors dok-index - @$(ECHO) Documentation created. - -# -# an alternative to the above dok. disabled man page creation for the moment -# -redhat-dok: dok-release dok-devel dok-user dok-faq redhat-readme dok-webserver dok-authors - @$(ECHO) Documentation created. - -## Make README -redhat-readme: - cd doc/source && $(DB)-notoc -V nochunks readme.sgml > tmp.html && $(WDUMP) \ - tmp.html > ../../README && $(RM) -r tmp.html - -## Make AUTHORS file -dok-authors: - cd doc/source && $(DB) -V nochunks authors.sgml > tmp.html && env -u LANG $(WDUMP) \ - tmp.html > ../../AUTHORS && $(RM) tmp.html - -# Set doc entities for VERSION and CODE_STATUS in sgml docs. Toggle content -# exceptions accordingly. This needs to go before any doc building (doh). -dok-release: - @$(ECHO) Setting doc version and status to $(VERSION), $(CODE_STATUS) - @$(PERL) -pi.bak -e 's/<!entity +p-version.*>/<!entity p-version "$(VERSION)">/;\ - s/<!entity +p-status.*>/<!entity p-status "$(CODE_STATUS)">/' \ - doc/source/*sgml doc/source/*/*sgml - $(RM) -r doc/source/*bak doc/source/*/*bak -ifeq ($(CODE_STATUS),stable) - @$(ECHO) Setting docs to stable $(VERSION) - @$(PERL) -pi.bak -e 's/<!entity +% +p-stable.*>/<!entity % p-stable "INCLUDE">/;\ - s/<!entity +% +p-not-stable.*>/<!entity % p-not-stable "IGNORE">/' \ - doc/source/*sgml doc/source/*/*sgml - $(RM) -r doc/source/*bak doc/source/*/*bak -else - @$(ECHO) Setting docs to not stable $(VERSION) - @$(PERL) -pi.bak -e 's/<!entity +% +p-stable.*>/<!entity % p-stable "IGNORE">/;\ - s/<!entity +% +p-not-stable.*>/<!entity % p-not-stable "INCLUDE">/' \ - doc/source/*sgml doc/source/*/*sgml - $(RM) -r doc/source/*bak doc/source/*/*bak -endif - -# Create release announcement in text and html, with short and long versions. -# This is a standalone target, and must be invoked directly. -# announce: dok-release -# mkdir -p $(DOC_TMP) -# cd $(DOC_TMP) && cp -f ../announce.sgml . && $(DB) -iannounce-big announce.sgml &&\ -# mv -f index.html announce.html && $(WDUMP) announce.html > announce.txt -# cd $(DOC_TMP) && $(DB) announce.sgml &&\ -# mv -f index.html announce-mini.html && $(WDUMP) announce-mini.html > announce-mini.txt &&\ -# mv -f *html *txt ../../.. -# rm -fr $(DOC_TMP) - -# The main Privoxy config file, generated from sgml sources. -# NOTE: This will require some hand editing. The new file is outputted -# as config.new so that problem sections can be compared to previous -# version. This is hardcored to w3m for html/text conversion. Also, -# requires the shell util 'fmt'. -config-file: dok-release - cd doc/source && $(DB)-notoc -iconfig-file -V nochunks config.sgml > __tmp.html &&\ - env -u LANG w3m -dump __tmp.html | fmt -w 70 > ../../config.new && $(RM) -r __tmp.* - $(PERL) -i.bak utils/prepare-configfile.pl config.new - - $(RM) *.bak - @$(ECHO) "****************************************************" - @$(ECHO) "The output file is config.new." - @$(ECHO) "Now -- you need to hand edit the results!!!" - @$(ECHO) "In particular, check the Debug levels, the" - @$(ECHO) "permit-access, forward & socks examples and the" - @$(ECHO) "various user-manual examples, which all" - @$(ECHO) "probably got hammered." - @$(ECHO) "****************************************************" - -# config file, alternate version using lynx (perl stuff unfinished). Lynx -# does not do so good a job. -config-file-alt: - cd doc/source && $(ECHO) -e ".h2 JUSTIFY\nJUSTIFY:FALSE" > __tmp.lynx_cfg &&\ - $(DB)-notoc -iconfig-file -V nochunks config.sgml > __tmp.html &&\ - lynx -cfg=__tmp.lynx_cfg -width=78 -dump __tmp.html > ../../config.new && $(RM) -r __tmp.* - $(PERL) -pi -e 's/^( )//;\ - s/:$/:\n/' config.new - -############################################################################# -# -# Webserver -# -# moves dokumentation to webserver -# -############################################################################# -webserver: tidy - @$(ECHO) ------------------------------------------------------- - @$(ECHO) You will need to "create" a SF shell first: - @$(ECHO) ssh -t USER,PROJECT@shell.sourceforge.net create - @$(ECHO) Please make sure your documentation files are up to date. - @$(ECHO) Note that this command updates the home page and scps - @$(ECHO) all stuff to the webserver, it will not remove obsolete documents. - @$(ECHO) You will also need to change the user-manual symlink manually. - @$(ECHO) ------------------------------------------------------- - - @$(ECHO) Uploading html - @cd doc/webserver; \ - upload=`find . -type f -a -not ( -path "*/CVS*" -o -path "*/results*" )`; \ - $(TAR) c $$upload | ssh shell.sf.net 'cd /home/groups/i/ij/ijbswa/htdocs/; tar xvm 2>&1 | grep -v timestamp' - - @$(ECHO) Fixing permissions - @ssh shell.sf.net 'chmod -R 775 /home/groups/i/ij/ijbswa/htdocs 2>/dev/null; true' - @ssh shell.sf.net 'find /home/groups/i/ij/ijbswa/htdocs/ -type f | xargs chmod 664 2>/dev/null; true' - @ssh shell.sf.net 'chmod 666 /home/groups/i/ij/ijbswa/htdocs/actions/results/actions-feedback.txt 2>/dev/null; true' - - -web-actions: tidy - @$(ECHO) Uploading - @cd doc/webserver/actions; \ - upload=`find . -type f -a -not ( -path "*/CVS*" -o -path "*/results*" )`; \ - $(TAR) c $$upload | ssh ijbswa.sourceforge.net 'cd /home/groups/i/ij/ijbswa/htdocs/actions; tar xvm' - - @$(ECHO) Fixing permissions - @ssh ijbswa.sourceforge.net 'find /home/groups/i/ij/ijbswa/htdocs/actions/ -type f | xargs chmod 664 2>/dev/null' - @ssh ijbswa.sourceforge.net 'chmod 666 /home/groups/i/ij/ijbswa/htdocs/actions/results/actions-feedback.txt 2>/dev/null' - -## -dok-put: - tar --exclude ".cvsignore" --exclude "CVS" --exclude "source" --exclude ".htaccess" \ - --exclude "obsolete" --exclude "actions" --exclude "*.zip" --exclude "robots.txt"\ - doc/* INSTALL LICENSE AUTHORS README \ - -czf $(DOC_FILE) ;\ - $(ECHO) "Uploading doc package ..." ;\ - scp $(DOC_FILE) ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/docs/ - @ssh ijbswa.sourceforge.net 'chmod 775 /home/groups/i/ij/ijbswa/htdocs/docs/*gz 2>/dev/null; true' - $(RM) $(DOC_FILE) - -dok-get: - cd /tmp ;\ - $(WGET) http://www.privoxy.org/docs/$(DOC_FILE) ;\ - $(TAR) -zxvf $(DOC_FILE) - - -############################################################################# -# 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 ssplit.h -cgi.@OBJEXT@: cgi.c cgi.h config.h $(PROJECT_H_DEPS) cgiedit.h cgisimple.h jbsockets.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 actionlist.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 urlmatch.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 urlmatch.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 loadcfg.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h w32svrapi.h cgi.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 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 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 pcrs.h config.h @STATIC_PCRE_ONLY@pcre/pcre.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 w32svrapi.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@ifeq ($(shell $(CC) -dumpmachine), m68k-amigaos) -@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@else -@AMIGAOS_ONLY@CFLAGS += -D__AMIGAVERSION__="$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)" -D__AMIGADATE__="`date +%d.%m.%Y`" -Wextra -D__USE_INLINE__ -D__NO_INTUITION_RJ_MACROS -@AMIGAOS_ONLY@endif -@AMIGAOS_ONLY@amiga.o: amiga.c amiga.h config.h - - -$(PROGRAM): $(OBJS) $(W32_FILES) - $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS) - -clean: - $(RM) a.out $(OBJS) $(W32_FILES) $(W32_INIS) $(PROGRAM) default.action `find . -name TAGS -o -name tags` config.base config.tmp - -tidy: - $(RM) `find . -name "*~"` - $(RM) `find . -name "#*#"` # Emacs backup files - $(RM) `find . -name ".#*"` - -clobber: tidy - $(RM) GNUmakefile configure config.h.in config.h config.cache config.status config.log logfile \ - privoxy.log core *.tar.gz *.tar privoxy-cl.spec doc/source/ldp.dsl config.new - $(RM) -r autom4te.cache - -# -# FIXME: What is all this? -# - $(RM) cscope.* *.pdb *.lib *.exp - -distclean: clobber - -tags: $(SRCS) $(HDRS) - etags $(SRCS) $(HDRS) - -CONF_DEST:=$(shell if [ "$(prefix)" = "/usr/local" ] && [ "$(CONF_BASE)" = "$(prefix)/etc" ];then \ - $(ECHO) "$(CONF_BASE)/privoxy";\ - else\ - $(ECHO) "$(CONF_BASE)";\ - fi) - -LOG_DEST:=$(shell if [ "$(prefix)" = "/usr/local" ] && [ "$(LOGS_DEST)" = "$(prefix)/var/log/privoxy" ];then \ - $(ECHO) "/var/log/privoxy" ;\ - else\ - $(ECHO) "$(LOGS_DEST)";\ - fi) - -PID_DEST:=$(shell if [ "$(prefix)" = "/usr/local" ] && [ "$(PIDS_DEST)" = "$(prefix)/var/run" ];then \ - $(ECHO) "/var/run" ;\ - else\ - $(ECHO) "$(PIDS_DEST)";\ - fi) - -check_doc:=$(shell if [ ! -d "$(SHARE_DEST)/doc" ] && [ "$(prefix)" = "/usr/local" ] && [ -d "$(prefix)/doc" ];then \ - $(ECHO) "1";\ - else\ - $(ECHO) "0";\ - fi) - -# If USER is specified but no GROUP, assume there is a GROUP of same name. -GROUP_T:=$(shell if [ x$(GROUP) = x ] && [ x$(USER) != x ];then \ - $(ECHO) "$(USER)" ;\ - else\ - $(ECHO) "$(GROUP)";\ - fi) - -install-strip: - $(MAKE) install STRIP=-s - -# FIXME: Test USER and GROUP on Slack to make sure this works as -# intended. -# -# FIXME: id handling needs help, probably via configure, since 'id -u' is not -# universally reliable (eg Solaris). Group handling could be better. -# Perhaps the whole user/group validation should be done here, and simplified. -PROGRAM_V = Privoxy $(VERSION) $(CODE_STATUS) -install: CONF_DEST LOG_DEST PID_DEST check_doc GROUP_T - @# Quick test for valid USER. - @if [ -n "$(USER)" ]; then \ - $(ID) $(USER) >/dev/null || exit 1;\ - fi - @# Test for valid group. FIXME. USER does not have to belong to GROUP - @# for file ownership purposes. -# if [ -n "$(GROUP_T)" ] && [ -n "$(USER)" ] && ! $(GROUPS) $(USER) | $(GREP) "<$(GROUP_T)>" >/dev/null; then \ -# $(ECHO) Group $(GROUP_T) for User $(USER) is invalid && exit 1 ;\ -# fi - - @$(ECHO) "Creating directories, and preparing $(PROGRAM_V) installation" - $(CHMOD) $(DIR_MODE) $(MKDIR) - @$(MKDIR) $(DESTDIR)$(SBIN_DEST) $(DESTDIR)$(prefix) $(DESTDIR)$(CONF_DEST) \ - $(DESTDIR)$(CONF_DEST)/templates $(DESTDIR)$(SHARE_DEST) \ - $(DESTDIR)$(LOG_DEST) $(DESTDIR)$(PID_DEST) - @# Install the executable binary, strip if invoked as install-strip - @test -n "$(STRIP)" &&\ - $(ECHO) Installing $(PROGRAM) stripped executable to $(SBIN_DEST) ||\ - $(ECHO) Installing $(PROGRAM) executable to $(DESTDIR)$(SBIN_DEST) - $(INSTALL) $(INSTALL_P) $(STRIP) $(PROGRAM) $(DESTDIR)$(SBIN_DEST) - - @# Install the DOCS and man page. install-sh only does one file at a time. - @# FIXME: only handles jpegs. - -@if [ $(check_doc) = 0 ]; then \ - DOC=$(DOC_DEST) ;\ - else \ - DOC=$(prefix)/doc/privoxy ;\ - fi;\ - $(MKDIR) $(DESTDIR)$$DOC $(DESTDIR)$$DOC/user-manual $(DESTDIR)$$DOC/faq $(DESTDIR)$$DOC/developer-manual \ - $(DESTDIR)$$DOC/man-page $(DESTDIR)$$DOC/images $(DESTDIR)$(MAN_DEST) ;\ - if [ -d "$(DOK_WEB)" ]; then \ - $(ECHO) Installing FAQ, Manual, and other docs to $(DESTDIR)$$DOC;\ - for i in user-manual developer-manual faq; do \ - for ii in $(DOK_WEB)/$$i/*html; do \ - $(INSTALL) $(INSTALL_T) $$ii $(DESTDIR)$$DOC/$$i;\ - done ;\ - done ;\ - for i in $(DOK_WEB)/user-manual/*jpg; do \ - $(INSTALL) $(INSTALL_T) $$i $(DESTDIR)$$DOC/user-manual;\ - done ;\ - $(INSTALL) $(INSTALL_T) $(DOK_WEB)/man-page/*html $(DESTDIR)$$DOC/man-page;\ - $(INSTALL) $(INSTALL_T) $(DOK_WEB)/privoxy-index.html $(DESTDIR)$$DOC/index.html;\ - $(INSTALL) $(INSTALL_T) AUTHORS $(DESTDIR)$$DOC;\ - $(INSTALL) $(INSTALL_T) LICENSE $(DESTDIR)$$DOC;\ - $(INSTALL) $(INSTALL_T) README $(DESTDIR)$$DOC;\ - $(INSTALL) $(INSTALL_T) ChangeLog $(DESTDIR)$$DOC;\ - $(INSTALL) $(INSTALL_T) $(DOK_WEB)/p_doc.css $(DESTDIR)$$DOC;\ - $(INSTALL) $(INSTALL_T) $(DOK_WEB)/p_doc.css $(DESTDIR)$$DOC/user-manual;\ - fi - @# Not all platforms support gzipped man pages. - @$(ECHO) Installing man page to $(DESTDIR)$(MAN_DEST)/privoxy.1 - -$(INSTALL) $(INSTALL_T) privoxy.1 $(DESTDIR)$(MAN_DEST)/privoxy.1 - - @# Change the config file default directories according to the configured ones - @$(ECHO) Rewriting config for this installation - @if [ -f config.base ] ; then \ - $(CAT) config >config~ ;\ - $(MV) config.base config ;\ - fi - $(SED) 's+^confdir .+confdir $(CONF_DEST)+' config | \ - $(SED) 's+^logdir .+logdir $(LOG_DEST)+' >config.tmp - -@if [ $(check_doc) = 0 ]; then \ - $(SED) 's+^#?user-manual .*+user-manual $(DOC_DEST)/user-manual/+' config.tmp >config.updated ;\ - else \ - $(SED) 's+^#?user-manual .*+user-manual $(prefix)/doc/privoxy/user-manual/+' config.tmp >config.updated ;\ - fi;\ - $(MV) config config.base - $(MV) config.updated config - - @# Install the config support files. Test for root install, and abort - @# if there is no privoxy user, and no other user was enabled during - @# configure. Later, install init script if appropriate. - @$(ECHO) Installing templates to $(DESTDIR)$(CONF_DEST)/templates - @for i in `find templates -type f`; do \ - $(INSTALL) $(INSTALL_T) $$i $(DESTDIR)$(CONF_DEST)/templates ;\ - done - - @# FIXME: group/user validation is overly convoluted. - @# If superuser install ... we require a minimum of group ownership - @# of those files the daemon writes to, to be non-root owned. - @if [ "`$(ID) |sed 's/(.*//' |sed 's/.*=//'`" = "0" ] ;then\ - if [ x$(USER) = x ] || [ $(USER) = root ]; then \ - if [ x$(GROUP) = x ] || [ $(GROUP) = root ]; then \ - if [ "`$(ID) privoxy`" ] && \ - $(GROUPS) privoxy | $(SED) 's/^.*://' |$(GREP) "<privoxy>" >/dev/null; then \ - $(ECHO) "Warning: Setting group owner to privoxy";\ - GROUP_T=privoxy ;\ - else \ - $(ECHO) "******************************************************************" ;\ - $(ECHO) " WARNING! WARNING! installing config files as root!" ;\ - $(ECHO) " It is strongly recommended to run $(PROGRAM) as a non-root user," ;\ - $(ECHO) " and to install the config files as that user and/or group!" ;\ - $(ECHO) " Please read INSTALL, and create a privoxy user and group!" ;\ - $(ECHO) "*******************************************************************" ;\ - exit 1 ;\ - fi ;\ - else \ - GROUP_T=$(GROUP) ;\ - fi ;\ - INSTALL_CONF="$(INSTALL_R) -g $$GROUP_T " ;\ - else \ - $(ECHO) "Superuser install, installing config files as $(USER):$(GROUP_T)" ;\ - INSTALL_CONF="$(INSTALL_R) -o $(USER) -g $(GROUP_T)" ;\ - GROUP_T=$(GROUP_T) ;\ - fi ;\ - else \ - if [ ! "`id $(USER)`" = "`id`" ] ;then \ - $(ECHO) "** WARNING ** current install user different from configured user!!" ;\ - $(ECHO) "Edit may fail." ;\ - fi ;\ - INSTALL_CONF="$(INSTALL_R)" ;\ - fi ;\ - $(ECHO) Installing configuration files to $(DESTDIR)$(CONF_DEST);\ - for i in $(CONFIGS); do \ - if [ "$$i" = "default.action" ] || [ "$$i" = "default.filter" ] ; then \ - $(RM) $(DESTDIR)$(CONF_DEST)/$$i ;\ - $(ECHO) Installing fresh $$i;\ - $(INSTALL) $$INSTALL_CONF $$i $(DESTDIR)$(CONF_DEST) || exit 1;\ - elif [ -s "$(CONF_DEST)/$$i" ]; then \ - $(ECHO) Installing $$i as $$i.new ;\ - $(INSTALL) $$INSTALL_CONF $$i $(DESTDIR)$(CONF_DEST)/$$i.new || exit 1;\ - NEW=1;\ - else \ - $(INSTALL) $$INSTALL_CONF $$i $(DESTDIR)$(CONF_DEST) || exit 1;\ - fi ;\ - done ;\ - if [ -n "$$NEW" ]; then \ - $(CHMOD) $(RWD_MODE) $(DESTDIR)$(CONF_DEST)/*.new || exit 1 ;\ - $(ECHO) "Warning: Older config files are preserved. Check new versions for changes!" ;\ - fi ;\ - [ ! -f $(DESTDIR)$(LOG_DEST)/logfile ] && $(ECHO) Creating logfiles in $(DESTDIR)$(LOG_DEST) || \ - $(ECHO) Checking logfiles in $(DESTDIR)$(LOG_DEST) ;\ - $(TOUCH) $(DESTDIR)$(LOG_DEST)/logfile || exit 1 ;\ - if [ x$$USER != x ]; then \ - $(CHOWN) $$USER $(DESTDIR)$(LOG_DEST)/logfile || \ - $(ECHO) "** WARNING ** current install user different from configured user. Logging may fail!!" ;\ - fi ;\ - if [ x$$GROUP_T != x ]; then \ - $(CHGRP) $$GROUP_T $(DESTDIR)$(LOG_DEST)/logfile || \ - $(ECHO) "** WARNING ** current install user different from configured user. Logging may fail!!" ;\ - fi ;\ - $(CHMOD) $(RWD_MODE) $(DESTDIR)$(LOG_DEST)/logfile || exit 1 ;\ - if [ "$(prefix)" = "/usr/local" ] || [ "$(prefix)" = "/usr" ]; then \ - if [ -f /etc/slackware-version ] && [ -d /etc/rc.d/ ] && [ -w /etc/rc.d/ ] ; then \ - $(SED) 's+%PROGRAM%+$(PROGRAM)+' slackware/rc.privoxy.orig | \ - $(SED) 's+%SBIN_DEST%+$(SBIN_DEST)+' | \ - $(SED) 's+%CONF_DEST%+$(CONF_DEST)+' | \ - $(SED) 's+%USER%+$(USER)+' | \ - $(SED) 's+%GROUP%+$(GROUP_T)+' >slackware/rc.privoxy ;\ - $(INSTALL) $(INSTALL_P) slackware/rc.privoxy $(DESTDIR)/etc/rc.d/ ;\ - $(ECHO) "Installing for Slackware." ;\ - $(ECHO) "Dont forget to add the rc.privoxy to rc.local if you want it started at every boot" ;\ - elif [ -f /etc/redhat-release ] && [ -d /etc/rc.d/init.d/ ] && [ -w /etc/rc.d/init.d/ ] ; then \ - $(ECHO) "Installing init script to /etc/rc.d/init.d/privoxy" ;\ - $(SED) 's,^PRIVOXY_BIN=.*,PRIVOXY_BIN="/usr/local/sbin/$(PROGRAM)",' privoxy.init |\ - $(SED) 's,^PRIVOXY_CONF=.*,PRIVOXY_CONF="$(CONF_DEST)/config",' |\ - $(SED) "s,^PRIVOXY_USER=.*,PRIVOXY_USER=$$USER," > init.tmp ;\ - $(INSTALL) $(INSTALL_P) init.tmp $(DESTDIR)/etc/rc.d/init.d/privoxy && $(RM) init.tmp;\ - $(MKDIR) $(DESTDIR)/etc/logrotate.d/ ;\ - $(ECHO) "Installing logrotate script to $(DESTDIR)/etc/logrotate.d/" ;\ - $(INSTALL) -m 0644 privoxy.logrotate $(DESTDIR)/etc/logrotate.d/privoxy ;\ - elif [ -d $(DESTDIR)/etc/init.d ] && [ -w $(DESTDIR)/etc/init.d ] ; then \ - $(ECHO) "Installing generic init script to $(DESTDIR)/etc/init.d/privoxy" ;\ - $(ECHO) "Please check that the PATHs are correct, and edit if needed." ;\ - $(INSTALL) $(INSTALL_P) privoxy-generic.init $(DESTDIR)/etc/init.d/privoxy ;\ - fi ;\ - else \ - $(ECHO) "No init script installed, install it manually if needed" ;\ - fi - $(RM) config.base config.tmp - @# mmmmm, good. - @$(ECHO) "$(PROGRAM_V) installation succeeded!" - @$(ECHO) "The Privoxy configuration files have been installed in $(DESTDIR)$(CONF_DEST)" - -# rmdir is used as a precaution since it will not remove non-empty -# directories. RH init script creates lock file and pid file. -uninstall: CONF_DEST LOG_DEST PID_DEST check_doc - @$(ECHO) Starting Privoxy uninstallation - @# KILL privoxy if running - @# XXX: the chkconfig line may need a DESTDIR prefix. - -@if [ -f $(DESTDIR)/etc/redhat-release ] && [ -x $(DESTDIR)/etc/rc.d/init.d/privoxy ]; then \ - $(DESTDIR)/etc/rc.d/init.d/privoxy stop >/dev/null 2>/dev/null ;\ - chkconfig --del $(PROGRAM) 2>/dev/null;\ - fi - -@test -f $(DESTDIR)$(PID_DEST)/privoxy.pid && $(ECHO) Stopping $(PROGRAM) &&\ - $(KILL) `$(CAT) $(DESTDIR)$(PID_DEST)/privoxy.pid` || : - -@test -f $(DESTDIR)/var/run/privoxy.pid && $(ECHO) Stopping $(PROGRAM) &&\ - $(KILL) `$(CAT) $(DESTDIR)/var/run/privoxy.pid ` || : - - @# Program binary - @$(ECHO) Removing $(PROGRAM) binary - $(RM) $(DESTDIR)$(SBIN_DEST)/$(PROGRAM) $(SBIN_DEST)/$(PROGRAM)~ - - @# config files and dir, and maybe old install backups - -@if [ -d $(DESTDIR)$(CONF_DEST) ]; then \ - $(ECHO) Saving $(PROGRAM) config files to $(DESTDIR)/tmp/$(PROGRAM)-save ;\ - $(MKDIR) $(DESTDIR)/tmp/$(PROGRAM)-save ;\ - cd $(DESTDIR)$(CONF_DEST) ;\ - for i in $(DESTDIR)$(CONFIGS); do \ - [ -f $$i ] && $(CP) $$i $(DESTDIR)/tmp/$(PROGRAM)-save ;\ - done ;\ - fi - @$(ECHO) Removing $(PROGRAM) config files - -@for i in $(DESTDIR)$(CONFIGS); do \ - test -f $(CONF_DEST)/$$i && $(ECHO) Removing $$i ;\ - $(RM) $(DESTDIR)$(CONF_DEST)/$$i $(DESTDIR)$(CONF_DEST)/$$i~ $(DESTDIR)$(CONF_DEST)/$$i.new ;\ - done - -@test -d $(DESTDIR)$(CONF_DEST)/templates && $(RM) -r $(DESTDIR)$(CONF_DEST)/templates &&\ - $(ECHO) "Removing $(DESTDIR)$(CONF_DEST)/templates/*" - - @# man page and docs - @$(ECHO) Removing $(PROGRAM) docs - -$(RM) $(DESTDIR)$(MAN_DEST)/privoxy.1* - -$(RM) -r $(DESTDIR)$(DOC_DEST) || $(RM) -r $(DESTDIR)$(prefix)/doc/privoxy - - @# Log and pidfile - @$(ECHO) Removing $(PROGRAM) logs - -$(RM) $(DESTDIR)$(LOG_DEST)/logfile $(DESTDIR)$(PID_DEST)/privoxy.pid - - @# Final clean up of unused directories. Special handling of CONF and LOG - # destinations. - @$(ECHO) Removing $(PROGRAM) directories - @for i in $(DESTDIR)$(LOG_DEST) $(DESTDIR)$(CONF_DEST); do \ - if test -d $$i; then \ - $(ECHO) Removing $$i ;\ - $(RMDIR) $$i || $(ECHO) "$$i is not empty, not removed" ;\ - fi;\ - done - @if [ ! "$(prefix)" = "/usr/local" ] ;then \ - for i in $(DESTDIR)$(MAN_DEST) $(DESTDIR)$(MAN_DIR) $(DESTDIR)$(SHARE_DEST)/doc \ - $(DESTDIR)$(SHARE_DEST) $(DESTDIR)$(SBIN_DEST); do \ - if test -d $$i; then \ - $(ECHO) Removing $$i ;\ - $(RMDIR) $$i || $(ECHO) "$$i is not empty, not removed" ;\ - fi;\ - done;\ - if test $(LOG_DEST) != /var/log/privoxy && test -d $(DESTDIR)$(prefix)/var/log; then \ - $(ECHO) Removing $(DESTDIR)$(prefix)/var/log ;\ - $(RMDIR) $(DESTDIR)$(prefix)/var/log || $(ECHO) "$(DESTDIR)$(prefix)/var/log is not empty, not removed";\ - fi ;\ - if test $(PID_DEST) != /var/run && test -d $(DESTDIR)$(prefix)/var/run; then \ - $(ECHO) Removing $(DESTDIR)$(prefix)/var/run ;\ - $(RMDIR) $(DESTDIR)$(prefix)/var/run || $(ECHO) "$(DESTDIR)$(prefix)/var/run is not empty, not removed";\ - fi ;\ - if test $(prefix)/var != /var && test -d $(DESTDIR)$(prefix)/var; then \ - $(ECHO) Removing $(DESTDIR)$(prefix)/var ;\ - $(RMDIR) $(DESTDIR)$(prefix)/var || $(ECHO) "$(DESTDIR)$(prefix)/var is not empty, not removed" ;\ - fi ;\ - if test $(prefix) != / && test $(prefix) != /usr && test -d $(DESTDIR)$(prefix); then \ - $(ECHO) Removing $(DESTDIR)$(prefix) ;\ - $(ECHO) Removing installation directory $(DESTDIR)$(prefix) ;\ - $(RMDIR) $(DESTDIR)$(prefix) || $(ECHO) "$(DESTDIR)$(prefix) is not empty, not removed" ;\ - fi;\ - fi - - @# init scripts and logrotate - @if [ "$(prefix)" = "/usr/local" ] || [ "$(prefix)" = "/usr" ]; then \ - $(ECHO) Removing $(PROGRAM) init script ;\ - if [ -f $(DESTDIR)/etc/slackware-version ] && \ - [ -d $(DESTDIR)/etc/rc.d/ ] && [ -w $(DESTDIR)/etc/rc.d/ ] ; then \ - $(RM) $(DESTDIR)/etc/rc.d/rc.privoxy ;\ - elif [ -f $(DESTDIR)/etc/redhat-release ] && [ -d $(DESTDIR)/etc/rc.d/init.d/ ] \ - && [ -w $(DESTDIR)/etc/rc.d/init.d/ ] ; then \ - $(RM) $(DESTDIR)/etc/rc.d/init.d/privoxy $(DESTDIR)/etc/logrotate.d/privoxy;\ - elif [ -d $(DESTDIR)/etc/init.d ] && [ -w $(DESTDIR)/etc/init.d ] ; then \ - $(RM) $(DESTDIR)/etc/init.d/privoxy ;\ - else \ - $(ECHO) "Unable to remove privoxy init script, not installed or permission denied" ;\ - fi ;\ - fi - @$(ECHO) Privoxy uninstalled, bye - -coffee: - @perl -e 'print pack "C*", (31,139,8,8,153,63,226,60,2,3,99,111,102,102,101,' \ - -e '101,0,109,143,205,13,192,32,8,133,239,78,241,110,234,1,28,160,171,' \ - -e '152,208,53,26,117,247,22,165,73,137,125,9,1,62,126,2,128,169,5,243,' \ - -e '143,13,139,49,164,65,100,149,152,102,73,141,88,73,178,116,205,100,' \ - -e '69,253,36,102,81,49,83,236,19,225,171,131,214,172,163,73,4,168,123,' \ - -e '115,71,126,247,122,94,128,178,227,95,154,12,86,215,122,197,249,146,' \ - -e '187,54,220,125,193,51,228,11,1,0,0);' | zcat - -############################################################################# - -## Local Variables: -## tab-width: 3 -## end: - -# $Log: GNUmakefile.in,v $ -# Revision 1.180 2009/02/28 08:28:14 fabiankeil -# pcrs.o doesn't depend on pcre/pcre.h if we are linking -# dynamically. Patch provided by drauh in #2056286. -# -# Revision 1.179 2009/02/22 14:48:31 hal9 -# Updates to the 'make webserver' target that recreates the home page and uploads -# fresh documents to reflect new SF realities, and more explanation of process. -# -# Revision 1.178 2009/02/08 18:35:48 fabiankeil -# Move the match-all section into a separate file -# (match-all.action) so we can safely overwrite the -# default actions when updating. Based on Roland's -# patch #1563977. -# -# Revision 1.177 2009/01/13 16:44:32 fabiankeil -# Delete the standard.action file after moving -# the pre-settings over to the default actions. -# -# Revision 1.176 2008/09/21 13:24:37 fabiankeil -# Add Roland's man page fixes from 19_manpage_fixup.dpatch. -# -# Revision 1.175 2008/08/30 12:03:07 fabiankeil -# Remove FEATURE_COOKIE_JAR. -# -# Revision 1.174 2008/07/18 17:50:47 fabiankeil -# Fix whitespace. -# -# Revision 1.173 2008/06/18 18:28:42 fabiankeil -# Remove PDF-related stuff. -# -# Revision 1.172 2008/06/17 16:16:08 fabiankeil -# - Stop building text files nobody cares about. -# - Update copyright year. -# -# Revision 1.171 2008/06/13 15:24:57 fabiankeil -# Move previously inline'd Perl code for the config-file target -# into a separate file, have it work with older perl releases, -# clean it up a bit and fix the "underlining" code. -# -# Revision 1.170 2008/06/12 16:38:50 fabiankeil -# Add third-level domain to URL in dok-get target. -# -# Revision 1.169 2008/06/09 17:28:31 fabiankeil -# - Recommend https for releasing files. -# - Fix a warning about datarootdir being ignored. -# -# Revision 1.168 2008/05/23 18:03:12 fabiankeil -# - Shorten meta description inserted in dok-webserver -# and dok-index target. -# - In config-file target, unset LANG for w3m as we -# might otherwise end up with multi-byte characters. -# -# Revision 1.167 2008/05/23 14:39:09 fabiankeil -# Silence dok-user complaint about @# not being found. -# -# Revision 1.166 2008/05/23 14:04:57 fabiankeil -# - Get config-file target working with more recent Perl -# versions. The generated file is still messed up, though. -# - Fix comment typo. -# -# Revision 1.165 2008/05/22 16:57:23 fabiankeil -# Fix coffee machine. -# -# Revision 1.164 2008/05/22 10:26:26 fabiankeil -# - Remove parsers.@OBJEXT@'s dependency on encode.h. -# - Include Emacs backup files in tidy target again. -# -# Revision 1.163 2008/05/04 18:01:53 fabiankeil -# Dependency fixes: cgisimple.c and filters.c depend on urlmatch.h. -# -# Revision 1.162 2008/03/30 13:31:42 fabiankeil -# Add DESTDIR support for the uninstall target. -# -# Revision 1.161 2008/03/30 13:19:13 fabiankeil -# Add DESTDIR support for the install target. Closes PR#1910612. -# Patch by Radoslaw Zielinski with minor modifications. -# -# Revision 1.160 2008/03/27 18:27:19 fabiankeil -# Remove kill-popups action. -# -# Revision 1.159 2008/03/21 11:13:53 fabiankeil -# Only gather host information if it's actually needed. -# Also move the code out of accept_connection() so it's less likely -# to delay other incoming connections if the host is misconfigured. -# -# Revision 1.158 2007/12/11 21:29:25 fabiankeil -# Fix dependency list for cgiedit.c. -# -# Revision 1.157 2007/12/10 02:28:02 hal9 -# Unset $LANG for text processing of docs so we get pure text. -# -# Revision 1.156 2007/11/15 03:17:43 hal9 -# Some workaround changes to the config file perl stuff and comments, which is -# broken here all by itself on perl 5.8.8. -# -# Revision 1.155 2007/09/22 16:23:25 fabiankeil -# Update copyright line. -# -# Revision 1.154 2007/02/07 11:52:40 fabiankeil -# Fix suse-dist as described in BR#1654052. -# (I didn't test it, but it's done the same -# way in redhat-dist which is known to work). -# -# Revision 1.153 2007/01/07 07:36:36 joergs -# Added AmigaOS4 support. -# -# Revision 1.152 2006/12/13 14:53:51 etresoft -# Include any existing LDFLAGS environment when linking so that a MacOS X Universal Binary can be created. -# -# Revision 1.151 2006/11/30 01:08:55 hal9 -# Fix problem with variable declarations in the Slackware section. Thanks to higuita. -# -# Revision 1.150 2006/10/25 11:55:45 fabiankeil -# Fix sed regexes for rewriting "confdir ." and "logdir .". -# Thanks to Darel Henman for reporting this. -# -# Revision 1.149 2006/10/11 01:40:28 hal9 -# Apply patch from Neil McCalden to fix syntax issue. -# -# Revision 1.148 2006/09/26 10:57:58 hal9 -# Including Karsten's patch to fix make create-snapshot. -# -# Revision 1.147 2006/09/13 01:25:16 hal9 -# Make sure install forces in new default.action, default.filter, and -# standard.filter. These are privoxy files, not user files. -# -# Revision 1.146 2006/09/08 23:57:19 hal9 -# User manual images are now user-manual doc directory, and fix make install -# target accordingly. -# -# Revision 1.145 2006/09/08 02:32:00 hal9 -# Various changes to implement building and installing docs to be compatible -# with the new "user-manual" settings in config from Roland. Docbook does not -# seem to like dealing with more than one css file, so workaround that here. -# Change 'make install' so it provides p_doc.css in the user-manual doc -# directory so that functions well, and lastly modify 'make install' so that the -# PATH is automatically set, and the 'user-manual' directive should done during -# the install. -# -# Revision 1.144 2006/09/07 22:53:20 hal9 -# Make sure config sgml build related artifacts are cleaned out. -# -# Revision 1.143 2006/09/02 15:59:40 hal9 -# Add to code status to make install output. -# -# Revision 1.142 2006/08/29 01:46:24 hal9 -# Add user.filter to $CONFIGS. -# -# Revision 1.141 2006/08/12 03:54:37 david__schmidt -# Windows service integration -# -# Revision 1.140 2006/07/18 14:48:45 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.104.2.28 2004/06/10 17:06:05 hal9 -# Fix bug #959617, by moving TMPDIR var to create-snapshot target, which is the -# only place it is used. -# -# Revision 1.104.2.27 2004/02/07 16:11:10 oes -# Make clobber remove the autom4te.cache dir. -# Closes BR #889300 -# -# Revision 1.104.2.26 2004/01/31 16:32:25 oes -# Adding a check for an htmldoc variant from the debian diff -# -# Revision 1.104.2.25 2004/01/31 01:15:33 oes -# Fixed a typo; updated copyright notice -# -# Revision 1.104.2.24 2003/12/03 10:30:02 oes -# - Added new dependency: actions.c -> ssplit.h -# - Excluded PDF docs from src tarball -# -# Revision 1.104.2.23 2003/04/20 17:28:52 hal9 -# Strip trailing spaces from config-file generation, bug #724596. -# -# Revision 1.104.2.22 2003/03/28 03:32:01 hal9 -# Minor changes for Privoxy home page: -# - Handle © more sanely -# - include link to announce.txt -# Also, disable 'make announce' target. -# -# Revision 1.104.2.21 2002/11/04 07:04:03 hal9 -# Catch up with main trunk install/uninstall. Quiet output, etc. -# -# Revision 1.104.2.20 2002/10/25 02:44:22 hal9 -# Port of make install, etc from main trunk. Needs testing! Add Slackware -# support, and other related changes. Update related docs. -# -# Revision 1.104.2.19 2002/09/26 22:50:02 hal9 -# New user-manual examples in config-file are getting wrapped. Add warning. -# -# Revision 1.104.2.18 2002/08/23 12:22:40 oes -# Added warning to broken install target -# -# Revision 1.104.2.17 2002/08/16 03:19:34 hal9 -# More (minor) cleanup of html before pdf processing to make some relative -# links work as pdf -> pdf. Upload pdf as zip archive now. -# -# Revision 1.104.2.16 2002/08/14 16:43:27 hal9 -# Added pdf docs to make webserver target. -# -# Revision 1.104.2.15 2002/08/11 20:02:41 hal9 -# New targets for man page (make man) and pdf (make dok-pdf) targets. -# -# Revision 1.104.2.14 2002/08/10 11:19:37 oes -# - Make -Ipcre (again) conditional on STATIC_PCRE -# - $(RPMBUILD) -> $(RPM) for SuSE -# - Add dependency: pcrs.o deps on config.h -# -# Revision 1.104.2.13 2002/08/07 15:13:54 hal9 -# Remove pdf2 target, and make it dok-shtml (single page html for pdf -# conversion). -# -# Revision 1.104.2.12 2002/08/06 11:29:36 oes -# Fixed detection/inclusion of pcre.h, which is in a pcre subdir on RH -# -# Revision 1.104.2.11 2002/07/30 19:38:11 hal9 -# Add redhat-test target for testing purposes only. Fix RPM_PACKAGEV to what -# *I think* it was supposed to be (was breaking upload targets since it was -# set to RPM_VERSION). -# -# Revision 1.104.2.10 2002/07/27 22:56:53 kick_ -# cleanups of the redhat-srpm target -# -# Revision 1.104.2.9 2002/07/26 15:17:02 oes -# - Added generation of default.action from defaul.action.master -# - Deleted obsolete re_filterfile.txt generation -# -# Revision 1.104.2.8 2002/07/12 10:04:32 kick_ -# added helper targets to the makefile. They shouldn't break anything, but -# make my life a lot easier. -# -# The new rpm has been splitted into two parts, one for package installation/ -# removal, one for package building. -# Therefore rpm -ta isn't a valid command anymore and needs to be replaced -# by rpmbuild -ta (this is backwards compatible) -# -# Revision 1.104.2.7 2002/06/07 00:23:47 hal9 -# Fixing a quirk of man2html (on my system) that pulls punctuation into URLs, -# thus breaking them completely. -# -# Revision 1.104.2.6 2002/06/02 03:26:25 hal9 -# Update CONFIG_FILES (ie update basic.action, etc), and also DOC_FILES (exclude -# index.html and team/index.html) -# -# Revision 1.104.2.5 2002/05/30 15:35:01 hal9 -# This is more cleanup on the make config-file target. Most issues for -# automatic generation are taken care of. There are still some problems -# that require hand editing. Namely, some of the examples that are > 80 chars. -# -# Revision 1.104.2.4 2002/05/29 02:12:17 hal9 -# Ooops...forgot about perl -pi cygwin problem. Add -pi.bak. Also, the -# new target is 'make config-file', _not_ make config. -# -# Revision 1.104.2.3 2002/05/29 02:05:48 hal9 -# 'make config' target added (WIP) for future generation of config file from -# text in u-m so the two are in sync. New generated config, which requires -# some hand editing for the time being. -# -# Revision 1.104.2.2 2002/05/28 02:32:55 hal9 -# New target 'make dok-index' for privoxy-index.html. Also, fixed *.bak files -# not being cleaned up in doc/webserver. -# -# Revision 1.104.2.1 2002/05/26 17:19:34 hal9 -# Remove Table of Contents from readme with oes's dsl trick. -# -# Revision 1.104 2002/05/24 00:03:49 oes -# Use p_doc.css for the Homepage for consistency -# -# Revision 1.103 2002/05/23 23:19:00 oes -# Use dsl without TOC for the homepage -# -# Revision 1.102 2002/05/16 01:20:17 hal9 -# make announce target added. -# -# Revision 1.101 2002/05/15 12:28:46 oes -# Trying to keep Hal happy :) -# -# Revision 1.100 2002/05/08 13:48:18 hal9 -# Ooops, that trashed JB v2.0.2 comment. Fixed. -# -# Revision 1.99 2002/05/08 13:42:07 hal9 -# This fixes the numbering problem on index.html in contact info section (.1.). Using -# perl, since its way too convoluted to try to fix proper with docbook. -# -# Revision 1.98 2002/05/03 14:33:06 oes -# Replaced ldp(OK).dsl handling with generation via autoconf; handle all file exeptions to src tarball via find -# -# Revision 1.97 2002/04/27 20:27:43 swa -# no longer needed due to new -# PACKAGE_VERSION process -# -# Revision 1.96 2002/04/27 17:44:32 morcego -# - Correcting typo in my name (Rodrigo, not Rodgrigo) :-) -# - Using the RM macro everywhere rm is called (either we use, or don't) -# - Same for RPM -# -# Revision 1.95 2002/04/27 15:37:25 swa -# replacing directory in document creation process -# no longer necessary. -# -# Revision 1.94 2002/04/27 08:23:29 swa -# pdf process reviewed and cleaned up -# -# Revision 1.93 2002/04/27 04:55:53 morcego -# privoxy-cl.spec now gets removed by clobber target -# -# Revision 1.92 2002/04/27 04:53:40 morcego -# Adding --exclude "PACKAGERS" to every tar command that applies (not for -# webserver target) -# -# Revision 1.91 2002/04/27 04:44:51 morcego -# GNUmakefile.in: The tarball created on redhat-dist and suse-dist now ignore -# the PACKAGERS file, as well privoxy-cl.spec (in case it was created) -# GNUmakefile.in: New targets -> conectiva-spec, conectiva-dist and -# conectiva-upload -# genclspec.sh : New file to generate, from privoxy-rh.spec, a specfile -# for Conectiva Linux -# -# Revision 1.90 2002/04/26 17:46:53 swa -# be consistent -# -# Revision 1.89 2002/04/26 17:20:54 swa -# just produce single html files to proces them later with Destiller or somesuch. looks prettier. -# -# Revision 1.88 2002/04/25 19:13:57 morcego -# Removed RPM release number declaration on configure.in -# Changed makefile to use given value for RPM_PACKAGEV when on uploading -# targets (will produce an error, explaining who to do it, if no value -# if provided). -# -# Revision 1.87 2002/04/23 14:10:59 swa -# now create pdf documents -# -# Revision 1.86 2002/04/15 04:30:27 hal9 -# Missed two -pi.bak's on perl/cygwin problem. -# -# Revision 1.85 2002/04/14 01:05:34 hal9 -# Revert dok-webserver change for SF logo. -# -# Revision 1.84 2002/04/13 22:43:25 hal9 -# -Fix dok-webserver for SF logo (more perl). -# -Change all perl -pi to perl -pi.bak for Cygwin problem. -# -# Revision 1.83 2002/04/12 09:39:25 oes -# Excluding yet more files from tarball; making dist warning yet more scary -# -# Revision 1.82 2002/04/11 21:07:11 oes -# Excluding more files from tarball build -# -# Revision 1.81 2002/04/11 14:40:27 oes -# Fixed typo -- Thanks, Moritz! -# -# Revision 1.80 2002/04/11 12:50:00 oes -# Fixed tarball-dist target -# -# Revision 1.79 2002/04/11 06:49:28 oes -# webserver target: silenced timestamp warnings resulting from uploading westwards, made permissions fixing independant of screwed local dir permissions, suppress (false alarm) make error if not owner of feedback log -# -# Revision 1.78 2002/04/09 13:37:11 sarantis -# fix tar options typo -# -# Revision 1.77 2002/04/09 13:28:53 swa -# build suse and gen-dist with html docs -# -# Revision 1.76 2002/04/08 22:43:41 oes -# Fix: Include dotfiles in fixing webserver permissions -# -# Revision 1.75 2002/04/08 22:14:59 oes -# Silencing tar warnings in the web* targets -# -# Revision 1.74 2002/04/08 15:22:44 hal9 -# This has finishing touches for dok building. Should be ready to go. -# -The main doc build is now 'make dok', should work on Redhat too. -# -Removed man page from main doc build. It is built separately due to -# perl scripts that most aren't likely to have. -# -# Revision 1.73 2002/04/08 14:03:24 oes -# oes for al: Fix install target -# -# Revision 1.72 2002/04/08 13:42:11 oes -# Added safety check to *-dist targets; fixed permissions for feedback logfile -# -# Revision 1.71 2002/04/07 20:32:03 hal9 -# -Add meta data kludge for make dok-webserver via $(PERL). -# -Add subdirs for 'make dok-release'. -# -# Revision 1.70 2002/04/07 08:59:40 swa -# generated files. do NOT edit. -# fixed directory bug in makefile. -# -# Revision 1.69 2002/04/07 08:10:47 swa -# create some of the webserver docs -# automatically (in particular if -# those docs recycle other documentation -# fragments). Now committed webserver's -# index file. -# -# Revision 1.68 2002/04/07 07:58:11 swa -# create some of the webserver docs -# automatically (in particular if -# those docs recycle other documentation -# fragments) -# -# Revision 1.67 2002/04/07 05:31:42 hal9 -# Add 'dok-release' target: -# -Set doc entities to VERSION and CODE_STATUS during make. -# -Set doc conditional content flags (stable vs non-stable). -# A separate target for the time being but needs to be incorporated into -# dok build at some point. -# -Filter out a spurious ^G from new man page > html converion in man2html. -# -# Revision 1.66 2002/04/06 20:28:21 jongfoster -# Prettifying groff2html. -# Using GNU Make's conditional makefile feature rather than shell "if"s. -# (The shell "if"s were hiding errors) -# "perl" -> "$(PERL)" -# Spaces->tabs in a couple of places. -# -# Revision 1.65 2002/04/06 05:16:39 hal9 -# -Add 'authors' and 'man' targets for AUTHORS and man-page (WIP). -# -Both of these will soon be generated files. -# -# Revision 1.64 2002/04/04 22:14:51 oes -# No longer rely on find honoring -iname -# -# Revision 1.63 2002/04/04 21:06:22 swa -# cosmetics. -# -# Revision 1.62 2002/04/04 20:49:50 swa -# attempt to consolidate the -# different dokbook versions. -# -# Revision 1.61 2002/04/04 19:18:21 swa -# readme was leftover directory. use w3m instead -# of lynx to be consistent among developers. use -# consistent target naming. -# -# Revision 1.60 2002/04/04 12:25:41 oes -# Tidy webserver upload w/o *~ files, CVS dirs and logfiles and with proper dir and file permissions -# -# Revision 1.59 2002/04/04 08:32:45 swa -# wrong name for tarball-dist target. further fixed content of tarball dist -# -# Revision 1.58 2002/04/04 06:32:58 hal9 -# New dok targets for make readme. -# -# Revision 1.57 2002/04/04 00:36:36 gliptak -# always use pcre for matching -# -# Revision 1.56 2002/04/03 22:28:03 gliptak -# Removed references to gnu_regex -# -# Revision 1.55 2002/04/03 19:54:29 swa -# freebsd tested to work. attempt to move tarball dist target forward -# -# Revision 1.54 2002/04/03 14:54:07 oes -# Standard clean and clobber semantics II -# -# Revision 1.53 2002/04/03 14:19:16 oes -# Standard clean and clobber semantics -# -# Revision 1.52 2002/04/03 02:56:18 hal9 -# Revert previous FAQ numbering kludge. -# -# Revision 1.51 2002/04/02 13:03:56 oes -# Added fix for webserver permissions -# -# Revision 1.50 2002/04/02 03:46:24 hal9 -# Rewrite ldpOK.dsl so that sections are NOT numbered on FAQ, in an effort -# to make the Table of Contents not so 'busy' looking. SuSE needs testing :) -# -# Revision 1.49 2002/03/30 22:20:12 swa -# cd didn't work. neither did find. -# -# Revision 1.48 2002/03/30 19:04:06 swa -# people release differently. no good. -# I want to make parts of the docs only. -# -# Revision 1.47 2002/03/30 09:05:21 swa -# better packaging. better rpm building. -# tar failed on sun (no exclude there). -# -# Revision 1.46 2002/03/29 20:09:01 swa -# al's patch -# -# Revision 1.45 2002/03/29 19:45:45 swa -# for lazy swa -# -# Revision 1.44 2002/03/29 17:42:44 gliptak -# Correcting for Solaris tar limitations -# -# Revision 1.43 2002/03/29 07:40:03 swa -# fixed make webserver. doh -# -# Revision 1.42 2002/03/29 06:59:04 swa -# other users could not modify files on webserver -# -# Revision 1.41 2002/03/28 20:43:00 swa -# set make correctly -# -# Revision 1.40 2002/03/28 04:22:44 hal9 -# More on man2html stuff. -# -# Revision 1.39 2002/03/28 01:04:14 hal9 -# More man2html stuff for docs. -# -# Revision 1.38 2002/03/27 16:02:30 swa -# have a generic target -# -# Revision 1.37 2002/03/27 15:30:26 swa -# have a consistent appearance -# -# 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/external/privoxy/INSTALL b/external/privoxy/INSTALL deleted file mode 100644 index f17eadb..0000000 --- a/external/privoxy/INSTALL +++ /dev/null @@ -1,173 +0,0 @@ -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/INSTALL,v $ - * - * Purpose : INSTALL file to help with installing from source. - * - * Copyright : Written by and Copyright (C) 2001-2009 the - * 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/licenses/old-licenses/gpl-2.0.html - * or write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA - * - *********************************************************************/ - - -------------------------------------------------------------------------------- - -To build Privoxy from source, autoconf, GNU make (gmake), and, of course, a C -compiler like gcc are required. - -When building from a source tarball, first unpack the source: - - tar xzvf privoxy-3.0.12-stable-src.tar.gz - cd privoxy-3.0.12-stable - - -For retrieving the current CVS sources, you'll need a CVS client installed. -Note that sources from CVS are typically development quality, and may not be -stable, or well tested. To download CVS source, check the Sourceforge -documentation, which might give commands like: - - cvs -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co current - cd current - - -This will create a directory named current/, which will contain the source -tree. - -You can also check out any Privoxy "branch", just exchange the current name -with the wanted branch name (Example: v_3_0_branch for the 3.0 cvs tree). - -It is also strongly recommended to not run Privoxy as root. You should -configure/install/run Privoxy as an unprivileged user, preferably by creating a -"privoxy" user and group just for this purpose. See your local documentation -for the correct command line to do add new users and groups (something like -adduser, but the command syntax may vary from platform to platform). - -/etc/passwd might then look like: - - privoxy:*:7777:7777:privoxy proxy:/no/home:/no/shell - - -And then /etc/group, like: - - privoxy:*:7777: - - -Some binary packages may do this for you. - -Then, to build from either unpacked tarball or CVS source: - - autoheader - autoconf - ./configure # (--help to see options) - make # (the make from GNU, sometimes called gmake) - su # Possibly required - make -n install # (to see where all the files will go) - make -s install # (to really install, -s to silence output) - - -Using GNU make, you can have the first four steps automatically done for you by -just typing: - - make - - -in the freshly downloaded or unpacked source directory. - -To build an executable with security enhanced features so that users cannot -easily bypass the proxy (e.g. "Go There Anyway"), or alter their own -configurations, configure like this: - - ./configure --disable-toggle --disable-editor --disable-force - - -Then build as above. In Privoxy 3.0.7 and later, all of these options can also -be disabled through the configuration file. - -WARNING: If installing as root, the install will fail unless a non-root user or -group is specified, or a privoxy user and group already exist on the system. If -a non-root user is specified, and no group, then the installation will try to -also use a group of the same name as "user". If a group is specified (and no -user), then the support files will be installed as writable by that group, and -owned by the user running the installation. - -configure accepts --with-user and --with-group options for setting user and -group ownership of the configuration files (which need to be writable by the -daemon). The specified user must already exist. When starting Privoxy, it must -be run as this same user to insure write access to configuration and log files! - -Alternately, you can specify user and group on the make command line, but be -sure both already exist: - - make -s install USER=privoxy GROUP=privoxy - - -The default installation path for make install is /usr/local. This may of -course be customized with the various ./configure path options. If you are -doing an install to anywhere besides /usr/local, be sure to set the appropriate -paths with the correct configure options (./configure --help). Non-privileged -users must of course have write access permissions to wherever the target -installation is going. - -If you do install to /usr/local, the install will use sysconfdir=$prefix/etc/ -privoxy by default. All other destinations, and the direct usage of ---sysconfdir flag behave like normal, i.e. will not add the extra privoxy -directory. This is for a safer install, as there may already exist another -program that uses a file with the "config" name, and thus makes /usr/local/etc -cleaner. - -If installing to /usr/local, the documentation will go by default to $prefix/ -share/doc. But if this directory doesn't exist, it will then try $prefix/doc -and install there before creating a new $prefix/share/doc just for Privoxy. - -Again, if the installs goes to /usr/local, the localstatedir (ie: var/) will -default to /var instead of $prefix/var so the logs will go to /var/log/privoxy -/, and the pid file will be created in /var/run/privoxy.pid. - -make install will attempt to set the correct values in config (main -configuration file). You should check this to make sure all values are correct. -If appropriate, an init script will be installed, but it is up to the user to -determine how and where to start Privoxy. The init script should be checked for -correct paths and values, if anything other than a default install is done. - -If install finds previous versions of local configuration files, most of these -will not be overwritten, and the new ones will be installed with a "new" -extension. default.action and default.filter will be overwritten. You will then -need to manually update the other installed configuration files as needed. The -default template files will be overwritten. If you have customized, local -templates, these should be stored safely in a separate directory and defined in -config by the "templdir" directive. It is of course wise to always back-up any -important configuration files "just in case". If a previous version of Privoxy -is already running, you will have to restart it manually. - -For more detailed instructions on how to build Redhat RPMs, Windows -self-extracting installers, building on platforms with special requirements -etc, please consult the developer manual. - -The simplest command line to start Privoxy is $path/privoxy --user=privoxy -$path/etc/privoxy/config. See privoxy --usage, or the man page, for other -options, and configuration. - diff --git a/external/privoxy/LICENSE b/external/privoxy/LICENSE deleted file mode 100644 index d511905..0000000 --- a/external/privoxy/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/external/privoxy/Makefile b/external/privoxy/Makefile deleted file mode 100644 index ed6d7ac..0000000 --- a/external/privoxy/Makefile +++ /dev/null @@ -1,108 +0,0 @@ -# $Id: Makefile,v 1.11 2006/07/18 14:48:45 david__schmidt 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.11 2006/07/18 14:48:45 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.5.2.2 2002/10/25 02:44:23 hal9 -# Port of make install, etc from main trunk. Needs testing! Add Slackware -# support, and other related changes. Update related docs. -# -# Revision 1.5.2.1 2002/08/05 17:46:13 oes -# Change make to gmake to fix auto-build on Solaris -# -# Revision 1.5 2002/04/11 12:51:34 oes -# Bugfix -# -# Revision 1.4 2002/04/09 16:38:10 oes -# Added option to run the whole build process -# -# Revision 1.3 2002/03/26 22:29:54 swa -# we have a new homepage! -# -# 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 -# -# - -############################################################################# - -GNU_MAKE_CMD = gmake -MAKE_CMD = make - -error: - @if [ -f GNUmakefile ]; then \ - echo "***"; \ - echo "*** You are not using the GNU version of Make - maybe it's called gmake"; \ - echo "*** or it's in a different PATH? Please read INSTALL." ; \ - echo "***"; \ - exit 1; \ - elif test -n "$(HOST_ARCH)" && test -z "$(MAKE_VERSION)" ; then \ - echo "***"; \ - echo "*** You are not using GNU Make on Solaris, please make sure you do" ; \ - echo "*** and re-run 'make' "; \ - echo "***"; \ - exit 1 ; \ - elif test -n "$(MACHINE_ARCH)" && test -z "$(MAKE_VERSION)" ; then \ - echo "***"; \ - echo "*** You are not using GNU Make on FreeBSD, please make sure you do" ; \ - echo "*** and re-run 'make' "; \ - echo "***"; \ - exit 1 ; \ - else \ - echo "***"; \ - echo "*** To build this program, you must run"; \ - echo "*** autoheader && autoconf && ./configure and then run GNU make."; \ - echo "***"; \ - echo -n "*** Shall I do this for you now? (y/n) "; \ - read answer; \ - if [ "$$answer" = "y" ]; then \ - autoheader && autoconf && ./configure || exit 1; \ - if $(GNU_MAKE_CMD) -v |grep GNU >/dev/null 2>/dev/null; then \ - $(GNU_MAKE_CMD) ;\ - elif $(MAKE_CMD) -v |grep GNU >/dev/null 2>/dev/null; then \ - $(MAKE_CMD) ;\ - else \ - echo "Neither 'make' nor 'gmake' are GNU compatible!" ; \ - echo "Please read INSTALL." ; \ - exit 1 ; \ - fi ;\ - fi; \ - fi - -.PHONY: error - -############################################################################# - -## Local Variables: -## tab-width: 3 -## end: diff --git a/external/privoxy/README b/external/privoxy/README deleted file mode 100644 index a145e81..0000000 --- a/external/privoxy/README +++ /dev/null @@ -1,280 +0,0 @@ -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/README,v $ - * - * Purpose : README file to give a short intro. - * - * Copyright : Written by and Copyright (C) 2001-2009 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA - * - *********************************************************************/ - -This README is included with Privoxy 3.0.12. See http://www.privoxy.org/ for -more information. The current code maturity level is "stable". - -------------------------------------------------------------------------------- - -Privoxy is a non-caching web proxy with advanced filtering capabilities for -enhancing privacy, modifying web page data and HTTP headers, controlling -access, and removing ads and other obnoxious Internet junk. Privoxy has a -flexible configuration and can be customized to suit individual needs and -tastes. It has application for both stand-alone systems and multi-user -networks. - -Privoxy is Free Software and licensed under the GPL2. - -Privoxy is an associated project of Software in the Public Interest (SPI). -Donations are welcome. - -------------------------------------------------------------------------------- - -1. IMPORTANT CHANGES - -March 2009, Privoxy 3.0.12 is released. - -This is primarily a bug fix release. See the "ChangeLog", and the "What's New" -section and the "Upgrader's Notes" in the User Manual for details. - -February 2009, Privoxy 3.0.11 is released. - -As usual there are changes that effect the configuration. See the "ChangeLog", -and the "What's New" section and the "Upgrader's Notes" in the User Manual for -details and specifics. - -This is a stable release, and marks a departure for Privoxy development. - -Previously, odd numbered releases were considered beta versions and were only -released at the end of the development cycle when the code was already believed -to be stable. Usually it was, so the stable release contained pretty much the -same code, but got a higher version number. In the future we intend to release -several snapshots between stable releases. There will probably still be about -two stable releases per year, but hopefully about six snapshots instead of the -two betas we have now. The intentions is to make testing without CVS access -easier. - -------------------------------------------------------------------------------- - -2. INSTALL - -See the INSTALL file in this directory, for installing from raw source, and the -User Manual, for all other installation types. - -------------------------------------------------------------------------------- - -3. RUN - -privoxy [--help] [--version] [--no-daemon] [--pidfile PIDFILE] [--user USER -[.GROUP]] [--chroot] [--pre-chroot-nslookup HOSTNAME ][config_file] - -See the man page or User Manual for an explanation of each option, and other -configuration and usage issues. - -If no config_file is specified on the command line, Privoxy will look for a -file named 'config' in the current directory (except Win32 which will look for -'config.txt'). If no config_file is found, Privoxy will fail to start. - -Or for Red Hat and Fedora based distributions: /etc/rc.d/init.d/privoxy start - -Or Debian and Ubuntu: /etc/init.d/privoxy start - -------------------------------------------------------------------------------- - -4. CONFIGURATION - -See: 'config', 'default.action', 'user.action', 'default.filter', and -'user.filter'. 'user.action' and 'user.filter' are for personal and local -configuration preferences. These are all well commented. Most of the magic is -in '*.action' files. 'user.action' should be used for any actions -customizations. On Unix-like systems, these files are typically installed in / -etc/privoxy. On Windows, then wherever the executable itself is installed. -There are many significant changes and advances from earlier versions. The User -Manual has an explanation of all configuration options, and examples: http:// -www.privoxy.org/user-manual/. - -Be sure to set your browser(s) for HTTP/HTTPS Proxy at <IP>:<Port>, or whatever -you specify in the config file under 'listen-address'. DEFAULT is -localhost:8118. Note that Privoxy ONLY proxies HTTP (and HTTPS) traffic. Do not -try it with FTP or other protocols for the simple reason it does not work. - -The actions list can be configured via the web interface accessed via http:// -p.p/, as well other options. - -------------------------------------------------------------------------------- - -5. DOCUMENTATION - -There should be documentation in the 'doc' subdirectory. In particular, see the -User Manual there, the FAQ, and those interested in Privoxy development, should -look at developer-manual. - -The source and configuration files are all well commented. The main -configuration files are: 'config', 'default.action', and 'default.filter'. - -Included documentation may vary according to platform and packager. All -documentation is posted on http://www.privoxy.org, in case you don't have it, -or can't find it. - -------------------------------------------------------------------------------- - -6. CONTACTING THE DEVELOPERS, BUG REPORTING AND FEATURE REQUESTS - -We value your feedback. In fact, we rely on it to improve Privoxy and its -configuration. However, please note the following hints, so we can provide you -with the best support: - -------------------------------------------------------------------------------- - -6.1. Get Support - -For casual users, our support forum at SourceForge is probably best suited: -http://sourceforge.net/tracker/?group_id=11118&atid=211118 - -All users are of course welcome to discuss their issues on the users mailing -list, where the developers also hang around. - -Please don't sent private support requests to individual Privoxy developers, -either use the mailing lists or the support trackers. - -Note that the Privoxy mailing lists are moderated. Posts from unsubscribed -addresses have to be accepted manually by a moderator. This may cause a delay -of several days and if you use a subject that doesn't clearly mention Privoxy -or one of its features, your message may be accidentally discarded as spam. - -If you aren't subscribed, you should therefore spend a few seconds to come up -with a proper subject. Additionally you should make it clear that you want to -get CC'd. Otherwise some responses will be directed to the mailing list only, -and you won't see them. - -------------------------------------------------------------------------------- - -6.2. Reporting Problems - -"Problems" for our purposes, come in two forms: - - * Configuration issues, such as ads that slip through, or sites that don't - function properly due to one Privoxy "action" or another being turned "on". - - * "Bugs" in the programming code that makes up Privoxy, such as that might - cause a crash. - -------------------------------------------------------------------------------- - -6.2.1. Reporting Ads or Other Configuration Problems - -Please send feedback on ads that slipped through, innocent images that were -blocked, sites that don't work properly, and other configuration related -problem of default.action file, to http://sourceforge.net/tracker/?group_id= -11118&atid=460288, the Actions File Tracker. - -New, improved default.action files may occasionally be made available based on -your feedback. These will be announced on the ijbswa-announce list and -available from our the files section of our project page. - -------------------------------------------------------------------------------- - -6.2.2. Reporting Bugs - -Please report all bugs through our bug tracker: http://sourceforge.net/tracker -/?group_id=11118&atid=111118. - -Before doing so, please make sure that the bug has not already been submitted -and observe the additional hints at the top of the submit form. If already -submitted, please feel free to add any info to the original report that might -help to solve the issue. - -Please try to verify that it is a Privoxy bug, and not a browser or site bug or -documented behaviour that just happens to be different than what you expected. -If unsure, try toggling off Privoxy, and see if the problem persists. - -If you are using your own custom configuration, please try the stock configs to -see if the problem is configuration related. If you're having problems with a -feature that is disabled by default, please ask around on the mailing list if -others can reproduce the problem. - -If you aren't using the latest Privoxy version, the bug may have been found and -fixed in the meantime. We would appreciate if you could take the time to -upgrade to the latest version (or even the latest CVS snapshot) and verify that -your bug still exists. - -Please be sure to provide the following information: - - * The exact Privoxy version you are using (if you got the source from CVS, - please also provide the source code revisions as shown in http:// - config.privoxy.org/show-version). - - * The operating system and versions you run Privoxy on, (e.g. Windows XP - SP2), if you are using a Unix flavor, sending the output of "uname -a" - should do, in case of GNU/Linux, please also name the distribution. - - * The name, platform, and version of the browser you were using (e.g. - Internet Explorer v5.5 for Mac). - - * The URL where the problem occurred, or some way for us to duplicate the - problem (e.g. http://somesite.example.com/?somethingelse=123). - - * Whether your version of Privoxy is one supplied by the Privoxy developers - via SourceForge, or if you got your copy somewhere else. - - * Whether you are using Privoxy in tandem with another proxy such as Tor. If - so, please temporary disable the other proxy to see if the symptoms change. - - * Whether you are using a personal firewall product. If so, does Privoxy work - without it? - - * Any other pertinent information to help identify the problem such as config - or log file excerpts (yes, you should have log file entries for each action - taken). - -You don't have to tell us your actual name when filing a problem report, but -please use a nickname so we can differentiate between your messages and the -ones entered by other "anonymous" users that may respond to your request if -they have the same problem or already found a solution. - -Please also check the status of your request a few days after submitting it, as -we may request additional information. If you use a SF id, you should -automatically get a mail when someone responds to your request. - -The appendix of the Privoxy User Manual also has helpful information on -understanding actions, and action debugging. - -------------------------------------------------------------------------------- - -6.3. Request New Features - -You are welcome to submit ideas on new features or other proposals for -improvement through our feature request tracker at http://sourceforge.net/ -tracker/?atid=361118&group_id=11118. - -------------------------------------------------------------------------------- - -6.4. Other - -For any other issues, feel free to use the mailing lists. Technically -interested users and people who wish to contribute to the project are also -welcome on the developers list! You can find an overview of all Privoxy-related -mailing lists, including list archives, at: http://sourceforge.net/mail/? -group_id=11118. - diff --git a/external/privoxy/acconfig.h b/external/privoxy/acconfig.h deleted file mode 100644 index ea2792d..0000000 --- a/external/privoxy/acconfig.h +++ /dev/null @@ -1,495 +0,0 @@ -#ifndef CONFIG_H_INCLUDED -#define CONFIG_H_INCLUDED -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/acconfig.h,v $ - * - * Purpose : This file should be the first thing included in every - * .c file. (Before even system headers). It contains - * #define statements for various features. It was - * introduced because the compile command line started - * getting ludicrously long with feature defines. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * 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: acconfig.h,v $ - * Revision 1.36 2008/10/18 11:17:52 fabiankeil - * Connection keep-alive support is ready for testing, - * allow enabling it through the configure script. - * - * Revision 1.35 2008/04/06 15:18:33 fabiankeil - * Oh well, rename the --enable-pcre-host-patterns option to - * --enable-extended-host-patterns as it's not really PCRE syntax. - * - * Revision 1.34 2008/04/06 14:54:26 fabiankeil - * Use PCRE syntax in host patterns when configured - * with --enable-pcre-host-patterns. - * - * Revision 1.33 2006/12/17 19:15:26 fabiankeil - * Added ./configure switch for FEATURE_GRACEFUL_TERMINATION. - * - * Revision 1.32 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.27.2.4 2003/12/17 16:34:40 oes - * Cosmetics - * - * Revision 1.27.2.3 2003/03/27 16:03:19 oes - * Another shot at Bug #707467 - * - * Revision 1.27.2.2 2003/03/21 14:39:12 oes - * Presumably fixed Bug #707467 by defining unix ifdef __unix__ - * - * Revision 1.27.2.1 2002/08/10 11:22:31 oes - * - Add two AC_DEFINEs that indicate if the pcre*.h headers - * are located in a pcre/ subdir to the include path. - * - * Revision 1.27 2002/04/25 19:13:57 morcego - * Removed RPM release number declaration on configure.in - * Changed makefile to use given value for RPM_PACKAGEV when on uploading - * targets (will produce an error, explaining who to do it, if no value - * if provided). - * - * Revision 1.26 2002/04/11 11:00:21 oes - * Applied Moritz' fix for socklen_t on Solaris - * - * Revision 1.25 2002/04/06 20:38:01 jongfoster - * Renaming VC++ versions of config.h - * - * Revision 1.24 2002/04/04 00:36:36 gliptak - * always use pcre for matching - * - * Revision 1.23 2002/04/03 22:28:03 gliptak - * Removed references to gnu_regex - * - * Revision 1.22 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * doesn't work yet. See feature request # 425722 - * - * Revision 1.2 2001/05/22 17:43:35 oes - * - * - Enabled filtering banners by size rather than URL - * by adding patterns that replace all standard banner - * sizes with the "Junkbuster" gif to the re_filterfile - * - * - Enabled filtering WebBugs by providing a pattern - * which kills all 1x1 images - * - * - Added support for PCRE_UNGREEDY behaviour to pcrs, - * which is selected by the (nonstandard and therefore - * capital) letter 'U' in the option string. - * It causes the quantifiers to be ungreedy by default. - * Appending a ? turns back to greedy (!). - * - * - Added a new interceptor ijb-send-banner, which - * sends back the "Junkbuster" gif. Without imagelist or - * MSIE detection support, or if tinygif = 1, or the - * URL isn't recognized as an imageurl, a lame HTML - * explanation is sent instead. - * - * - Added new feature, which permits blocking remote - * script redirects and firing back a local redirect - * to the browser. - * The feature is conditionally compiled, i.e. it - * can be disabled with --disable-fast-redirects, - * plus it must be activated by a "fast-redirects" - * line in the config file, has its own log level - * and of course wants to be displayed by show-proxy-args - * Note: Boy, all the #ifdefs in 1001 locations and - * all the fumbling with configure.in and acconfig.h - * were *way* more work than the feature itself :-( - * - * - Because a generic redirect template was needed for - * this, tinygif = 3 now uses the same. - * - * - Moved GIFs, and other static HTTP response templates - * to project.h - * - * - Many minor fixes - * - * - Removed some >400 CRs again (Jon, you really worked - * a lot! ;-) - * - * Revision 1.1.1.1 2001/05/15 13:58:45 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - -@TOP@ - -/* - * Version number - Major (X._._) - */ -#undef VERSION_MAJOR - -/* - * Version number - Minor (_.X._) - */ -#undef VERSION_MINOR - -/* - * Version number - Point (_._.X) - */ -#undef VERSION_POINT - -/* - * Version number, as a string - */ -#undef VERSION - -/* - * Status of the code: "alpha", "beta" or "stable". - */ -#undef CODE_STATUS - -/* - * Should pcre be statically built in instead of linkling with libpcre? - * (This is determined by configure depending on the availiability of - * libpcre and user preferences). The name is ugly, but pcre needs it. - * Don't bother to change this here! Use configure instead. - */ -#undef STATIC_PCRE - -/* - * Should pcrs be statically built in instead of linkling with libpcrs? - * (This is determined by configure depending on the availiability of - * libpcrs and user preferences). - * Don't bother to change this here! Use configure instead. - */ -#undef STATIC_PCRS - -/* - * Allows the use of an ACL to control access to the proxy by IP address. - */ -#undef FEATURE_ACL - -/* - * Enables the web-based configuration (actionsfile) editor. If you - * have a shared proxy, you might want to turn this off. - */ -#undef FEATURE_CGI_EDIT_ACTIONS - -/* - * Allows the use of jar files to capture cookies. - */ -#undef FEATURE_COOKIE_JAR - -/* - * Locally redirect remote script-redirect URLs - */ -#undef FEATURE_FAST_REDIRECTS - -/* - * Bypass filtering for 1 page only - */ -#undef FEATURE_FORCE_LOAD - -/* - * 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. - */ -#undef FEATURE_IMAGE_BLOCKING - -/* - * Detect image requests automatically for MSIE. Will fall back to - * other image-detection methods (i.e. "+image" permission) for other - * browsers. - * - * You must also define FEATURE_IMAGE_BLOCKING to use this feature. - * - * It detects the following header pair as an image request: - * - * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) - * Accept: * / * - * - * And the following as a HTML request: - * - * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) - * Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, * / * - * - * And no, I haven't got that backwards - IE is being wierd. - * - * Known limitations: - * 1) If you press shift-reload on a blocked HTML page, you get - * the image "blocked" page, not the HTML "blocked" page. - * 2) Once an image "blocked" page has been sent, viewing it - * in it's own browser window *should* bring up the HTML - * "blocked" page, but it doesn't. You need to clear the - * browser cache to get the HTML version again. - * - * These limitations are due to IE making inconsistent choices - * about which "Accept:" header to send. - */ -#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 - -/* - * Allow to shutdown Privoxy through the webinterface. - */ -#undef FEATURE_GRACEFUL_TERMINATION - -/* - * Allow PCRE syntax in host patterns. - */ -#undef FEATURE_EXTENDED_HOST_PATTERNS - -/* - * Keep outgoing connections alive if possible. - */ -#undef FEATURE_CONNECTION_KEEP_ALIVE - -/* - * Use POSIX threads instead of native threads. - */ -#undef FEATURE_PTHREAD - -/* - * Enables statistics function. - */ -#undef FEATURE_STATISTICS - -/* - * 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. - */ -#undef FEATURE_TOGGLE - -/* - * Allows the use of trust files. - */ -#undef FEATURE_TRUST - -/* - * Defined on Solaris only. Makes the system libraries thread safe. - */ -#undef _REENTRANT - -/* - * Defined on Solaris only. Without this, many important functions are not - * defined in the system headers. - */ -#undef __EXTENSIONS__ - -/* - * Defined always. - * FIXME: Don't know what it does or why we need it. - * (presumably something to do with MultiThreading?) - */ -#undef __MT__ - -/* If the (nonstandard and thread-safe) function gethostbyname_r - * is available, select which signature to use - */ -#undef HAVE_GETHOSTBYNAME_R_6_ARGS -#undef HAVE_GETHOSTBYNAME_R_5_ARGS -#undef HAVE_GETHOSTBYNAME_R_3_ARGS - -/* If the (nonstandard and thread-safe) function gethostbyaddr_r - * is available, select which signature to use - */ -#undef HAVE_GETHOSTBYADDR_R_8_ARGS -#undef HAVE_GETHOSTBYADDR_R_7_ARGS -#undef HAVE_GETHOSTBYADDR_R_5_ARGS - -/* Defined if you have gmtime_r and localtime_r with a signature - * of (struct time *, struct tm *) - */ -#undef HAVE_GMTIME_R -#undef HAVE_LOCALTIME_R - -/* Define to 'int' if <sys/socket.h> doesn't have it. - */ -#undef socklen_t - -/* Define if pcre.h must be included as <pcre/pcre.h> - */ -#undef PCRE_H_IN_SUBDIR - -/* Define if pcreposix.h must be included as <pcre/pcreposix.h> - */ -#undef PCREPOSIX_H_IN_SUBDIR - -@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__) */ - -/* - * On OpenBSD and maybe also FreeBSD, gcc doesn't define the cpp - * symbol unix; it defines __unix__ and sometimes not even that: - */ -#if ( defined(__unix__) || defined(__NetBSD__) ) && !defined(unix) -#define unix 1 -#endif - -/* - * 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 vc_config_winthreads.h or vc_config_pthreads.h. You can usually do this by selecting the "Build", "Clean" menu option. -#endif /* def _MSC_VER */ - -#endif /* CONFIG_H_INCLUDED */ diff --git a/external/privoxy/actionlist.h b/external/privoxy/actionlist.h deleted file mode 100644 index 339c878..0000000 --- a/external/privoxy/actionlist.h +++ /dev/null @@ -1,306 +0,0 @@ -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/actionlist.h,v $ - * - * Purpose : Master list of supported actions. - * Not really a header, since it generates code. - * This is included (3 times!) from actions.c - * Each time, the following macros are defined to - * suitable values beforehand: - * DEFINE_ACTION_MULTI() - * DEFINE_ACTION_STRING() - * DEFINE_ACTION_BOOL() - * DEFINE_ACTION_ALIAS - * - * Copyright : Written by and Copyright (C) 2001-2008 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: actionlist.h,v $ - * Revision 1.36 2008/09/20 10:04:33 fabiankeil - * Remove hide-forwarded-for-headers action which has - * been obsoleted by change-x-forwarded-for{block}. - * - * Revision 1.35 2008/09/19 15:43:54 fabiankeil - * Fix sorting. - * - * Revision 1.34 2008/09/19 15:26:28 fabiankeil - * Add change-x-forwarded-for{} action to block or add - * X-Forwarded-For headers. Mostly based on code removed - * before 3.0.7. - * - * Revision 1.33 2008/03/29 12:13:45 fabiankeil - * Remove send-wafer and send-vanilla-wafer actions. - * - * Revision 1.32 2008/03/28 15:13:42 fabiankeil - * Remove inspect-jpegs action. - * - * Revision 1.31 2008/03/27 18:27:20 fabiankeil - * Remove kill-popups action. - * - * Revision 1.30 2008/03/04 18:30:34 fabiankeil - * Remove the treat-forbidden-connects-like-blocks action. We now - * use the "blocked" page for forbidden CONNECT requests by default. - * - * Revision 1.29 2008/03/01 14:00:43 fabiankeil - * Let the block action take the reason for the block - * as argument and show it on the "blocked" page. - * - * Revision 1.28 2007/12/11 21:08:29 fabiankeil - * Let the CGI editor suggest a forward-override - * parameter whose syntax is actually valid. - * - * Revision 1.27 2007/11/10 15:04:08 fabiankeil - * Tell the CGI editor about +hide-referrer{conditional-forge}. - * - * Revision 1.26 2007/06/01 16:54:28 fabiankeil - * Add forward-override{} to change the forwarding settings through - * action sections. This is mainly interesting to forward different - * clients differently (for example based on User-Agent or request - * origin). - * - * Revision 1.25 2007/04/15 16:39:20 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.24 2007/03/20 15:16:34 fabiankeil - * Use dedicated header filter actions instead of abusing "filter". - * Replace "filter-client-headers" and "filter-client-headers" - * with "server-header-filter" and "client-header-filter". - * - * Revision 1.23 2006/10/09 10:26:18 fabiankeil - * Changed the path in set-image-blocker's redirection default to - * "send-banner?type=pattern" instead of "show-banner?type=pattern" - * which isn't caught by Privoxy. Fixes BR 1573468. - * - * Changed hide-user-agent's default value to "Privoxy VERSION". - * - * Changed hide-referrer's default fake value to "http://www.privoxy.org/". - * A static referrer is obviously fake anyway, so we might as well - * advertise ourselves. - * - * Revision 1.22 2006/09/01 17:14:18 hal9 - * Re-ordered the actions list so that they display in the actions editor in - * alphabetical order. Some of the new actions were "out of order". - * - * Revision 1.21 2006/08/14 08:25:19 fabiankeil - * Split filter-headers{} into filter-client-headers{} - * and filter-server-headers{}. - * Added parse_header_time() to share some code. - * Replaced timegm() with mktime(). - * - * Revision 1.20 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work:http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.19 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.17.2.3 2004/10/03 12:53:32 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.17.2.2 2002/09/25 15:25:25 oes - * Added more aliases for prehistoric action names - * - * Revision 1.17.2.1 2002/08/02 12:50:47 oes - * Consistency with docs: Change default name for action from hide-referer to hide-referrer - * - * Revision 1.17 2002/05/14 21:25:55 oes - * Renamed prevent-(setting/reading)-cookies to crunch-(incoming/outgoing)-cookies - * - * Revision 1.16 2002/04/24 02:15:18 oes - * Renamed actions as discussed, Aliased old action names to new ones. - * - * Revision 1.15 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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_STRING ("block", ACTION_BLOCK, ACTION_STRING_BLOCK) -DEFINE_CGI_PARAM_NO_RADIO("block", ACTION_BLOCK, ACTION_STRING_BLOCK, "No reason specified.") -DEFINE_ACTION_STRING ("change-x-forwarded-for", ACTION_CHANGE_X_FORWARDED_FOR, ACTION_STRING_CHANGE_X_FORWARDED_FOR) -DEFINE_CGI_PARAM_RADIO ("change-x-forwarded-for", ACTION_CHANGE_X_FORWARDED_FOR, ACTION_STRING_CHANGE_X_FORWARDED_FOR, "block", 0) -DEFINE_CGI_PARAM_RADIO ("change-x-forwarded-for", ACTION_CHANGE_X_FORWARDED_FOR, ACTION_STRING_CHANGE_X_FORWARDED_FOR, "add", 1) -DEFINE_ACTION_MULTI ("client-header-filter", ACTION_MULTI_CLIENT_HEADER_FILTER) -DEFINE_ACTION_MULTI ("client-header-tagger", ACTION_MULTI_CLIENT_HEADER_TAGGER) -DEFINE_ACTION_STRING ("content-type-overwrite", ACTION_CONTENT_TYPE_OVERWRITE, ACTION_STRING_CONTENT_TYPE) -DEFINE_CGI_PARAM_NO_RADIO("content-type-overwrite", ACTION_CONTENT_TYPE_OVERWRITE, ACTION_STRING_CONTENT_TYPE, "text/html") -DEFINE_ACTION_STRING ("crunch-client-header", ACTION_CRUNCH_CLIENT_HEADER, ACTION_STRING_CLIENT_HEADER) -DEFINE_CGI_PARAM_NO_RADIO("crunch-client-header", ACTION_CRUNCH_CLIENT_HEADER, ACTION_STRING_CLIENT_HEADER, "X-Whatever:") -DEFINE_ACTION_BOOL ("crunch-if-none-match", ACTION_CRUNCH_IF_NONE_MATCH) -DEFINE_ACTION_BOOL ("crunch-incoming-cookies", ACTION_NO_COOKIE_SET) -DEFINE_ACTION_BOOL ("crunch-outgoing-cookies", ACTION_NO_COOKIE_READ) -DEFINE_ACTION_STRING ("crunch-server-header", ACTION_CRUNCH_SERVER_HEADER, ACTION_STRING_SERVER_HEADER) -DEFINE_CGI_PARAM_NO_RADIO("crunch-server-header", ACTION_CRUNCH_SERVER_HEADER, ACTION_STRING_SERVER_HEADER, "X-Whatever:") -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-http-version", ACTION_DOWNGRADE) -DEFINE_ACTION_STRING ("fast-redirects", ACTION_FAST_REDIRECTS, ACTION_STRING_FAST_REDIRECTS) -DEFINE_CGI_PARAM_RADIO ("fast-redirects", ACTION_FAST_REDIRECTS, ACTION_STRING_FAST_REDIRECTS, "simple-check", 0) -DEFINE_CGI_PARAM_RADIO ("fast-redirects", ACTION_FAST_REDIRECTS, ACTION_STRING_FAST_REDIRECTS, "check-decoded-url", 1) -DEFINE_ACTION_MULTI ("filter", ACTION_MULTI_FILTER) -DEFINE_ACTION_BOOL ("force-text-mode", ACTION_FORCE_TEXT_MODE) -DEFINE_ACTION_STRING ("forward-override", ACTION_FORWARD_OVERRIDE, ACTION_STRING_FORWARD_OVERRIDE) -DEFINE_CGI_PARAM_CUSTOM ("forward-override", ACTION_FORWARD_OVERRIDE, ACTION_STRING_FORWARD_OVERRIDE, "forward .") -DEFINE_ACTION_BOOL ("handle-as-empty-document", ACTION_HANDLE_AS_EMPTY_DOCUMENT) -DEFINE_ACTION_BOOL ("handle-as-image", ACTION_IMAGE) -DEFINE_ACTION_STRING ("hide-accept-language", ACTION_HIDE_ACCEPT_LANGUAGE, ACTION_STRING_LANGUAGE) -DEFINE_CGI_PARAM_RADIO ("hide-accept-language", ACTION_HIDE_ACCEPT_LANGUAGE, ACTION_STRING_LANGUAGE, "block", 0) -DEFINE_CGI_PARAM_CUSTOM ("hide-accept-language", ACTION_HIDE_ACCEPT_LANGUAGE, ACTION_STRING_LANGUAGE, "de-de") -DEFINE_ACTION_STRING ("hide-content-disposition", ACTION_HIDE_CONTENT_DISPOSITION, ACTION_STRING_CONTENT_DISPOSITION) -DEFINE_CGI_PARAM_RADIO ("hide-content-disposition", ACTION_HIDE_CONTENT_DISPOSITION, ACTION_STRING_CONTENT_DISPOSITION, "block", 0) -DEFINE_CGI_PARAM_CUSTOM ("hide-content-disposition", ACTION_HIDE_CONTENT_DISPOSITION, ACTION_STRING_CONTENT_DISPOSITION, "attachment; filename=WHATEVER.txt") -DEFINE_ACTION_STRING ("hide-from-header", ACTION_HIDE_FROM, ACTION_STRING_FROM) -DEFINE_CGI_PARAM_RADIO ("hide-from-header", ACTION_HIDE_FROM, ACTION_STRING_FROM, "block", 1) -DEFINE_CGI_PARAM_CUSTOM ("hide-from-header", ACTION_HIDE_FROM, ACTION_STRING_FROM, "spam_me_senseless@sittingduck.xyz") -DEFINE_ACTION_STRING ("hide-if-modified-since", ACTION_HIDE_IF_MODIFIED_SINCE, ACTION_STRING_IF_MODIFIED_SINCE) -DEFINE_CGI_PARAM_RADIO ("hide-if-modified-since", ACTION_HIDE_IF_MODIFIED_SINCE, ACTION_STRING_IF_MODIFIED_SINCE, "block", 0) -DEFINE_CGI_PARAM_CUSTOM ("hide-if-modified-since", ACTION_HIDE_IF_MODIFIED_SINCE, ACTION_STRING_IF_MODIFIED_SINCE, "-1") -DEFINE_ACTION_STRING ("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER) -DEFINE_CGI_PARAM_RADIO ("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "conditional-forge", 3) -DEFINE_CGI_PARAM_RADIO ("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "conditional-block", 2) -DEFINE_CGI_PARAM_RADIO ("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "forge", 1) -DEFINE_CGI_PARAM_RADIO ("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "block", 0) -DEFINE_CGI_PARAM_CUSTOM ("hide-referrer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER, "http://www.privoxy.org/") -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 " VERSION) -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_STRING ("overwrite-last-modified", ACTION_OVERWRITE_LAST_MODIFIED, ACTION_STRING_LAST_MODIFIED) -DEFINE_CGI_PARAM_RADIO ("overwrite-last-modified", ACTION_OVERWRITE_LAST_MODIFIED, ACTION_STRING_LAST_MODIFIED, "block", 0) -DEFINE_CGI_PARAM_RADIO ("overwrite-last-modified", ACTION_OVERWRITE_LAST_MODIFIED, ACTION_STRING_LAST_MODIFIED, "reset-to-request-time", 1) -DEFINE_CGI_PARAM_RADIO ("overwrite-last-modified", ACTION_OVERWRITE_LAST_MODIFIED, ACTION_STRING_LAST_MODIFIED, "randomize", 2) -DEFINE_ACTION_BOOL ("prevent-compression", ACTION_NO_COMPRESSION) -DEFINE_ACTION_STRING ("redirect", ACTION_REDIRECT, ACTION_STRING_REDIRECT) -DEFINE_CGI_PARAM_NO_RADIO("redirect", ACTION_REDIRECT, ACTION_STRING_REDIRECT, "http://localhost/") -DEFINE_ACTION_MULTI ("server-header-filter", ACTION_MULTI_SERVER_HEADER_FILTER) -DEFINE_ACTION_MULTI ("server-header-tagger", ACTION_MULTI_SERVER_HEADER_TAGGER) -DEFINE_ACTION_BOOL ("session-cookies-only", ACTION_NO_COOKIE_KEEP) -DEFINE_ACTION_STRING ("set-image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER) -DEFINE_CGI_PARAM_RADIO ("set-image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, "pattern", 1) -DEFINE_CGI_PARAM_RADIO ("set-image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, "blank", 0) -DEFINE_CGI_PARAM_CUSTOM ("set-image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, CGI_PREFIX "send-banner?type=pattern") - -#if DEFINE_ACTION_ALIAS - -/* - * Alternative spellings - */ -DEFINE_ACTION_STRING ("hide-referer", ACTION_HIDE_REFERER, ACTION_STRING_REFERER) -DEFINE_ACTION_BOOL ("prevent-keeping-cookies", ACTION_NO_COOKIE_KEEP) - -/* - * Pre-3.0.7 (pseudo) compatibility - */ -DEFINE_ACTION_MULTI ("filter-client-headers", ACTION_MULTI_CLIENT_HEADER_FILTER) -DEFINE_ACTION_MULTI ("filter-server-headers", ACTION_MULTI_SERVER_HEADER_FILTER) - -/* - * Pre-3.0 compatibility - */ -DEFINE_ACTION_BOOL ("no-cookie-read", ACTION_NO_COOKIE_READ) -DEFINE_ACTION_BOOL ("no-cookie-set", ACTION_NO_COOKIE_SET) -DEFINE_ACTION_BOOL ("prevent-reading-cookies", ACTION_NO_COOKIE_READ) -DEFINE_ACTION_BOOL ("prevent-setting-cookies", ACTION_NO_COOKIE_SET) -DEFINE_ACTION_BOOL ("downgrade", ACTION_DOWNGRADE) -DEFINE_ACTION_STRING ("hide-from", ACTION_HIDE_FROM, ACTION_STRING_FROM) -DEFINE_ACTION_BOOL ("image", ACTION_IMAGE) -DEFINE_ACTION_STRING ("image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER) -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) -#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/external/privoxy/actions.c b/external/privoxy/actions.c deleted file mode 100644 index 172085f..0000000 --- a/external/privoxy/actions.c +++ /dev/null @@ -1,2021 +0,0 @@ -const char actions_rcs[] = "$Id: actions.c,v 1.56 2009/03/08 14:19:21 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/actions.c,v $ - * - * Purpose : Declares functions to work with actions files - * Functions declared include: FIXME - * - * Copyright : Written by and Copyright (C) 2001-2008 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: actions.c,v $ - * Revision 1.56 2009/03/08 14:19:21 fabiankeil - * Fix justified (but harmless) compiler warnings - * on platforms where sizeof(int) < sizeof(long). - * - * Revision 1.55 2008/12/04 18:18:56 fabiankeil - * Fix some cparser warnings. - * - * Revision 1.54 2008/09/20 10:04:33 fabiankeil - * Remove hide-forwarded-for-headers action which has - * been obsoleted by change-x-forwarded-for{block}. - * - * Revision 1.53 2008/05/26 16:04:04 fabiankeil - * s@memorey@memory@ - * - * Revision 1.52 2008/04/27 16:26:59 fabiankeil - * White space fix for the last commit. - * - * Revision 1.51 2008/04/27 16:20:19 fabiankeil - * Complain about every block action without reason found. - * - * Revision 1.50 2008/03/30 14:52:00 fabiankeil - * Rename load_actions_file() and load_re_filterfile() - * as they load multiple files "now". - * - * Revision 1.49 2008/03/29 12:13:45 fabiankeil - * Remove send-wafer and send-vanilla-wafer actions. - * - * Revision 1.48 2008/03/28 18:17:14 fabiankeil - * In action_used_to_be_valid(), loop through an array of formerly - * valid actions instead of using an OR-chain of strcmpic() calls. - * - * Revision 1.47 2008/03/28 15:13:37 fabiankeil - * Remove inspect-jpegs action. - * - * Revision 1.46 2008/03/27 18:27:20 fabiankeil - * Remove kill-popups action. - * - * Revision 1.45 2008/03/24 11:21:02 fabiankeil - * Share the action settings for multiple patterns in the same - * section so we waste less memory for gigantic block lists - * (and load them slightly faster). Reported by Franz Schwartau. - * - * Revision 1.44 2008/03/04 18:30:34 fabiankeil - * Remove the treat-forbidden-connects-like-blocks action. We now - * use the "blocked" page for forbidden CONNECT requests by default. - * - * Revision 1.43 2008/03/01 14:00:43 fabiankeil - * Let the block action take the reason for the block - * as argument and show it on the "blocked" page. - * - * Revision 1.42 2008/02/09 15:15:38 fabiankeil - * List active and inactive actions in the show-url-info's - * "Final results" section separately. Patch submitted by Lee - * in #1830056, modified to list active actions first. - * - * Revision 1.41 2008/01/28 20:17:40 fabiankeil - * - Mark some parameters as immutable. - * - Hide update_action_bits_for_all_tags() while it's unused. - * - * Revision 1.40 2007/05/21 10:26:50 fabiankeil - * - Use strlcpy() instead of strcpy(). - * - Provide a reason why loading the actions - * file might have failed. - * - * Revision 1.39 2007/04/17 18:21:45 fabiankeil - * Split update_action_bits() into - * update_action_bits_for_all_tags() - * and update_action_bits_for_tag(). - * - * Revision 1.38 2007/04/15 16:39:20 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.37 2007/03/11 15:56:12 fabiankeil - * Add kludge to log unknown aliases and actions before exiting. - * - * Revision 1.36 2006/12/28 17:15:42 fabiankeil - * Fix gcc43 conversion warning. - * - * Revision 1.35 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.32.2.6 2006/01/29 23:10:56 david__schmidt - * Multiple filter file support - * - * Revision 1.32.2.5 2005/06/09 01:18:41 david__schmidt - * Tweaks to conditionally include pthread.h if FEATURE_PTHREAD is enabled - - * this becomes important when jcc.h gets included later down the line. - * - * Revision 1.32.2.4 2003/12/03 10:33:11 oes - * - Implemented Privoxy version requirement through - * for-privoxy-version= statement in {{settings}} - * block - * - Fix for unchecked out-of-memory condition - * - * Revision 1.32.2.3 2003/02/28 12:52:10 oes - * Fixed memory leak reported by Dan Price in Bug #694713 - * - * Revision 1.32.2.2 2002/11/20 14:36:55 oes - * Extended unload_current_actions_file() to multiple AFs. - * Thanks to Oliver Stoeneberg for the hint. - * - * Revision 1.32.2.1 2002/05/26 12:13:16 roro - * Change unsigned to unsigned long in actions_name struct. This closes - * SourceForge Bug #539284. - * - * Revision 1.32 2002/05/12 21:36:29 jongfoster - * Correcting function comments - * - * Revision 1.31 2002/05/06 07:56:50 oes - * Made actions_to_html independent of FEATURE_CGI_EDIT_ACTIONS - * - * Revision 1.30 2002/04/30 11:14:52 oes - * Made csp the first parameter in *action_to_html - * - * Revision 1.29 2002/04/26 19:30:54 jongfoster - * - current_action_to_html(): Adding help link for the "-" form of - * one-string actions. - * - Some actions had "<br>-", some "<br> -" (note the space). - * Standardizing on no space. - * - Greatly simplifying some of the code by using string_join() - * where appropriate. - * - * Revision 1.28 2002/04/26 12:53:15 oes - * - CGI AF editor now writes action lines split into - * single lines with line continuation - * - actions_to_html now embeds each action name in - * link to chapter - * - current_action_to_text is now called current_action_to_html - * and acts like actions_to_html - * - * Revision 1.27 2002/04/24 02:10:31 oes - * - Jon's patch for multiple AFs: - * - split load_actions_file, add load_one_actions_file - * - make csp->actions_list files an array - * - remember file id with each action - * - Copy_action now frees dest action before copying - * - * Revision 1.26 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.6 2001/06/07 23:04:34 jongfoster - * Made get_actions() static. - * - * Revision 1.5 2001/06/03 19:11:48 oes - * adapted to new enlist_unique arg format - * - * Revision 1.4 2001/06/01 20:03:42 jongfoster - * Better memory management - current_action->strings[] now - * contains copies of the strings, not the original. - * - * Revision 1.3 2001/06/01 18:49:17 jongfoster - * Replaced "list_share" with "list" - the tiny memory gain was not - * worth the extra complexity. - * - * Revision 1.2 2001/05/31 21:40:00 jongfoster - * Removing some commented out, obsolete blocks of code. - * - * Revision 1.1 2001/05/31 21:16:46 jongfoster - * Moved functions to process the action list into this new file. - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include <stdlib.h> - -#ifdef FEATURE_PTHREAD -#include <pthread.h> -#endif - -#include "project.h" -#include "jcc.h" -#include "list.h" -#include "actions.h" -#include "miscutil.h" -#include "errlog.h" -#include "loaders.h" -#include "encode.h" -#include "urlmatch.h" -#include "cgi.h" -#include "ssplit.h" - -const char actions_h_rcs[] = ACTIONS_H_VERSION; - - -/* - * We need the main list of options. - * - * First, we need a way to tell between boolean, string, and multi-string - * options. For string and multistring options, we also need to be - * able to tell the difference between a "+" and a "-". (For bools, - * the "+"/"-" information is encoded in "add" and "mask"). So we use - * an enumerated type (well, the preprocessor equivalent). Here are - * the values: - */ -#define AV_NONE 0 /* +opt -opt */ -#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 */ - -/* - * We need a structure to hold the name, flag changes, - * type, and string index. - */ -struct action_name -{ - const char * name; - unsigned long mask; /* a bit set to "0" = remove action */ - unsigned long add; /* a bit set to "1" = add action */ - int takes_value; /* an AV_... constant */ - int index; /* index into strings[] or multi[] */ -}; - -/* - * And with those building blocks in place, here's the array. - */ -static const struct action_name action_names[] = -{ - /* - * Well actually there's no data here - it's in actionlist.h - * This keeps it together to make it easy to change. - * - * Here's the macros used to format it: - */ -#define DEFINE_ACTION_MULTI(name,index) \ - { "+" name, ACTION_MASK_ALL, 0, AV_ADD_MULTI, index }, \ - { "-" name, ACTION_MASK_ALL, 0, AV_REM_MULTI, index }, -#define DEFINE_ACTION_STRING(name,flag,index) \ - { "+" name, ACTION_MASK_ALL, flag, AV_ADD_STRING, index }, \ - { "-" name, ~flag, 0, AV_REM_STRING, index }, -#define DEFINE_ACTION_BOOL(name,flag) \ - { "+" name, ACTION_MASK_ALL, flag }, \ - { "-" name, ~flag, 0 }, -#define DEFINE_ACTION_ALIAS 1 /* Want aliases please */ - -#include "actionlist.h" - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS - - { NULL, 0, 0 } /* End marker */ -}; - - -static int load_one_actions_file(struct client_state *csp, int fileid); - - -/********************************************************************* - * - * Function : merge_actions - * - * Description : Merge two actions together. - * Similar to "dest += src". - * - * Parameters : - * 1 : dest = Actions to modify. - * 2 : src = Action to add. - * - * Returns : JB_ERR_OK or JB_ERR_MEMORY - * - *********************************************************************/ -jb_err merge_actions (struct action_spec *dest, - const struct action_spec *src) -{ - int i; - jb_err err; - - dest->mask &= src->mask; - dest->add &= src->mask; - dest->add |= src->add; - - for (i = 0; i < ACTION_STRING_COUNT; i++) - { - char * str = src->string[i]; - if (str) - { - freez(dest->string[i]); - dest->string[i] = strdup(str); - if (NULL == dest->string[i]) - { - return JB_ERR_MEMORY; - } - } - } - - for (i = 0; i < ACTION_MULTI_COUNT; i++) - { - if (src->multi_remove_all[i]) - { - /* Remove everything from dest */ - list_remove_all(dest->multi_remove[i]); - dest->multi_remove_all[i] = 1; - - err = list_duplicate(dest->multi_add[i], src->multi_add[i]); - } - else if (dest->multi_remove_all[i]) - { - /* - * dest already removes everything, so we only need to worry - * 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]); - } - 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; - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : copy_action - * - * Description : Copy an action_specs. - * Similar to "dest = src". - * - * Parameters : - * 1 : dest = Destination of copy. - * 2 : src = Source for copy. - * - * Returns : N/A - * - *********************************************************************/ -jb_err copy_action (struct action_spec *dest, - const struct action_spec *src) -{ - int i; - jb_err err = JB_ERR_OK; - - free_action(dest); - memset(dest, '\0', sizeof(*dest)); - - dest->mask = src->mask; - dest->add = src->add; - - for (i = 0; i < ACTION_STRING_COUNT; i++) - { - char * str = src->string[i]; - if (str) - { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } - dest->string[i] = str; - } - } - - 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; - } - } - return err; -} - -/********************************************************************* - * - * Function : free_action_spec - * - * Description : Frees an action_spec and the memory used by it. - * - * Parameters : - * 1 : src = Source to free. - * - * Returns : N/A - * - *********************************************************************/ -void free_action_spec(struct action_spec *src) -{ - free_action(src); - freez(src); -} - - -/********************************************************************* - * - * Function : free_action - * - * Description : Destroy an action_spec. Frees memory used by it, - * except for the memory used by the struct action_spec - * itself. - * - * Parameters : - * 1 : src = Source to free. - * - * Returns : N/A - * - *********************************************************************/ -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]); - } - - for (i = 0; i < ACTION_MULTI_COUNT; i++) - { - destroy_list(src->multi_remove[i]); - destroy_list(src->multi_add[i]); - } - - memset(src, '\0', sizeof(*src)); -} - - -/********************************************************************* - * - * Function : get_action_token - * - * Description : Parses a line for the first action. - * Modifies it's input array, doesn't allocate memory. - * e.g. given: - * *line=" +abc{def} -ghi " - * Returns: - * *line=" -ghi " - * *name="+abc" - * *value="def" - * - * Parameters : - * 1 : line = [in] The line containing the action. - * [out] Start of next action on line, or - * NULL if we reached the end of line before - * we found an action. - * 2 : name = [out] Start of action name, null - * terminated. NULL on EOL - * 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) - * - *********************************************************************/ -jb_err get_action_token(char **line, char **name, char **value) -{ - char * str = *line; - char ch; - - /* set default returns */ - *line = NULL; - *name = NULL; - *value = NULL; - - /* Eat any leading whitespace */ - while ((*str == ' ') || (*str == '\t')) - { - str++; - } - - if (*str == '\0') - { - return 0; - } - - if (*str == '{') - { - /* null name, just value is prohibited */ - return JB_ERR_PARSE; - } - - *name = str; - - /* parse option */ - while (((ch = *str) != '\0') && - (ch != ' ') && (ch != '\t') && (ch != '{')) - { - if (ch == '}') - { - /* error, '}' without '{' */ - return JB_ERR_PARSE; - } - str++; - } - *str = '\0'; - - if (ch != '{') - { - /* no value */ - if (ch == '\0') - { - /* EOL - be careful not to run off buffer */ - *line = str; - } - else - { - /* More to parse next time. */ - *line = str + 1; - } - return JB_ERR_OK; - } - - str++; - *value = str; - - str = strchr(str, '}'); - if (str == NULL) - { - /* error */ - *value = NULL; - return JB_ERR_PARSE; - } - - /* got value */ - *str = '\0'; - *line = str + 1; - - chomp(*value); - - return JB_ERR_OK; -} - -/********************************************************************* - * - * Function : action_used_to_be_valid - * - * Description : Checks if unrecognized actions were valid in earlier - * releases. - * - * Parameters : - * 1 : action = The string containing the action to check. - * - * Returns : True if yes, otherwise false. - * - *********************************************************************/ -static int action_used_to_be_valid(const char *action) -{ - static const char *formerly_valid_actions[] = { - "inspect-jpegs", - "kill-popups", - "send-vanilla-wafer", - "send-wafer", - "treat-forbidden-connects-like-blocks", - "vanilla-wafer", - "wafer" - }; - unsigned int i; - - for (i = 0; i < SZ(formerly_valid_actions); i++) - { - if (0 == strcmpic(action, formerly_valid_actions[i])) - { - return TRUE; - } - } - - return FALSE; -} - -/********************************************************************* - * - * Function : get_actions - * - * Description : Parses a list of actions. - * - * Parameters : - * 1 : line = The string containing the actions. - * Will be written to by this function. - * 2 : alias_list = Custom alias list, or NULL for none. - * 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) - * - *********************************************************************/ -jb_err get_actions(char *line, - struct action_alias * alias_list, - struct action_spec *cur_action) -{ - jb_err err; - init_action(cur_action); - cur_action->mask = ACTION_MASK_ALL; - - while (line) - { - char * option = NULL; - char * value = NULL; - - err = get_action_token(&line, &option, &value); - if (err) - { - return err; - } - - if (option) - { - /* handle option in 'option' */ - - /* Check for standard action name */ - const struct action_name * action = action_names; - - while ( (action->name != NULL) && (0 != strcmpic(action->name, option)) ) - { - action++; - } - if (action->name != NULL) - { - /* Found it */ - cur_action->mask &= action->mask; - cur_action->add &= action->mask; - cur_action->add |= action->add; - - switch (action->takes_value) - { - case AV_NONE: - /* ignore any option. */ - break; - case AV_ADD_STRING: - { - /* add single string. */ - - if ((value == NULL) || (*value == '\0')) - { - if (0 != strcmpic(action->name, "block")) - { - /* - * XXX: Temporary backwards compatibility hack. - * XXX: should include line number. - */ - value = "No reason specified."; - log_error(LOG_LEVEL_ERROR, - "block action without reason found. This may " - "become a fatal error in future versions."); - } - else - { - return JB_ERR_PARSE; - } - } - /* 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: - { - /* remove single string. */ - - freez (cur_action->string[action->index]); - break; - } - case AV_ADD_MULTI: - { - /* append multi string. */ - - struct list * remove_p = cur_action->multi_remove[action->index]; - struct list * add_p = cur_action->multi_add[action->index]; - - if ((value == NULL) || (*value == '\0')) - { - return JB_ERR_PARSE; - } - - list_remove_item(remove_p, value); - err = enlist_unique(add_p, value, 0); - if (err) - { - return err; - } - 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]; - - if ( (value == NULL) || (*value == '\0') - || ((*value == '*') && (value[1] == '\0')) ) - { - /* - * no option, or option == "*". - * - * Remove *ALL*. - */ - list_remove_all(remove_p); - list_remove_all(add_p); - cur_action->multi_remove_all[action->index] = 1; - } - else - { - /* Valid option - remove only 1 option */ - - 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; - } - } - list_remove_item(add_p, value); - } - break; - } - default: - /* Shouldn't get here unless there's memory corruption. */ - assert(0); - return JB_ERR_PARSE; - } - } - else - { - /* try user aliases. */ - const struct action_alias * alias = alias_list; - - while ( (alias != NULL) && (0 != strcmpic(alias->name, option)) ) - { - alias = alias->next; - } - if (alias != NULL) - { - /* Found it */ - merge_actions(cur_action, alias->action); - } - else if (((size_t)2 < strlen(option)) && action_used_to_be_valid(option+1)) - { - log_error(LOG_LEVEL_ERROR, "Action '%s' is no longer valid " - "in this Privoxy release. Ignored.", option+1); - } - else if (((size_t)2 < strlen(option)) && 0 == strcmpic(option+1, "hide-forwarded-for-headers")) - { - log_error(LOG_LEVEL_FATAL, "The action 'hide-forwarded-for-headers' " - "is no longer valid in this Privoxy release. " - "Use 'change-x-forwarded-for' instead."); - } - else - { - /* Bad action name */ - /* - * XXX: This is a fatal error and Privoxy will later on exit - * in load_one_actions_file() because of an "invalid line". - * - * It would be preferable to name the offending option in that - * error message, but currently there is no way to do that and - * we have to live with two error messages for basically the - * same reason. - */ - log_error(LOG_LEVEL_ERROR, "Unknown action or alias: %s", option); - return JB_ERR_PARSE; - } - } - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : init_current_action - * - * Description : Zero out an action. - * - * Parameters : - * 1 : dest = An uninitialized current_action_spec. - * - * Returns : N/A - * - *********************************************************************/ -void init_current_action (struct current_action_spec *dest) -{ - memset(dest, '\0', sizeof(*dest)); - - dest->flags = ACTION_MOST_COMPATIBLE; -} - - -/********************************************************************* - * - * Function : init_action - * - * Description : Zero out an action. - * - * Parameters : - * 1 : dest = An uninitialized action_spec. - * - * Returns : N/A - * - *********************************************************************/ -void init_action (struct action_spec *dest) -{ - memset(dest, '\0', sizeof(*dest)); -} - - -/********************************************************************* - * - * Function : merge_current_action - * - * Description : Merge two actions together. - * Similar to "dest += src". - * Differences between this and merge_actions() - * 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"). - * Also, there is no mask or remove lists in dest. - * (If we're applying it to a URL, we don't need them) - * - * Parameters : - * 1 : dest = Current actions, to modify. - * 2 : src = Action to add. - * - * Returns 0 : no error - * !=0 : error, probably JB_ERR_MEMORY. - * - *********************************************************************/ -jb_err 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; - - for (i = 0; i < ACTION_STRING_COUNT; i++) - { - char * str = src->string[i]; - if (str) - { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } - freez(dest->string[i]); - dest->string[i] = str; - } - } - - for (i = 0; i < ACTION_MULTI_COUNT; i++) - { - 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; - } - } - 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; - } - } - } - return err; -} - -#if 0 -/********************************************************************* - * - * Function : update_action_bits_for_all_tags - * - * Description : Updates the action bits based on all matching tags. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : 0 if no tag matched, or - * 1 otherwise - * - *********************************************************************/ -int update_action_bits_for_all_tags(struct client_state *csp) -{ - struct list_entry *tag; - int updated = 0; - - for (tag = csp->tags->first; tag != NULL; tag = tag->next) - { - if (update_action_bits_for_tag(csp, tag->str)) - { - updated = 1; - } - } - - return updated; -} -#endif - -/********************************************************************* - * - * Function : update_action_bits_for_tag - * - * Description : Updates the action bits based on the action sections - * whose tag patterns match a provided tag. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : tag = The tag on which the update should be based on - * - * Returns : 0 if no tag matched, or - * 1 otherwise - * - *********************************************************************/ -int update_action_bits_for_tag(struct client_state *csp, const char *tag) -{ - struct file_list *fl; - struct url_actions *b; - - int updated = 0; - int i; - - assert(tag); - assert(list_contains_item(csp->tags, tag)); - - /* Run through all action files, */ - for (i = 0; i < MAX_AF_FILES; i++) - { - if (((fl = csp->actions_list[i]) == NULL) || ((b = fl->f) == NULL)) - { - /* Skip empty files */ - continue; - } - - /* and through all the action patterns, */ - for (b = b->next; NULL != b; b = b->next) - { - /* skip the URL patterns, */ - if (NULL == b->url->tag_regex) - { - continue; - } - - /* and check if one of the tag patterns matches the tag, */ - if (0 == regexec(b->url->tag_regex, tag, 0, NULL, 0)) - { - /* if it does, update the action bit map, */ - if (merge_current_action(csp->action, b->action)) - { - log_error(LOG_LEVEL_ERROR, - "Out of memory while changing action bits"); - } - /* and signal the change. */ - updated = 1; - } - } - } - - return updated; -} - - -/********************************************************************* - * - * Function : free_current_action - * - * Description : Free memory used by a current_action_spec. - * Does not free the current_action_spec itself. - * - * Parameters : - * 1 : src = Source to free. - * - * Returns : N/A - * - *********************************************************************/ -void free_current_action (struct current_action_spec *src) -{ - int i; - - for (i = 0; i < ACTION_STRING_COUNT; i++) - { - freez(src->string[i]); - } - - for (i = 0; i < ACTION_MULTI_COUNT; i++) - { - destroy_list(src->multi[i]); - } - - memset(src, '\0', sizeof(*src)); -} - - -static struct file_list *current_actions_file[MAX_AF_FILES] = { - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, 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) -{ - int i; - - for (i = 0; i < MAX_AF_FILES; i++) - { - if (current_actions_file[i]) - { - current_actions_file[i]->unloader = unload_actions_file; - current_actions_file[i] = NULL; - } - } -} -#endif /* FEATURE_GRACEFUL_TERMINATION */ - - -/********************************************************************* - * - * Function : unload_actions_file - * - * Description : Unloads an actions module. - * - * Parameters : - * 1 : file_data = the data structure associated with the - * actions file. - * - * Returns : N/A - * - *********************************************************************/ -void unload_actions_file(void *file_data) -{ - struct url_actions * next; - struct url_actions * cur = (struct url_actions *)file_data; - while (cur != NULL) - { - next = cur->next; - free_url_spec(cur->url); - if ((next == NULL) || (next->action != cur->action)) - { - /* - * As the action settings might be shared, - * we can only free them if the current - * url pattern is the last one, or if the - * next one is using different settings. - */ - free_action_spec(cur->action); - } - freez(cur); - cur = next; - } -} - - -/********************************************************************* - * - * Function : free_alias_list - * - * Description : Free memory used by a list of aliases. - * - * Parameters : - * 1 : alias_list = Linked list to free. - * - * Returns : N/A - * - *********************************************************************/ -void free_alias_list(struct action_alias *alias_list) -{ - while (alias_list != NULL) - { - struct action_alias * next = alias_list->next; - alias_list->next = NULL; - freez(alias_list->name); - free_action(alias_list->action); - free(alias_list); - alias_list = next; - } -} - - -/********************************************************************* - * - * Function : load_action_files - * - * Description : Read and parse all the action files and add to files - * list. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int load_action_files(struct client_state *csp) -{ - int i; - int result; - - for (i = 0; i < MAX_AF_FILES; i++) - { - if (csp->config->actions_file[i]) - { - result = load_one_actions_file(csp, i); - if (result) - { - return result; - } - } - else if (current_actions_file[i]) - { - current_actions_file[i]->unloader = unload_actions_file; - current_actions_file[i] = NULL; - } - } - - return 0; -} - -/********************************************************************* - * - * Function : load_one_actions_file - * - * Description : Read and parse a action file and add to files - * list. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : fileid = File index to load. - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -static int load_one_actions_file(struct client_state *csp, int fileid) -{ - - /* - * 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; - - 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; - struct action_alias * alias_list = NULL; - unsigned long linenum = 0; - - if (!check_file_changed(current_actions_file[fileid], csp->config->actions_file[fileid], &fs)) - { - /* No need to load */ - csp->actions_list[fileid] = current_actions_file[fileid]; - return 0; - } - if (!fs) - { - log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': %E. " - "Note that beginning with Privoxy 3.0.7, actions files have to be specified " - "with their complete file names.", csp->config->actions_file[fileid]); - return 1; /* never get here */ - } - - fs->f = last_perm = (struct url_actions *)zalloc(sizeof(*last_perm)); - if (last_perm == NULL) - { - log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': out of memory!", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } - - if ((fp = fopen(csp->config->actions_file[fileid], "r")) == NULL) - { - log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': error opening file: %E", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } - - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) - { - if (*buf == '{') - { - /* It's a header block */ - if (buf[1] == '{') - { - /* It's {{settings}} or {{alias}} */ - size_t len = strlen(buf); - char * start = buf + 2; - char * end = buf + len - 1; - if ((len < (size_t)5) || (*end-- != '}') || (*end-- != '}')) - { - /* too short */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file[fileid], linenum, buf); - return 1; /* never get here */ - } - - /* Trim leading and trailing whitespace. */ - end[1] = '\0'; - chomp(start); - - if (*start == '\0') - { - /* too short */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): {{ }}", - csp->config->actions_file[fileid], linenum); - 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[fileid], 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[fileid], linenum); - } - mode = MODE_DESCRIPTION; - } - else 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[fileid], 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[fileid], linenum, start); - return 1; /* never get here */ - } - } - else - { - /* It's an actions block */ - - char actions_buf[BUFFER_SIZE]; - char * end; - - /* set mode */ - mode = MODE_ACTIONS; - - /* free old action */ - if (cur_action) - { - if (!cur_action_used) - { - free_action_spec(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[fileid]); - return 1; /* never get here */ - } - init_action(cur_action); - - /* trim { */ - strlcpy(actions_buf, buf + 1, sizeof(actions_buf)); - - /* check we have a trailing } and then trim it */ - end = actions_buf + strlen(actions_buf) - 1; - if (*end != '}') - { - /* No closing } */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file[fileid], linenum, buf); - return 1; /* never get here */ - } - *end = '\0'; - - /* trim any whitespace immediately inside {} */ - chomp(actions_buf); - - 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[fileid], linenum, buf); - return 1; /* never get here */ - } - } - } - else if (mode == MODE_SETTINGS) - { - /* - * Part of the {{settings}} block. - * For now only serves to check if the file's minimum Privoxy - * version requirement is met, but we may want to read & check - * permissions when we go multi-user. - */ - if (!strncmp(buf, "for-privoxy-version=", 20)) - { - char *version_string, *fields[3]; - int num_fields; - - if ((version_string = strdup(buf + 20)) == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory!", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } - - num_fields = ssplit(version_string, ".", fields, 3, TRUE, FALSE); - - if (num_fields < 1 || atoi(fields[0]) == 0) - { - log_error(LOG_LEVEL_ERROR, - "While loading actions file '%s': invalid line (%lu): %s", - csp->config->actions_file[fileid], linenum, buf); - } - else if ( atoi(fields[0]) > VERSION_MAJOR - || (num_fields > 1 && atoi(fields[1]) > VERSION_MINOR) - || (num_fields > 2 && atoi(fields[2]) > VERSION_POINT)) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "Actions file '%s', line %lu requires newer Privoxy version: %s", - csp->config->actions_file[fileid], linenum, buf ); - return 1; /* never get here */ - } - free(version_string); - } - } - else if (mode == MODE_DESCRIPTION) - { - /* - * Part of the {{description}} block. - * Ignore for now. - */ - } - else if (mode == MODE_ALIAS) - { - /* - * define an alias - */ - char actions_buf[BUFFER_SIZE]; - struct action_alias * new_alias; - - 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[fileid], linenum, buf); - return 1; /* never get here */ - } - - if ((new_alias = zalloc(sizeof(*new_alias))) == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory!", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } - - /* Eat any the whitespace before the '=' */ - end--; - while ((*end == ' ') || (*end == '\t')) - { - /* - * we already know we must have at least 1 non-ws char - * at start of buf - no need to check - */ - end--; - } - end[1] = '\0'; - - /* Eat any the whitespace after the '=' */ - start++; - while ((*start == ' ') || (*start == '\t')) - { - start++; - } - if (*start == '\0') - { - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s", - csp->config->actions_file[fileid], linenum, buf); - return 1; /* never get here */ - } - - if ((new_alias->name = strdup(buf)) == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory!", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } - - strlcpy(actions_buf, start, sizeof(actions_buf)); - - if (get_actions(actions_buf, alias_list, new_alias->action)) - { - /* error */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s = %s", - csp->config->actions_file[fileid], linenum, buf, start); - return 1; /* never get here */ - } - - /* add to list */ - new_alias->next = alias_list; - alias_list = new_alias; - } - else if (mode == MODE_ACTIONS) - { - /* it's a URL pattern */ - - /* allocate a new node */ - if ((perm = zalloc(sizeof(*perm))) == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory!", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } - - perm->action = cur_action; - cur_action_used = 1; - - /* Save the URL pattern */ - 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[fileid], linenum, buf); - return 1; /* never get here */ - } - - /* add it to the list */ - last_perm->next = perm; - last_perm = perm; - } - else if (mode == MODE_START_OF_FILE) - { - /* 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[fileid], linenum, buf); - return 1; /* never get here */ - } - else - { - /* How did we get here? This is impossible! */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': INTERNAL ERROR - mode = %d", - csp->config->actions_file[fileid], mode); - return 1; /* never get here */ - } - } - - fclose(fp); - - if (!cur_action_used) - { - free_action_spec(cur_action); - } - free_alias_list(alias_list); - - /* the old one is now obsolete */ - if (current_actions_file[fileid]) - { - current_actions_file[fileid]->unloader = unload_actions_file; - } - - fs->next = files->next; - files->next = fs; - current_actions_file[fileid] = fs; - - csp->actions_list[fileid] = fs; - - return(0); - -} - - -/********************************************************************* - * - * Function : actions_to_text - * - * Description : Converts a actionsfile entry from the internal - * structure into a text line. The output is split - * into one line for each action with line continuation. - * - * Parameters : - * 1 : action = The action to format. - * - * Returns : A string. Caller must free it. - * NULL on out-of-memory error. - * - *********************************************************************/ -char * actions_to_text(const struct action_spec *action) -{ - unsigned long mask = action->mask; - unsigned long 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 " \\n"); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, " +" __name " \\n"); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, " -" __name " \\n"); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, action->string[__index]); \ - string_append(&result, "} \\n"); \ - } - -#define DEFINE_ACTION_MULTI(__name, __index) \ - if (action->multi_remove_all[__index]) \ - { \ - string_append(&result, " -" __name " \\n"); \ - } \ - else \ - { \ - lst = action->multi_remove[__index]->first; \ - while (lst) \ - { \ - string_append(&result, " -" __name "{"); \ - string_append(&result, lst->str); \ - string_append(&result, "} \\n"); \ - lst = lst->next; \ - } \ - } \ - lst = action->multi_add[__index]->first; \ - while (lst) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, lst->str); \ - string_append(&result, "} \\n"); \ - 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 : actions_to_html - * - * Description : Converts a actionsfile entry from numeric form - * ("mask" and "add") to a <br>-seperated HTML string - * in which each action is linked to its chapter in - * the user manual. - * - * Parameters : - * 1 : csp = Client state (for config) - * 2 : action = Action spec to be converted - * - * Returns : A string. Caller must free it. - * NULL on out-of-memory error. - * - *********************************************************************/ -char * actions_to_html(const struct client_state *csp, - const struct action_spec *action) -{ - unsigned long mask = action->mask; - unsigned long 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, "\n<br>-"); \ - string_join(&result, add_help_link(__name, csp->config)); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, "\n<br>+"); \ - string_join(&result, add_help_link(__name, csp->config)); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, "\n<br>-"); \ - string_join(&result, add_help_link(__name, csp->config)); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, "\n<br>+"); \ - string_join(&result, add_help_link(__name, csp->config)); \ - string_append(&result, "{"); \ - string_join(&result, html_encode(action->string[__index])); \ - string_append(&result, "}"); \ - } - -#define DEFINE_ACTION_MULTI(__name, __index) \ - if (action->multi_remove_all[__index]) \ - { \ - string_append(&result, "\n<br>-"); \ - string_join(&result, add_help_link(__name, csp->config)); \ - } \ - else \ - { \ - lst = action->multi_remove[__index]->first; \ - while (lst) \ - { \ - string_append(&result, "\n<br>-"); \ - string_join(&result, add_help_link(__name, csp->config)); \ - string_append(&result, "{"); \ - string_join(&result, html_encode(lst->str)); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } \ - } \ - lst = action->multi_add[__index]->first; \ - while (lst) \ - { \ - string_append(&result, "\n<br>+"); \ - string_join(&result, add_help_link(__name, csp->config)); \ - string_append(&result, "{"); \ - string_join(&result, html_encode(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 - - /* trim leading <br> */ - if (result && *result) - { - char * s = result; - result = strdup(result + 5); - free(s); - } - - return result; -} - - -/********************************************************************* - * - * Function : current_actions_to_html - * - * Description : Converts a curren action spec to a <br> seperated HTML - * text in which each action is linked to its chapter in - * the user manual. - * - * Parameters : - * 1 : csp = Client state (for config) - * 2 : action = Current action spec to be converted - * - * Returns : A string. Caller must free it. - * NULL on out-of-memory error. - * - *********************************************************************/ -char *current_action_to_html(const struct client_state *csp, - const struct current_action_spec *action) -{ - unsigned long flags = action->flags; - struct list_entry * lst; - char *result = strdup(""); - char *active = strdup(""); - char *inactive = strdup(""); - -#define DEFINE_ACTION_BOOL(__name, __bit) \ - if (flags & __bit) \ - { \ - string_append(&active, "\n<br>+"); \ - string_join(&active, add_help_link(__name, csp->config)); \ - } \ - else \ - { \ - string_append(&inactive, "\n<br>-"); \ - string_join(&inactive, add_help_link(__name, csp->config)); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (flags & __bit) \ - { \ - string_append(&active, "\n<br>+"); \ - string_join(&active, add_help_link(__name, csp->config)); \ - string_append(&active, "{"); \ - string_join(&active, html_encode(action->string[__index])); \ - string_append(&active, "}"); \ - } \ - else \ - { \ - string_append(&inactive, "\n<br>-"); \ - string_join(&inactive, add_help_link(__name, csp->config)); \ - } - -#define DEFINE_ACTION_MULTI(__name, __index) \ - lst = action->multi[__index]->first; \ - if (lst == NULL) \ - { \ - string_append(&inactive, "\n<br>-"); \ - string_join(&inactive, add_help_link(__name, csp->config)); \ - } \ - else \ - { \ - while (lst) \ - { \ - string_append(&active, "\n<br>+"); \ - string_join(&active, add_help_link(__name, csp->config)); \ - string_append(&active, "{"); \ - string_join(&active, html_encode(lst->str)); \ - string_append(&active, "}"); \ - 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 - - if (active != NULL) - { - string_append(&result, active); - freez(active); - } - string_append(&result, "\n<br>"); - if (inactive != NULL) - { - string_append(&result, inactive); - freez(inactive); - } - return result; -} diff --git a/external/privoxy/actions.h b/external/privoxy/actions.h deleted file mode 100644 index 733a853..0000000 --- a/external/privoxy/actions.h +++ /dev/null @@ -1,187 +0,0 @@ -#ifndef ACTIONS_H_INCLUDED -#define ACTIONS_H_INCLUDED -#define ACTIONS_H_VERSION "$Id: actions.h,v 1.18 2008/03/30 14:52:00 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/actions.h,v $ - * - * Purpose : Declares functions to work with actions files - * Functions declared include: FIXME - * - * Copyright : Written by and Copyright (C) 2001-2007 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: actions.h,v $ - * Revision 1.18 2008/03/30 14:52:00 fabiankeil - * Rename load_actions_file() and load_re_filterfile() - * as they load multiple files "now". - * - * Revision 1.17 2008/01/28 20:17:40 fabiankeil - * - Mark some parameters as immutable. - * - Hide update_action_bits_for_all_tags() while it's unused. - * - * Revision 1.16 2007/04/17 18:21:45 fabiankeil - * Split update_action_bits() into - * update_action_bits_for_all_tags() - * and update_action_bits_for_tag(). - * - * Revision 1.15 2007/04/15 16:39:20 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.14 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.12 2002/05/06 07:56:50 oes - * Made actions_to_html independent of FEATURE_CGI_EDIT_ACTIONS - * - * Revision 1.11 2002/04/30 11:14:52 oes - * Made csp the first parameter in *action_to_html - * - * Revision 1.10 2002/04/26 12:53:33 oes - * - actions_to_html signature change - * - current_action_to_text: renamed to current_action_to_html - * and signature change - * - * Revision 1.9 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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. - * - * - *********************************************************************/ - - -#ifdef __cplusplus -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); -#if 0 -extern int update_action_bits_for_all_tags(struct client_state *csp); -#endif -extern int update_action_bits_for_tag(struct client_state *csp, const char *tag); -extern jb_err copy_action (struct action_spec *dest, - const struct action_spec *src); -extern char * actions_to_text (const struct action_spec *action); -extern char * actions_to_html (const struct client_state *csp, - const struct action_spec *action); -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, - const struct action_spec *src); -extern char * current_action_to_html(const struct client_state *csp, - const struct current_action_spec *action); - -extern jb_err get_action_token(char **line, char **name, char **value); -extern void unload_actions_file(void *file_data); -extern int load_action_files(struct client_state *csp); - -#ifdef FEATURE_GRACEFUL_TERMINATION -void unload_current_actions_file(void); -#endif - - -/* Revision control strings from this header and associated .c file */ -extern const char actions_rcs[]; -extern const char actions_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef ACTIONS_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ - diff --git a/external/privoxy/amiga.c b/external/privoxy/amiga.c deleted file mode 100644 index 68193fb..0000000 --- a/external/privoxy/amiga.c +++ /dev/null @@ -1,341 +0,0 @@ -const char amiga_rcs[] = "$Id: amiga.c,v 1.12 2007/01/07 07:40:52 joergs Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/amiga.c,v $ - * - * Purpose : Amiga-specific declarations. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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: amiga.c,v $ - * Revision 1.12 2007/01/07 07:40:52 joergs - * Added AmigaOS4 support and made it work on AmigaOS 3.x with current sources. - * - * Revision 1.11 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.9 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * - *********************************************************************/ - - -#include "config.h" - -#ifdef AMIGA - -#include <stdio.h> -#include <signal.h> - -#include "project.h" - -const char amiga_h_rcs[] = AMIGA_H_VERSION; - -static char *ver USED = "$VER: Privoxy " __AMIGAVERSION__ " (" __AMIGADATE__ ")"; -#ifdef __amigaos4__ -static char *stack USED = "$STACK: 524288"; -#else -unsigned long __stack = 100*1024; -#endif -struct Task *main_task = NULL; -int childs = 0; - -void serve(struct client_state *csp); - -SAVEDS ULONG server_thread(void) -{ - struct client_state *local_csp; - struct UserData UserData; - struct Task *me=FindTask(NULL); -#ifdef __amigaos4__ - struct Library *SocketBase; -#endif - - Wait(SIGF_SINGLE); - local_csp=(struct client_state *)(me->tc_UserData); - me->tc_UserData=&UserData; - SocketBase=(APTR)OpenLibrary("bsdsocket.library",3); - if (SocketBase) -#ifdef __amigaos4__ - { - ISocket = (struct SocketIFace *)GetInterface(SocketBase, "main", 1, NULL); - } - if (ISocket) -#endif - { - SetErrnoPtr(&(UserData.eno),sizeof(int)); - local_csp->cfd=ObtainSocket(local_csp->cfd, AF_INET, SOCK_STREAM, 0); - if(JB_INVALID_SOCKET!=local_csp->cfd) - { - Signal(main_task,SIGF_SINGLE); - serve((struct client_state *) local_csp); - } else { - local_csp->flags &= ~CSP_FLAG_ACTIVE; - Signal(main_task,SIGF_SINGLE); - } -#ifdef __amigaos4__ - DropInterface((struct Interface *)ISocket); -#endif - CloseLibrary(SocketBase); - } else { -#ifdef __amigaos4__ - CloseLibrary(SocketBase); -#endif - local_csp->flags &= ~CSP_FLAG_ACTIVE; - Signal(main_task,SIGF_SINGLE); - } - childs--; - return 0; -} - -static BPTR olddir; - -void amiga_exit(void) -{ -#ifdef __amigaos4__ - if (ISocket) -#else - if (SocketBase) -#endif - { -#ifdef __amigaos4__ - struct Library *SocketBase = ISocket->Data.LibBase; - DropInterface((struct Interface *)ISocket); -#endif - CloseLibrary(SocketBase); - } - CurrentDir(olddir); -} - -#ifndef __amigaos4__ -static struct SignalSemaphore memsem; -static struct SignalSemaphore *memsemptr = NULL; -#endif -static struct UserData GlobalUserData; - -void InitAmiga(void) -{ -#ifdef __amigaos4__ - struct Library *SocketBase; -#endif - - main_task = FindTask(NULL); - main_task->tc_UserData = &GlobalUserData; - - if (((struct Library *)SysBase)->lib_Version < 39) - { - exit(RETURN_FAIL); - } - - signal(SIGINT,SIG_IGN); - SocketBase = (APTR)OpenLibrary("bsdsocket.library",3); -#ifdef __amigaos4__ - if (SocketBase) - { - ISocket = (struct SocketIFace *)GetInterface(SocketBase, "main", 1, NULL); - } - if (!ISocket) -#else - if (!SocketBase) -#endif - { -#ifdef __amigaos4__ - CloseLibrary(SocketBase); -#endif - fprintf(stderr, "Can't open bsdsocket.library V3+\n"); - exit(RETURN_ERROR); - } - SetErrnoPtr(&(GlobalUserData.eno),sizeof(int)); -#ifndef __amigaos4__ - InitSemaphore(&memsem); - memsemptr = &memsem; -#endif - - olddir=CurrentDir(GetProgramDir()); - atexit(amiga_exit); -} - -#ifndef __amigaos4__ -#ifdef __GNUC__ -#ifdef libnix -/* multithreadingsafe libnix replacements */ -static void *memPool=NULL; - -void *malloc (size_t s) -{ - ULONG *mem; - LONG size = s; - - if (size<=0) - { - return NULL; - } - if (!memPool) - { - if (!(memPool=CreatePool(MEMF_ANY,32*1024,8*1024))) - { - return NULL; - } - } - size += sizeof(ULONG) + MEM_BLOCKMASK; - size &= ~MEM_BLOCKMASK; - if (memsemptr) - { - ObtainSemaphore(memsemptr); - } - if ((mem=AllocPooled(memPool,size))) - { - *mem++=size; - } - if (memsemptr) - { - ReleaseSemaphore(memsemptr); - } - return mem; -} - -void free (void *m) -{ - ULONG *mem = m; - - if(mem && memPool) - { - ULONG size=*--mem; - - if (memsemptr) - { - ObtainSemaphore(memsemptr); - } - FreePooled(memPool,mem,size); - if (memsemptr) - { - ReleaseSemaphore(memsemptr); - } - } -} - -void *realloc (void *old, size_t ns) -{ - void *new; - LONG osize, *o = old; - LONG nsize = ns; - - if (!old) - { - return malloc(nsize); - } - osize = (*(o-1)) - sizeof(ULONG); - if (nsize <= osize) - { - return old; - } - if ((new = malloc(nsize))) - { - ULONG *n = new; - - osize >>= 2; - while(osize--) - { - *n++ = *o++; - } - free(old); - } - return new; -} - -void __memCleanUp (void) -{ - if (memsemptr) - { - ObtainSemaphore(memsemptr); - } - if (memPool) - { - DeletePool(memPool); - } - if (memsemptr) - { - ReleaseSemaphore(memsemptr); - } -} - -#define ADD2LIST(a,b,c) asm(".stabs "_" #b ""," #c ",0,0,_" #a ) -#define ADD2EXIT(a,pri) ADD2LIST(a,__EXIT_LIST__,22); \ - asm(".stabs "___EXIT_LIST__",20,0,0," #pri "+128") -ADD2EXIT(__memCleanUp,-50); -#elif !defined(ixemul) -#error No libnix and no ixemul!? -#endif /* libnix */ -#else -#error Only GCC is supported, multithreading safe malloc/free required. -#endif /* __GNUC__ */ -#endif /* !__amigaos4__ */ - -#endif /* def AMIGA */ diff --git a/external/privoxy/amiga.h b/external/privoxy/amiga.h deleted file mode 100644 index 43ebda6..0000000 --- a/external/privoxy/amiga.h +++ /dev/null @@ -1,176 +0,0 @@ -#ifdef AMIGA -#ifndef AMIGA_H_INCLUDED -#define AMIGA_H_INCLUDED -#define AMIGA_H_VERSION "$Id: amiga.h,v 1.12 2007/01/07 07:40:52 joergs Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/amiga.h,v $ - * - * Purpose : Amiga-specific declarations. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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: amiga.h,v $ - * Revision 1.12 2007/01/07 07:40:52 joergs - * Added AmigaOS4 support and made it work on AmigaOS 3.x with current sources. - * - * Revision 1.11 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.9 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * 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 - * - * - *********************************************************************/ - - -#define _KERNEL -#include <sys/socket.h> -#undef _KERNEL - -#define __NOLIBBASE__ -#define __NOGLOBALIFACE__ -#include <proto/socket.h> -#undef __NOLIBBASE__ -#undef __NOGLOBALIFACE__ - -#define __CONSTLIBBASEDECL__ const -#include <proto/exec.h> -#include <exec/tasks.h> -#include <proto/dos.h> -#include <dos/dostags.h> - -struct UserData -{ -#ifdef __amigaos4__ - struct SocketIFace *si; -#else - struct Library *sb; -#endif - int eno; -}; - -#ifdef __amigaos4__ -#define ISocket (((struct UserData *)(FindTask(NULL)->tc_UserData))->si) -#undef errno -#else -#define SocketBase ((struct Library *)(((struct UserData *)(FindTask(NULL)->tc_UserData))->sb)) -#endif -#define errno (((struct UserData *)(FindTask(NULL)->tc_UserData))->eno) -#define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,NULL) -#define inet_ntoa(x) Inet_NtoA(x.s_addr) - -extern int childs; -extern struct Task *main_task; - -void InitAmiga(void); -void amiga_exit(void); -void __memCleanUp(void); -SAVEDS ULONG server_thread(void); - -#ifdef __amigaos4__ -#define exit(x) \ -{ \ - if(main_task) \ - { \ - if(main_task == FindTask(NULL)) \ - { \ - while(childs) Delay(10*TICKS_PER_SECOND); exit(x); \ - } \ - else \ - { \ - if (ISocket) \ - { \ - struct Library *sb = ISocket->Data.LibBase; \ - DropInterface((struct Interface *)ISocket); \ - CloseLibrary(sb); \ - } \ - childs--; \ - RemTask(NULL); \ - } \ - } \ - else \ - { \ - exit(x); \ - } \ -} -#else -#define exit(x) \ -{ \ - if(main_task) \ - { \ - if(main_task == FindTask(NULL)) \ - { \ - while(childs) Delay(10*TICKS_PER_SECOND); exit(x); \ - } \ - else \ - { \ - CloseLibrary(SocketBase); \ - childs--; \ - RemTask(NULL); \ - } \ - } \ - else \ - { \ - exit(x); \ - } \ -} - -#undef HAVE_RANDOM -#define h_errno 0 -#define HAVE_TIMEGM -#define timegm(tm) mktime(tm) -#endif /* __amigaos4__ */ - -#undef EINTR -#define EINTR 0 - -#endif /* ndef AMIGA_H_INCLUDED */ -#endif /* def AMIGA */ diff --git a/external/privoxy/cgi.c b/external/privoxy/cgi.c deleted file mode 100644 index 61ff069..0000000 --- a/external/privoxy/cgi.c +++ /dev/null @@ -1,2987 +0,0 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.116 2009/03/15 14:59:34 fabiankeil 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-2004, 2006-2008 - * 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: cgi.c,v $ - * Revision 1.116 2009/03/15 14:59:34 fabiankeil - * Cosmetics. - * - * Revision 1.115 2009/03/01 18:28:23 fabiankeil - * Help clang understand that we aren't dereferencing - * NULL pointers here. - * - * Revision 1.114 2008/12/04 18:15:04 fabiankeil - * Fix some cparser warnings. - * - * Revision 1.113 2008/09/04 08:13:58 fabiankeil - * Prepare for critical sections on Windows by adding a - * layer of indirection before the pthread mutex functions. - * - * Revision 1.112 2008/08/31 16:08:12 fabiankeil - * "View the request headers" isn't more equal than the other - * menu items and thus doesn't need a trailing dot either. - * - * Revision 1.111 2008/08/31 15:59:02 fabiankeil - * There's no reason to let remote toggling support depend - * on FEATURE_CGI_EDIT_ACTIONS, so make sure it doesn't. - * - * Revision 1.110 2008/08/31 14:55:43 fabiankeil - * Add a @date@ symbol to include a date(1)-like time string - * in templates. Modified version of the patch Endre Szabo - * submitted in #2026468. - * - * Revision 1.109 2008/07/26 09:40:27 fabiankeil - * Remove the unconditional block in get_http_time(). - * It's pointless now that it's no longer used to limit - * dummy's scope. While at it, remove obvious comments - * and a trailing space. - * - * Revision 1.108 2008/05/26 17:30:53 fabiankeil - * Provide an OpenSearch Description to access the - * show-url-info page through "search engine plugins". - * - * Revision 1.107 2008/05/26 16:23:19 fabiankeil - * - Fix spelling in template-not-found message. - * - Declare referrer_is_safe()'s alternative_prefix[] static. - * - * Revision 1.106 2008/05/21 15:24:38 fabiankeil - * Mark csp as immutable for a bunch of functions. - * - * Revision 1.105 2008/04/17 14:40:47 fabiankeil - * Provide get_http_time() with the buffer size so it doesn't - * have to blindly assume that the buffer is big enough. - * - * Revision 1.104 2008/03/26 18:07:06 fabiankeil - * Add hostname directive. Closes PR#1918189. - * - * Revision 1.103 2008/03/21 11:13:57 fabiankeil - * Only gather host information if it's actually needed. - * Also move the code out of accept_connection() so it's less likely - * to delay other incoming connections if the host is misconfigured. - * - * Revision 1.102 2008/02/23 16:33:43 fabiankeil - * Let forward_url() use the standard parameter ordering - * and mark its second parameter immutable. - * - * Revision 1.101 2008/02/03 15:45:06 fabiankeil - * Add SOCKS5 support for "Forwarding failure" CGI page. - * - * Revision 1.100 2007/10/17 18:40:53 fabiankeil - * - Send CGI pages as HTTP/1.1 unless the client asked for HTTP/1.0. - * - White space fix. - * - * Revision 1.99 2007/08/05 13:42:22 fabiankeil - * #1763173 from Stefan Huehner: declare some more functions static. - * - * Revision 1.98 2007/05/14 10:33:51 fabiankeil - * - Use strlcpy() and strlcat() instead of strcpy() and strcat(). - * - * Revision 1.97 2007/04/09 18:11:35 fabiankeil - * Don't mistake VC++'s _snprintf() for a snprintf() replacement. - * - * Revision 1.96 2007/03/08 17:41:05 fabiankeil - * Use sizeof() more often. - * - * Revision 1.95 2007/02/10 17:01:37 fabiankeil - * Don't overlook map result for the forwarding-type. - * - * Revision 1.94 2007/02/08 19:44:49 fabiankeil - * Use a transparent background for the PNG replacement pattern. - * - * Revision 1.93 2007/02/07 10:45:22 fabiankeil - * - Save the reason for generating http_responses. - * - Fix --disable-toggle (again). - * - Use TBL birthday hack for 403 responses as well. - * - Uglify the @menu@ again to fix JavaScript - * errors on the "blocked" template. - * - Escape an ampersand in cgi_error_unknown(). - * - * Revision 1.92 2007/01/28 13:41:17 fabiankeil - * - Add HEAD support to finish_http_response. - * - Add error favicon to internal HTML error messages. - * - * Revision 1.91 2007/01/27 13:09:16 fabiankeil - * Add new config option "templdir" to - * change the templates directory. - * - * Revision 1.90 2007/01/25 13:47:26 fabiankeil - * Added "forwarding-failed" template support for error_response(). - * - * Revision 1.89 2007/01/23 15:51:16 fabiankeil - * Add favicon delivery functions. - * - * Revision 1.88 2007/01/23 13:14:32 fabiankeil - * - Map variables that aren't guaranteed to be - * pure ASCII html_encoded. - * - Use CGI_PREFIX to generate URL for user manual - * CGI page to make sure CGI_SITE_2_PATH is included. - * - * Revision 1.87 2007/01/22 15:34:13 fabiankeil - * - "Protect" against a rather lame JavaScript-based - * Privoxy detection "attack" and check the referrer - * before delivering the CGI style sheet. - * - Move referrer check for unsafe CGI pages into - * referrer_is_safe() and log the result. - * - Map @url@ in cgi-error-disabled page. - * It's required for the "go there anyway" link. - * - Mark *csp as immutable for grep_cgi_referrer(). - * - * Revision 1.86 2007/01/09 11:54:26 fabiankeil - * Fix strdup() error handling in cgi_error_unknown() - * and cgi_error_no_template(). Reported by Markus Elfring. - * - * Revision 1.85 2007/01/05 14:19:02 fabiankeil - * Handle pcrs_execute() errors in template_fill() properly. - * - * Revision 1.84 2006/12/28 17:54:22 fabiankeil - * Fixed gcc43 conversion warnings and replaced sprintf - * calls with snprintf to give OpenBSD's gcc one less reason - * to complain. - * - * Revision 1.83 2006/12/17 19:35:19 fabiankeil - * Escape ampersand in Privoxy menu. - * - * Revision 1.82 2006/12/17 17:53:39 fabiankeil - * Suppress the toggle link if remote toggling is disabled. - * - * Revision 1.81 2006/12/09 13:49:16 fabiankeil - * Fix configure option --disable-toggle. - * Thanks to Peter Thoenen for reporting this. - * - * Revision 1.80 2006/12/08 14:45:32 fabiankeil - * Don't lose the FORCE_PREFIX in case of - * connection problems. Fixes #612235. - * - * Revision 1.79 2006/11/13 19:05:50 fabiankeil - * Make pthread mutex locking more generic. Instead of - * checking for OSX and OpenBSD, check for FEATURE_PTHREAD - * and use mutex locking unless there is an _r function - * available. Better safe than sorry. - * - * Fixes "./configure --disable-pthread" and should result - * in less threading-related problems on pthread-using platforms, - * but it still doesn't fix BR#1122404. - * - * Revision 1.78 2006/09/21 19:22:07 fabiankeil - * Use CGI_PREFIX to check the referrer. - * The check for "http://config.privoxy.org/" fails - * if the user modified CGI_SITE_2_HOST. - * - * Revision 1.77 2006/09/21 15:17:23 fabiankeil - * Adjusted headers for Privoxy's cgi responses: - * Don't set Last-Modified, Expires and Cache-Control - * headers for redirects; always set "Connection: close". - * - * Revision 1.76 2006/09/07 14:06:38 fabiankeil - * Only predate the Last-Modified header for cgi responses - * that are delivered with status code 404 or 503. - * - * Revision 1.75 2006/09/07 11:56:39 fabiankeil - * Mark cgi_send_user_manual as harmless, - * to fix the access denied problem Hal spotted. - * The manual has no secret content, therefore we - * don't have to care about "secure" referrers. - * - * Revision 1.74 2006/09/06 18:45:03 fabiankeil - * Incorporate modified version of Roland Rosenfeld's patch to - * optionally access the user-manual via Privoxy. Closes patch 679075. - * - * Formatting changed to Privoxy style, added call to - * cgi_error_no_template if the requested file doesn't - * exist and modified check whether or not Privoxy itself - * should serve the manual. Should work cross-platform now. - * - * Revision 1.73 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work:http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.72 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.70.2.13 2004/02/17 13:30:23 oes - * Moved cgi_error_disabled() from cgiedit.c to - * cgi.c to re-enable build with --disable-editor. - * Fixes Bug #892744. Thanks to Matthew Fischer - * for spotting. - * - * Revision 1.70.2.12 2003/12/17 16:33:16 oes - * - Added new function cgi_redirect to handle creation of - * HTTP redirect messages formerly repeated in the code. - * - Send cgi_error_disabled instead of cgi_error_404 when - * referrer check fails - * - Dynamic content now gets Expires header field with date - * in the past - * - * Revision 1.70.2.11 2003/10/23 12:29:26 oes - * Bugfix: Transparent PNG was not transparent. Thanks to - * Dan Razzell of Starfish Systems for notice and new PNG. - * - * Revision 1.70.2.10 2003/06/06 07:54:25 oes - * Security fix: dspatch_known_cgi no longer considers an empty - * referrer safe for critical CGIs, since malicious links could - * reside on https:// locations which browsers don't advertize as - * referrers. Closes bug #749916, thanks to Jeff Epler for the - * hint. Goodbye One-Click[tm] toggling :-( - * - * Revision 1.70.2.9 2003/05/08 15:11:31 oes - * Nit - * - * Revision 1.70.2.8 2003/04/29 13:33:51 oes - * Killed a compiler warning on OSX - * - * Revision 1.70.2.7 2003/04/03 13:50:58 oes - * - Don't call cgi_error_disabled ifndef FEATURE_CGI_EDIT_ACTIONS - * (fixes bug #710056) - * - Show toggle info only if we have it - * - * Revision 1.70.2.6 2003/03/12 01:26:25 david__schmidt - * Move declaration of struct tm dummy outside of a control block so it is - * accessible later on during snprintf in get_http_time. - * - * Revision 1.70.2.5 2003/03/11 11:53:58 oes - * Cosmetic: Renamed cryptic variable - * - * Revision 1.70.2.4 2003/03/07 03:41:03 david__schmidt - * Wrapping all *_r functions (the non-_r versions of them) with mutex semaphores for OSX. Hopefully this will take care of all of those pesky crash reports. - * - * Revision 1.70.2.3 2002/11/28 18:14:32 oes - * Disable access to critical CGIs via untrusted referrers. - * This prevents users from being tricked by malicious websites - * into making unintentional configuration changes: - * - * - Added flag to each cgi_dispatcher that allows or denies - * external linking - * - Introduced proviorical function that greps for the - * referrer header before regular header parsing happens - * - Added safety check to dispatch_known_cgi. CGI is called - * if (cgi harmless || no referrer || we are referrer). - * Else a) toggle calls are modified not to change status and - * b) all other calls are denied. - * - * Revision 1.70.2.2 2002/11/12 16:20:37 oes - * Added missing #ifdef FEATURE_TOGGLE around g_bToggleIJB; fixes bug #636651 - * - * Revision 1.70.2.1 2002/08/05 11:17:46 oes - * Fixed Bug #587820, i.e. added workaround for IE bug that includes fragment identifier in (cgi) query - * - * Revision 1.70 2002/05/19 11:33:20 jongfoster - * If a CGI error was not handled, and propogated back to - * dispatch_known_cgi(), then it was assumed to be "out of memory". - * This gave a very misleading error message. - * - * Now other errors will cause a simple message giving the error - * number and asking the user to report a bug. - * - * Bug report: - * http://sourceforge.net/tracker/index.php?func=detail - * &aid=557905&group_id=11118&atid=111118 - * - * Revision 1.69 2002/05/14 21:28:40 oes - * - Fixed add_help_link to link to the (now split) actions - * part of the config chapter - * - Renamed helplink export to actions-help-prefix - * - * Revision 1.68 2002/05/12 21:36:29 jongfoster - * Correcting function comments - * - * Revision 1.67 2002/04/30 12:02:07 oes - * Nit: updated a comment - * - * Revision 1.66 2002/04/26 18:32:57 jongfoster - * Fixing a memory leak on error - * - * Revision 1.65 2002/04/26 12:53:51 oes - * - New function add_help_link - * - default_exports now exports links to the user manual - * and a prefix for links into the config chapter - * - * Revision 1.64 2002/04/24 02:17:21 oes - * - Better descriptions for CGIs - * - Hide edit-actions, more shortcuts - * - Moved get_char_param, get_string_param and get_number_param here - * from cgiedit.c - * - * Revision 1.63 2002/04/15 19:06:43 jongfoster - * Typos - * - * Revision 1.62 2002/04/10 19:59:46 jongfoster - * Fixes to #include in templates: - * - Didn't close main file if loading an included template fails. - * - I'm paranoid and want to disallow "#include /etc/passwd". - * - * Revision 1.61 2002/04/10 13:37:48 oes - * Made templates modular: template_load now recursive with max depth 1 - * - * Revision 1.60 2002/04/08 20:50:25 swa - * fixed JB spelling - * - * Revision 1.59 2002/04/05 15:51:51 oes - * - added send-stylesheet CGI - * - bugfix: error-pages now get correct request protocol - * - fixed - * - kludged CGI descriptions and menu not to break JS syntax - * - * Revision 1.58 2002/03/29 03:33:13 david__schmidt - * Fix Mac OSX compiler warnings - * - * Revision 1.57 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * - Removed ij_untrusted_url() The relevant - * info is now part of the "untrusted" page, - * which is generated by filters.c:trust_url() - * - * - Generators of content now call finish_http_response() - * themselves, making jcc.c:chat() a little less - * cluttered - * - * - Removed obsolete "Pragma: no-cache" from our headers - * - * - http_responses now know their head length - * - * - fill_template now uses the new interface to pcrs, so that - * - long jobs (like whole files) no longer have to be assembled - * in a fixed size buffer - * - the new T (trivial) option is used, and the replacement may - * contain Perl syntax backrefs without confusing pcrs - * - * - Introduced default_exports() which generates a set of exports - * common to all CGIs and other content generators - * - * - Introduced convenience function map_block_killer() - * - * - Introduced convenience function make_menu() - * - * - Introduced CGI-like function error_response() which generates - * the "No such domain" and "Connect failed" messages using the - * CGI platform - * - * - cgi_show_url_info: - * - adapted to new CGI features - * - form and answers now generated from same template - * - http:// prefix in URL now OK - * - * - cgi_show_status: - * - adapted to new CGI features - * - no longer uses csp->init_proxy_args - * - * - cgi_default: - * - moved menu generation to make_menu() - * - * - add_stats now writes single export map entries instead - * of a fixed string - * - * - Moved redirect_url() to filters.c - * - * - Fixed mem leak in free_http_response(), map_block_killer(), - * - * - Removed logentry from cancelled commit - * - * Revision 1.7 2001/06/09 10:51:58 jongfoster - * Changing "show URL info" handler to new style. - * Changing BUFSIZ ==> BUFFER_SIZE - * - * Revision 1.6 2001/06/07 23:05:19 jongfoster - * Removing code related to old forward and ACL files. - * - * Revision 1.5 2001/06/05 19:59:16 jongfoster - * Fixing multiline character string (a GCC-only "feature"), and snprintf (it's _snprintf under VC++). - * - * Revision 1.4 2001/06/04 10:41:52 swa - * show version string of cgi.h and cgi.c - * - * Revision 1.3 2001/06/03 19:12:16 oes - * introduced new cgi handling - * - * No revisions before 1.3 - * - **********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> -#include <stdlib.h> -#include <ctype.h> -#include <string.h> -#include <limits.h> -#include <assert.h> - -#include "project.h" -#include "cgi.h" -#include "list.h" -#include "encode.h" -#include "ssplit.h" -#include "errlog.h" -#include "filters.h" -#include "miscutil.h" -#include "cgisimple.h" -#include "jbsockets.h" -#if defined(FEATURE_CGI_EDIT_ACTIONS) || defined(FEATURE_TOGGLE) -#include "cgiedit.h" -#endif /* defined(FEATURE_CGI_EDIT_ACTIONS) || defined (FEATURE_TOGGLE) */ -#include "loadcfg.h" -/* loadcfg.h is for global_toggle_state only */ -#ifdef FEATURE_PTHREAD -#include "jcc.h" -/* jcc.h is for mutex semaphore globals only */ -#endif /* def FEATURE_PTHREAD */ -const char cgi_h_rcs[] = CGI_H_VERSION; - -/* - * List of CGI functions: name, handler, description - * Note: Do NOT use single quotes in the description; - * this will break the dynamic "blocked" template! - */ -static const struct cgi_dispatcher cgi_dispatchers[] = { - { "", - cgi_default, - "Privoxy main page", - TRUE }, -#ifdef FEATURE_GRACEFUL_TERMINATION - { "die", - cgi_die, - "<b>Shut down</b> - <em class="warning">Do not deploy this build in a production environment, " - "this is a one click Denial Of Service attack!!!</em>", - FALSE }, -#endif - { "show-status", - cgi_show_status, -#ifdef FEATURE_CGI_EDIT_ACTIONS - "View & change the current configuration", -#else - "View the current configuration", -#endif - TRUE }, - { "show-version", - cgi_show_version, - "View the source code version numbers", - TRUE }, - { "show-request", - cgi_show_request, - "View the request headers", - TRUE }, - { "show-url-info", - cgi_show_url_info, - "Look up which actions apply to a URL and why", - TRUE }, -#ifdef FEATURE_TOGGLE - { "toggle", - cgi_toggle, - "Toggle Privoxy on or off", - FALSE }, -#endif /* def FEATURE_TOGGLE */ -#ifdef FEATURE_CGI_EDIT_ACTIONS - { "edit-actions", /* Edit the actions list */ - cgi_edit_actions, - NULL, FALSE }, - { "eaa", /* Shortcut for edit-actions-add-url-form */ - cgi_edit_actions_add_url_form, - NULL, FALSE }, - { "eau", /* Shortcut for edit-actions-url-form */ - cgi_edit_actions_url_form, - NULL, FALSE }, - { "ear", /* Shortcut for edit-actions-remove-url-form */ - cgi_edit_actions_remove_url_form, - NULL, FALSE }, - { "eal", /* Shortcut for edit-actions-list */ - cgi_edit_actions_list, - NULL, FALSE }, - { "eafu", /* Shortcut for edit-actions-for-url */ - cgi_edit_actions_for_url, - NULL, FALSE }, - { "eas", /* Shortcut for edit-actions-submit */ - cgi_edit_actions_submit, - NULL, FALSE }, - { "easa", /* Shortcut for edit-actions-section-add */ - cgi_edit_actions_section_add, - NULL, FALSE }, - { "easr", /* Shortcut for edit-actions-section-remove */ - cgi_edit_actions_section_remove, - NULL, FALSE }, - { "eass", /* Shortcut for edit-actions-section-swap */ - cgi_edit_actions_section_swap, - NULL, FALSE }, - { "edit-actions-for-url", - cgi_edit_actions_for_url, - NULL, FALSE /* Edit the actions for (a) specified URL(s) */ }, - { "edit-actions-list", - cgi_edit_actions_list, - NULL, TRUE /* Edit the actions list */ }, - { "edit-actions-submit", - cgi_edit_actions_submit, - NULL, FALSE /* Change the actions for (a) specified URL(s) */ }, - { "edit-actions-url", - cgi_edit_actions_url, - NULL, FALSE /* Change a URL pattern in the actionsfile */ }, - { "edit-actions-url-form", - cgi_edit_actions_url_form, - NULL, FALSE /* Form to change a URL pattern in the actionsfile */ }, - { "edit-actions-add-url", - cgi_edit_actions_add_url, - NULL, FALSE /* Add a URL pattern to the actionsfile */ }, - { "edit-actions-add-url-form", - cgi_edit_actions_add_url_form, - NULL, FALSE /* Form to add a URL pattern to the actionsfile */ }, - { "edit-actions-remove-url", - cgi_edit_actions_remove_url, - NULL, FALSE /* Remove a URL pattern from the actionsfile */ }, - { "edit-actions-remove-url-form", - cgi_edit_actions_remove_url_form, - NULL, FALSE /* Form to remove a URL pattern from the actionsfile */ }, - { "edit-actions-section-add", - cgi_edit_actions_section_add, - NULL, FALSE /* Remove a section from the actionsfile */ }, - { "edit-actions-section-remove", - cgi_edit_actions_section_remove, - NULL, FALSE /* Remove a section from the actionsfile */ }, - { "edit-actions-section-swap", - cgi_edit_actions_section_swap, - NULL, FALSE /* Swap two sections in the actionsfile */ }, -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - { "error-favicon.ico", - cgi_send_error_favicon, - NULL, TRUE /* Sends the favicon image for error pages. */ }, - { "favicon.ico", - cgi_send_default_favicon, - NULL, TRUE /* Sends the default favicon image. */ }, - { "robots.txt", - cgi_robots_txt, - NULL, TRUE /* Sends a robots.txt file to tell robots to go away. */ }, - { "send-banner", - cgi_send_banner, - NULL, TRUE /* Send a built-in image */ }, - { "send-stylesheet", - cgi_send_stylesheet, - NULL, FALSE /* Send templates/cgi-style.css */ }, - { "t", - cgi_transparent_image, - NULL, TRUE /* Send a transparent image (short name) */ }, - { "url-info-osd.xml", - cgi_send_url_info_osd, - NULL, TRUE /* Send templates/url-info-osd.xml */ }, - { "user-manual", - cgi_send_user_manual, - NULL, TRUE /* Send user-manual */ }, - { NULL, /* NULL Indicates end of list and default page */ - cgi_error_404, - NULL, TRUE /* Unknown CGI page */ } -}; - - -/* - * Built-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\006\000\000\000\251" - "\361\236\176\000\000\000\006\142\113\107\104\000\000\000\000" - "\000\000\371\103\273\177\000\000\000\033\111\104\101\124\010" - "\327\143\140\140\140\060\377\377\377\077\003\234\106\341\060" - "\060\230\063\020\124\001\000\161\021\031\241\034\364\030\143" - "\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\001\000\000\000\001\001\003\000\000\000\045\333\126" - "\312\000\000\000\003\120\114\124\105\377\377\377\247\304\033\310" - "\000\000\000\001\164\122\116\123\000\100\346\330\146\000\000\000" - "\001\142\113\107\104\000\210\005\035\110\000\000\000\012\111\104" - "\101\124\170\001\143\140\000\000\000\002\000\001\163\165\001\030" - "\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 (usually http://p.p/) or - * matches CGI_SITE_2_HOST CGI_SITE_2_PATH (usually - * http://config.privoxy.org/). If so, it passes - * the (rest of the) path onto dispatch_known_cgi, which - * calls the relevant CGI handler function. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : http_response if match, NULL if nonmatch or handler fail - * - *********************************************************************/ -struct http_response *dispatch_cgi(struct client_state *csp) -{ - const char *host = csp->http->host; - const char *path = csp->http->path; - - /* - * 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] == '/') ) - { - /* ..then the path will all be for us. Remove leading '/' */ - 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))) ) - { - /* 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') - { - /* - * weirdness: URL is /configXXX, where XXX is some string - * Do *NOT* intercept. - */ - return NULL; - } - } - else - { - /* Not a CGI */ - return NULL; - } - - /* - * This is a CGI call. - */ - - return dispatch_known_cgi(csp, path); -} - - -/********************************************************************* - * - * Function : grep_cgi_referrer - * - * Description : Ugly provisorical fix that greps the value of the - * referer HTTP header field out of a linked list of - * strings like found at csp->headers. Will disappear - * in Privoxy 3.1. - * - * FIXME: csp->headers ought to be csp->http->headers - * FIXME: Parsing all client header lines should - * happen right after the request is received! - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : pointer to value (no copy!), or NULL if none found. - * - *********************************************************************/ -static char *grep_cgi_referrer(const struct client_state *csp) -{ - struct list_entry *p; - - for (p = csp->headers->first; p != NULL; p = p->next) - { - if (p->str == NULL) continue; - if (strncmpic(p->str, "Referer: ", 9) == 0) - { - return ((p->str) + 9); - } - } - return NULL; - -} - - -/********************************************************************* - * - * Function : referrer_is_safe - * - * Description : Decides whether we trust the Referer for - * CGI pages which are only meant to be reachable - * through Privoxy's web interface directly. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : TRUE if the referrer is safe, or - * FALSE if the referrer is unsafe or not set. - * - *********************************************************************/ -static int referrer_is_safe(const struct client_state *csp) -{ - char *referrer; - static const char alternative_prefix[] = "http://" CGI_SITE_1_HOST "/"; - - referrer = grep_cgi_referrer(csp); - - if (NULL == referrer) - { - /* No referrer, no access */ - log_error(LOG_LEVEL_ERROR, "Denying access to %s. No referrer found.", - csp->http->url); - } - else if ((0 == strncmp(referrer, CGI_PREFIX, sizeof(CGI_PREFIX)-1) - || (0 == strncmp(referrer, alternative_prefix, strlen(alternative_prefix))))) - { - /* Trustworthy referrer */ - log_error(LOG_LEVEL_CGI, "Granting access to %s, referrer %s is trustworthy.", - csp->http->url, referrer); - - return TRUE; - } - else - { - /* Untrustworthy referrer */ - log_error(LOG_LEVEL_ERROR, "Denying access to %s, referrer %s isn't trustworthy.", - csp->http->url, referrer); - } - - return FALSE; - -} - -/********************************************************************* - * - * 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 != '/') - { - query_args_start++; - } - if (*query_args_start == '/') - { - *query_args_start++ = '\0'; - if ((param_list = new_map())) - { - map(param_list, "file", 1, url_decode(query_args_start), 0); - } - } - else - { - if (*query_args_start == '?') - { - *query_args_start++ = '\0'; - } - if (NULL == (param_list = parse_cgi_parameters(query_args_start))) - { - 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(); - } - - /* - * Find and start the right CGI function - */ - d = cgi_dispatchers; - for (;;) - { - if ((d->name == NULL) || (strcmp(path_copy, d->name) == 0)) - { - /* - * If the called CGI is either harmless, or referred - * from a trusted source, start it. - */ - if (d->harmless || referrer_is_safe(csp)) - { - err = (d->handler)(csp, rsp, param_list); - } - else - { - /* - * Else, modify toggle calls so that they only display - * the status, and deny all other calls. - */ - if (0 == strcmp(path_copy, "toggle")) - { - unmap(param_list, "set"); - err = (d->handler)(csp, rsp, param_list); - } - else - { - err = cgi_error_disabled(csp, rsp); - } - } - - free(path_copy); - free_map(param_list); - - if (err == JB_ERR_CGI_PARAMS) - { - err = cgi_error_bad_param(csp, rsp); - } - if (err && (err != JB_ERR_MEMORY)) - { - /* Unexpected error! Shouldn't get here */ - log_error(LOG_LEVEL_ERROR, "Unexpected CGI error %d in top-level handler. Please file a bug report!", err); - err = cgi_error_unknown(csp, rsp, err); - } - if (!err) - { - /* It worked */ - rsp->reason = RSP_REASON_CGI_CALL; - return finish_http_response(csp, rsp); - } - else - { - /* Error in handler, probably out-of-memory */ - free_http_response(rsp); - return cgi_error_memory(); - } - } - d++; - } -} - - -/********************************************************************* - * - * Function : parse_cgi_parameters - * - * Description : Parse a URL-encoded argument string into name/value - * pairs and store them in a struct map list. - * - * Parameters : - * 1 : argstring = string to be parsed. Will be trashed. - * - * Returns : pointer to param list, or NULL if out of memory. - * - *********************************************************************/ -static struct map *parse_cgi_parameters(char *argstring) -{ - char *p; - char *vector[BUFFER_SIZE]; - int pairs, i; - struct map *cgi_params; - - if (NULL == (cgi_params = new_map())) - { - return NULL; - } - - /* - * IE 5 does, of course, violate RFC 2316 Sect 4.1 and sends - * the fragment identifier along with the request, so we must - * cut it off here, so it won't pollute the CGI params: - */ - if (NULL != (p = strchr(argstring, '#'))) - { - *p = '\0'; - } - - pairs = ssplit(argstring, "&", 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; - } - } - } - - return cgi_params; - -} - - -/********************************************************************* - * - * 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. - * - *********************************************************************/ -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 = (char)(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. - * - *********************************************************************/ -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_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. - * - *********************************************************************/ -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 = (char)(ch - '0'); - - /* Note: - * - * <limits.h> defines UINT_MAX - * - * (UINT_MAX - ch) / 10 is the largest number that - * can be safely multiplied by 10 then have ch added. - */ - if (value > ((UINT_MAX - (unsigned)ch) / 10U)) - { - return JB_ERR_CGI_PARAMS; - } - - value = value * 10 + (unsigned)ch; - } - - /* Success */ - *pvalue = value; - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : error_response - * - * Description : returns an http_response that explains the reason - * why a request failed. - * - * 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 - * - * Returns : A http_response. If we run out of memory, this - * will be cgi_error_memory(). - * - *********************************************************************/ -struct http_response *error_response(struct client_state *csp, - const char *templatename, - int sys_err) -{ - jb_err err; - struct http_response *rsp; - struct map *exports = default_exports(csp, NULL); - char *path = NULL; - - if (exports == NULL) - { - return cgi_error_memory(); - } - - if (NULL == (rsp = alloc_http_response())) - { - free_map(exports); - return cgi_error_memory(); - } - -#ifdef FEATURE_FORCE_LOAD - if (csp->flags & CSP_FLAG_FORCED) - { - path = strdup(FORCE_PREFIX); - } - else -#endif /* def FEATURE_FORCE_LOAD */ - { - path = strdup(""); - } - err = string_append(&path, csp->http->path); - - if (!err) 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_and_free_original(path), 0); - if (!err) err = map(exports, "error", 1, html_encode_and_free_original(safe_strerror(sys_err)), 0); - if (!err) err = map(exports, "protocol", 1, csp->http->ssl ? "https://" : "http://", 1); - if (!err) - { - err = map(exports, "host-ip", 1, html_encode(csp->http->host_ip_addr_str), 0); - if (err) - { - /* Some failures, like "404 no such domain", don't have an IP address. */ - err = map(exports, "host-ip", 1, html_encode(csp->http->host), 0); - } - } - - - 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(); - } - rsp->reason = RSP_REASON_NO_SUCH_DOMAIN; - } - else if (!strcmp(templatename, "forwarding-failed")) - { - const struct forward_spec *fwd = forward_url(csp, csp->http); - char *socks_type = NULL; - if (fwd == NULL) - { - log_error(LOG_LEVEL_FATAL, "gateway spec is NULL. This shouldn't happen!"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - - /* - * XXX: While the template is called forwarding-failed, - * it currently only handles socks forwarding failures. - */ - assert(fwd != NULL); - assert(fwd->type != SOCKS_NONE); - - /* - * Map failure reason, forwarding type and forwarder. - */ - if (NULL == csp->error_message) - { - /* - * Either we forgot to record the failure reason, - * or the memory allocation failed. - */ - log_error(LOG_LEVEL_ERROR, "Socks failure reason missing."); - csp->error_message = strdup("Failure reason missing. Check the log file for details."); - } - if (!err) err = map(exports, "gateway", 1, fwd->gateway_host, 1); - - /* - * XXX: this is almost the same code as in cgi_show_url_info() - * and thus should be factored out and shared. - */ - switch (fwd->type) - { - case SOCKS_4: - socks_type = "socks4-"; - break; - case SOCKS_4A: - socks_type = "socks4a-"; - break; - case SOCKS_5: - socks_type = "socks5-"; - break; - default: - log_error(LOG_LEVEL_FATAL, "Unknown socks type: %d.", fwd->type); - } - - if (!err) err = map(exports, "forwarding-type", 1, socks_type, 1); - if (!err) err = map(exports, "error-message", 1, html_encode(csp->error_message), 0); - - if (!err) rsp->status = strdup("503 Forwarding failure"); - if ((rsp->status == NULL) || (NULL == csp->error_message) || err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->reason = RSP_REASON_FORWARDING_FAILED; - } - else if (!strcmp(templatename, "connect-failed")) - { - rsp->status = strdup("503 Connect failed"); - if (rsp->status == NULL) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->reason = RSP_REASON_CONNECT_FAILED; - } - - err = template_fill_for_cgi(csp, templatename, exports, rsp); - if (err) - { - free_http_response(rsp); - return cgi_error_memory(); - } - - return finish_http_response(csp, rsp); -} - - -/********************************************************************* - * - * Function : cgi_error_disabled - * - * Description : CGI function that is called to generate an error - * response if the actions editor or toggle CGI are - * accessed despite having being disabled at compile- - * or run-time, or if the user followed an untrusted link - * to access a unsafe CGI feature that is only reachable - * through Privoxy directly. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_disabled(const struct client_state *csp, - struct http_response *rsp) -{ - struct map *exports; - - assert(csp); - assert(rsp); - - if (NULL == (exports = default_exports(csp, "cgi-error-disabled"))) - { - return JB_ERR_MEMORY; - } - if (map(exports, "url", 1, html_encode(csp->http->url), 0)) - { - /* Not important enough to do anything */ - log_error(LOG_LEVEL_ERROR, "Failed to fill in url."); - } - - return template_fill_for_cgi(csp, "cgi-error-disabled", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_init_error_messages - * - * Description : Call at the start of the program to initialize - * the error message used by cgi_error_memory(). - * - * Parameters : N/A - * - * Returns : N/A - * - *********************************************************************/ -void cgi_init_error_messages(void) -{ - memset(cgi_error_memory_response, '\0', sizeof(*cgi_error_memory_response)); - cgi_error_memory_response->head = - "HTTP/1.0 500 Internal Privoxy Error\r\n" - "Content-Type: text/html\r\n" - "\r\n"; - cgi_error_memory_response->body = - "<html>\r\n" - "<head>\r\n" - " <title>500 Internal Privoxy Error</title>\r\n" - " <link rel="shortcut icon" href="" CGI_PREFIX "error-favicon.ico" type="image/x-icon">" - "</head>\r\n" - "<body>\r\n" - "<h1>500 Internal Privoxy Error</h1>\r\n" - "<p>Privoxy <b>ran out of memory</b> while processing your request.</p>\r\n" - "<p>Please contact your proxy administrator, or try again later</p>\r\n" - "</body>\r\n" - "</html>\r\n"; - - cgi_error_memory_response->head_length = - strlen(cgi_error_memory_response->head); - cgi_error_memory_response->content_length = - strlen(cgi_error_memory_response->body); - cgi_error_memory_response->reason = RSP_REASON_OUT_OF_MEMORY; -} - - -/********************************************************************* - * - * Function : cgi_error_memory - * - * Description : Called if a CGI function runs out of memory. - * Returns a statically-allocated error response. - * - * Parameters : N/A - * - * Returns : http_response data structure for output. This is - * statically allocated, for obvious reasons. - * - *********************************************************************/ -struct http_response *cgi_error_memory(void) -{ - /* assert that it's been initialized. */ - assert(cgi_error_memory_response->head); - - return cgi_error_memory_response; -} - - -/********************************************************************* - * - * Function : cgi_error_no_template - * - * Description : Almost-CGI function that is called if a template - * cannot be loaded. Note this is not a true CGI, - * it takes a template name rather than a map of - * parameters. - * - * 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. - * - *********************************************************************/ -jb_err cgi_error_no_template(const struct client_state *csp, - struct http_response *rsp, - const char *template_name) -{ - static const char status[] = - "500 Internal Privoxy Error"; - static const char body_prefix[] = - "<html>\r\n" - "<head>\r\n" - " <title>500 Internal Privoxy Error</title>\r\n" - " <link rel="shortcut icon" href="" CGI_PREFIX "error-favicon.ico" type="image/x-icon">" - "</head>\r\n" - "<body>\r\n" - "<h1>500 Internal Privoxy Error</h1>\r\n" - "<p>Privoxy encountered an error while processing your request:</p>\r\n" - "<p><b>Could not load template file <code>"; - static const char body_suffix[] = - "</code> or one of its included components.</b></p>\r\n" - "<p>Please contact your proxy administrator.</p>\r\n" - "<p>If you are the proxy administrator, please put the required file(s)" - "in the <code><i>(confdir)</i>/templates</code> directory. The " - "location of the <code><i>(confdir)</i></code> directory " - "is specified in the main Privoxy <code>config</code> " - "file. (It's typically the Privoxy install directory" -#ifndef _WIN32 - ", or <code>/etc/privoxy/</code>" -#endif /* ndef _WIN32 */ - ").</p>\r\n" - "</body>\r\n" - "</html>\r\n"; - const size_t body_size = strlen(body_prefix) + strlen(template_name) + strlen(body_suffix) + 1; - - 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(body_size); - if (rsp->body == NULL) - { - return JB_ERR_MEMORY; - } - strlcpy(rsp->body, body_prefix, body_size); - strlcat(rsp->body, template_name, body_size); - strlcat(rsp->body, body_suffix, body_size); - - rsp->status = strdup(status); - if (rsp->status == NULL) - { - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : cgi_error_unknown - * - * Description : Almost-CGI function that is called if an unexpected - * error occurs in the top-level CGI dispatcher. - * In this context, "unexpected" means "anything other - * than JB_ERR_MEMORY or JB_ERR_CGI_PARAMS" - CGIs are - * expected to handle all other errors internally, - * since they can give more relavent error messages - * that way. - * - * Note this is not a true CGI, it takes an error - * code rather than a map of parameters. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : error_to_report = Error code to report. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_unknown(const struct client_state *csp, - struct http_response *rsp, - jb_err error_to_report) -{ - static const char status[] = - "500 Internal Privoxy Error"; - static const char body_prefix[] = - "<html>\r\n" - "<head>\r\n" - " <title>500 Internal Privoxy Error</title>\r\n" - " <link rel="shortcut icon" href="" CGI_PREFIX "error-favicon.ico" type="image/x-icon">" - "</head>\r\n" - "<body>\r\n" - "<h1>500 Internal Privoxy Error</h1>\r\n" - "<p>Privoxy encountered an error while processing your request:</p>\r\n" - "<p><b>Unexpected internal error: "; - static const char body_suffix[] = - "</b></p>\r\n" - "<p>Please " - "<a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118%5C%22%3E" - "file a bug report</a>.</p>\r\n" - "</body>\r\n" - "</html>\r\n"; - char errnumbuf[30]; - /* - * Due to sizeof(errnumbuf), body_size will be slightly - * bigger than necessary but it doesn't really matter. - */ - const size_t body_size = strlen(body_prefix) + sizeof(errnumbuf) + strlen(body_suffix) + 1; - assert(csp); - assert(rsp); - - /* 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->reason = RSP_REASON_INTERNAL_ERROR; - - snprintf(errnumbuf, sizeof(errnumbuf), "%d", error_to_report); - - rsp->body = malloc(body_size); - if (rsp->body == NULL) - { - return JB_ERR_MEMORY; - } - strlcpy(rsp->body, body_prefix, body_size); - strlcat(rsp->body, errnumbuf, body_size); - strlcat(rsp->body, body_suffix, body_size); - - rsp->status = strdup(status); - if (rsp->status == NULL) - { - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : cgi_error_bad_param - * - * Description : CGI function that is called if the parameters - * (query string) for a CGI were wrong. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_bad_param(const struct client_state *csp, - struct http_response *rsp) -{ - struct map *exports; - - assert(csp); - assert(rsp); - - if (NULL == (exports = default_exports(csp, NULL))) - { - return JB_ERR_MEMORY; - } - - return template_fill_for_cgi(csp, "cgi-error-bad-param", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_redirect - * - * Description : CGI support function to generate a HTTP redirect - * message - * - * Parameters : - * 1 : rsp = http_response data structure for output - * 2 : target = string with the target URL - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_redirect (struct http_response * rsp, const char *target) -{ - jb_err err; - - assert(rsp); - assert(target); - - err = enlist_unique_header(rsp->headers, "Location", target); - - rsp->status = strdup("302 Local Redirect from Privoxy"); - if (rsp->status == NULL) - { - return JB_ERR_MEMORY; - } - - return err; -} - - -/********************************************************************* - * - * Function : add_help_link - * - * Description : Produce a copy of the string given as item, - * embedded in an HTML link to its corresponding - * section (item name in uppercase) in the actions - * chapter of the user manual, (whose URL is given in - * the config and defaults to our web site). - * - * FIXME: I currently only work for actions, and would - * like to be generalized for other topics. - * - * Parameters : - * 1 : item = item (will NOT be free()d.) - * It is assumed to be HTML-safe. - * 2 : config = The current configuration. - * - * Returns : String with item embedded in link, or NULL on - * out-of-memory - * - *********************************************************************/ -char *add_help_link(const char *item, - struct configuration_spec *config) -{ - char *result; - - if (!item) return NULL; - - result = strdup("<a href=""); - if (!strncmpic(config->usermanual, "file://", 7) || - !strncmpic(config->usermanual, "http", 4)) - { - string_append(&result, config->usermanual); - } - else - { - string_append(&result, "http://"); - string_append(&result, CGI_SITE_2_HOST); - string_append(&result, "/user-manual/"); - } - string_append(&result, ACTIONS_HELP_PREFIX); - string_join (&result, string_toupper(item)); - string_append(&result, "">"); - string_append(&result, item); - string_append(&result, "</a> "); - - return result; -} - - -/********************************************************************* - * - * Function : get_http_time - * - * Description : Get the time in a format suitable for use in a - * HTTP header - e.g.: - * "Sun, 06 Nov 1994 08:49:37 GMT" - * - * Parameters : - * 1 : time_offset = Time returned will be current time - * plus this number of seconds. - * 2 : buf = Destination for result. - * 3 : buffer_size = Size of the buffer above. Must be big - * enough to hold 29 characters plus a - * trailing zero. - * - * Returns : N/A - * - *********************************************************************/ -void get_http_time(int time_offset, char *buf, size_t buffer_size) -{ - 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; -#if defined(HAVE_GMTIME_R) - struct tm dummy; -#endif - - assert(buf); - assert(buffer_size > (size_t)29); - - time(¤t_time); - - current_time += time_offset; - - /* get and save the gmt */ -#if HAVE_GMTIME_R - t = gmtime_r(¤t_time, &dummy); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&gmtime_mutex); - t = gmtime(¤t_time); - privoxy_mutex_unlock(&gmtime_mutex); -#else - t = gmtime(¤t_time); -#endif - - /* Format: "Sun, 06 Nov 1994 08:49:37 GMT" */ - snprintf(buf, buffer_size, - "%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 - ); - -} - -/********************************************************************* - * - * Function : get_locale_time - * - * Description : Get the time in a date(1)-like format - * according to the current locale - e.g.: - * "Fri Aug 29 19:37:12 CEST 2008" - * - * XXX: Should we allow the user to change the format? - * - * Parameters : - * 1 : buf = Destination for result. - * 2 : buffer_size = Size of the buffer above. Must be big - * enough to hold 29 characters plus a - * trailing zero. - * - * Returns : N/A - * - *********************************************************************/ -static void get_locale_time(char *buf, size_t buffer_size) -{ - struct tm *timeptr; - time_t current_time; -#if defined(HAVE_LOCALTIME_R) - struct tm dummy; -#endif - - assert(buf); - assert(buffer_size > (size_t)29); - - time(¤t_time); - -#if HAVE_LOCALTIME_R - timeptr = localtime_r(¤t_time, &dummy); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&localtime_mutex); - timeptr = localtime(¤t_time); - privoxy_mutex_unlock(&localtime_mutex); -#else - timeptr = localtime(¤t_time); -#endif - - strftime(buf, buffer_size, "%a %b %d %X %Z %Y", timeptr); - -} - -/********************************************************************* - * - * Function : finish_http_response - * - * Description : Fill in the missing headers in an http response, - * and flatten the headers to an http head. - * For HEAD requests the body is freed once - * the Content-Length header is set. - * - * 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() - * - *********************************************************************/ -struct http_response *finish_http_response(const struct client_state *csp, 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, using HTTP/1.1 - * unless the client asked for HTTP/1.0. - */ - snprintf(buf, sizeof(buf), "%s %s", - strcmpic(csp->http->ver, "HTTP/1.0") ? "HTTP/1.1" : "HTTP/1.0", - rsp->status ? rsp->status : "200 OK"); - err = enlist_first(rsp->headers, buf); - - /* - * Set the Content-Length - */ - if (rsp->content_length == 0) - { - rsp->content_length = rsp->body ? strlen(rsp->body) : 0; - } - if (!err) - { - snprintf(buf, sizeof(buf), "Content-Length: %d", (int)rsp->content_length); - err = enlist(rsp->headers, buf); - } - - if (0 == strcmpic(csp->http->gpc, "head")) - { - /* - * The client only asked for the head. Dispose - * the body and log an offensive message. - * - * While it may seem to be a bit inefficient to - * prepare the body if it isn't needed, it's the - * only way to get the Content-Length right for - * dynamic pages. We could have disposed the body - * earlier, but not without duplicating the - * Content-Length setting code above. - */ - log_error(LOG_LEVEL_CGI, "Preparing to give head to %s.", csp->ip_addr_str); - freez(rsp->body); - rsp->content_length = 0; - } - - if (strncmpic(rsp->status, "302", 3)) - { - /* - * If it's not a redirect without any content, - * set the Content-Type to text/html if it's - * not already specified. - */ - if (!err) err = enlist_unique(rsp->headers, "Content-Type: text/html", 13); - } - - /* - * Fill in the rest of the default headers: - * - * 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 - */ - 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, sizeof(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, sizeof(buf)); /* 10 * 60sec = 10 minutes */ - err = enlist_unique_header(rsp->headers, "Expires", buf); - } - } - else if (!strncmpic(rsp->status, "302", 3)) - { - get_http_time(0, buf, sizeof(buf)); - if (!err) err = enlist_unique_header(rsp->headers, "Date", buf); - } - else - { - /* - * Setting "Cache-Control" to "no-cache" and "Expires" to - * the current time doesn't exactly forbid caching, it just - * requires the client to revalidate the cached copy. - * - * If a temporary problem occurs and the user tries again after - * getting Privoxy's error message, a compliant browser may set the - * If-Modified-Since header with the content of the error page's - * Last-Modified header. More often than not, the document on the server - * is older than Privoxy's error message, the server would send status code - * 304 and the browser would display the outdated error message again and again. - * - * For documents delivered with status code 403, 404 and 503 we set "Last-Modified" - * to Tim Berners-Lee's birthday, which predates the age of any page on the web - * and can be safely used to "revalidate" without getting a status code 304. - * - * There is no need to let the useless If-Modified-Since header reach the - * server, it is therefore stripped by client_if_modified_since in parsers.c. - */ - if (!err) err = enlist_unique_header(rsp->headers, "Cache-Control", "no-cache"); - - get_http_time(0, buf, sizeof(buf)); - if (!err) err = enlist_unique_header(rsp->headers, "Date", buf); - if (!strncmpic(rsp->status, "403", 3) - || !strncmpic(rsp->status, "404", 3) - || !strncmpic(rsp->status, "503", 3)) - { - if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", "Wed, 08 Jun 1955 12:00:00 GMT"); - } - else - { - if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", buf); - } - if (!err) err = enlist_unique_header(rsp->headers, "Expires", "Sat, 17 Jun 2000 12:00:00 GMT"); - if (!err) err = enlist_unique_header(rsp->headers, "Pragma", "no-cache"); - } - - /* - * Quoting RFC 2616: - * - * HTTP/1.1 applications that do not support persistent connections MUST - * include the "close" connection option in every message. - */ - if (!err) err = enlist_unique_header(rsp->headers, "Connection", "close"); - - /* - * Write the head - */ - if (err || (NULL == (rsp->head = list_to_text(rsp->headers)))) - { - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->head_length = strlen(rsp->head); - - return rsp; - -} - - -/********************************************************************* - * - * Function : alloc_http_response - * - * Description : Allocates a new http_response structure. - * - * Parameters : N/A - * - * Returns : pointer to a new http_response, or NULL. - * - *********************************************************************/ -struct http_response *alloc_http_response(void) -{ - return (struct http_response *) zalloc(sizeof(struct http_response)); - -} - - -/********************************************************************* - * - * Function : free_http_response - * - * Description : Free the memory occupied by an http_response - * and its depandant structures. - * - * Parameters : - * 1 : rsp = pointer to http_response to be freed - * - * Returns : N/A - * - *********************************************************************/ -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)) - { - freez(rsp->status); - freez(rsp->head); - freez(rsp->body); - destroy_list(rsp->headers); - free(rsp); - } - -} - - -/********************************************************************* - * - * Function : template_load - * - * Description : CGI support function that loads a given HTML - * template, ignoring comment lines and following - * #include statements up to a depth of 1. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : template_ptr = Destination for pointer to loaded - * template text. - * 3 : templatename = name of the HTML template to be used - * 4 : recursive = Flag set if this function calls itself - * following an #include statament - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * JB_ERR_FILE if the template file cannot be read - * - *********************************************************************/ -jb_err template_load(const struct client_state *csp, char **template_ptr, - const char *templatename, int recursive) -{ - jb_err err; - char *templates_dir_path; - char *full_path; - char *file_buffer; - char *included_module; - const char *p; - FILE *fp; - char buf[BUFFER_SIZE]; - - assert(csp); - assert(template_ptr); - assert(templatename); - - *template_ptr = NULL; - - /* Validate template name. Paranoia. */ - for (p = templatename; *p != 0; p++) - { - if ( ((*p < 'a') || (*p > 'z')) - && ((*p < 'A') || (*p > 'Z')) - && ((*p < '0') || (*p > '9')) - && (*p != '-') - && (*p != '.')) - { - /* Illegal character */ - return JB_ERR_FILE; - } - } - - /* - * Generate full path using either templdir - * or confdir/templates as base directory. - */ - if (NULL != csp->config->templdir) - { - templates_dir_path = strdup(csp->config->templdir); - } - else - { - templates_dir_path = make_path(csp->config->confdir, "templates"); - } - - if (templates_dir_path == NULL) - { - log_error(LOG_LEVEL_ERROR, "Out of memory while generating template path for %s.", - templatename); - return JB_ERR_MEMORY; - } - - full_path = make_path(templates_dir_path, templatename); - free(templates_dir_path); - if (full_path == NULL) - { - log_error(LOG_LEVEL_ERROR, "Out of memory while generating full template path for %s.", - templatename); - return JB_ERR_MEMORY; - } - - /* Allocate buffer */ - - file_buffer = strdup(""); - if (file_buffer == NULL) - { - log_error(LOG_LEVEL_ERROR, "Not enough free memory to buffer %s.", full_path); - free(full_path); - return JB_ERR_MEMORY; - } - - /* Open template file */ - - 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; - } - free(full_path); - - /* - * Read the file, ignoring comments, and honoring #include - * statements, unless we're already called recursively. - * - * XXX: The comment handling could break with lines lengths > sizeof(buf). - * This is unlikely in practise. - */ - while (fgets(buf, sizeof(buf), fp)) - { - if (!recursive && !strncmp(buf, "#include ", 9)) - { - if (JB_ERR_OK != (err = template_load(csp, &included_module, chomp(buf + 9), 1))) - { - free(file_buffer); - fclose(fp); - return err; - } - - if (string_join(&file_buffer, included_module)) - { - fclose(fp); - return JB_ERR_MEMORY; - } - - continue; - } - - /* skip lines starting with '#' */ - if (*buf == '#') - { - continue; - } - - if (string_append(&file_buffer, buf)) - { - fclose(fp); - return JB_ERR_MEMORY; - } - } - 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 (and for uncritical errors) - * 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 - */ - for (m = exports->first; m != NULL; m = m->next) - { - 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, sizeof(buf), "%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, sizeof(buf), "@%s@", m->name); - } - - log_error(LOG_LEVEL_CGI, "Substituting: s/%s/%s/%s", buf, m->value, flags); - - /* 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 - { - error = pcrs_execute(job, file_buffer, size, &tmp_out_buffer, &size); - - pcrs_free_job(job); - if (NULL == tmp_out_buffer) - { - *template_ptr = NULL; - return JB_ERR_MEMORY; - } - - if (error < 0) - { - /* - * Substitution failed, keep the original buffer, - * log the problem and ignore it. - * - * The user might see some unresolved @CGI_VARIABLES@, - * but returning a special CGI error page seems unreasonable - * and could mask more important error messages. - */ - free(tmp_out_buffer); - log_error(LOG_LEVEL_ERROR, "Failed to execute s/%s/%s/%s. %s", - buf, m->value, flags, pcrs_strerror(error)); - } - else - { - /* Substitution succeeded, use modified buffer. */ - free(file_buffer); - file_buffer = tmp_out_buffer; - } - } - } - - /* - * 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. - * 4 : rsp = Response structure to fill in. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error - * - *********************************************************************/ -jb_err template_fill_for_cgi(const struct client_state *csp, - const char *templatename, - struct map *exports, - struct http_response *rsp) -{ - jb_err err; - - assert(csp); - assert(templatename); - assert(exports); - assert(rsp); - - err = template_load(csp, &rsp->body, templatename, 0); - 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; -} - - -/********************************************************************* - * - * Function : default_exports - * - * Description : returns a struct map list that contains exports - * which are common to all CGI functions. - * - * 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. - * - *********************************************************************/ -struct map *default_exports(const struct client_state *csp, const char *caller) -{ - char buf[30]; - jb_err err; - struct map * exports; - int local_help_exists = 0; - char *ip_address = NULL; - char *hostname = NULL; - - assert(csp); - - exports = new_map(); - if (exports == NULL) - { - return NULL; - } - - if (csp->config->hostname) - { - get_host_information(csp->cfd, &ip_address, NULL); - hostname = strdup(csp->config->hostname); - } - else - { - get_host_information(csp->cfd, &ip_address, &hostname); - } - - err = map(exports, "version", 1, html_encode(VERSION), 0); - get_locale_time(buf, sizeof(buf)); - if (!err) err = map(exports, "time", 1, html_encode(buf), 0); - if (!err) err = map(exports, "my-ip-address", 1, html_encode(ip_address ? ip_address : "unknown"), 0); - freez(ip_address); - if (!err) err = map(exports, "my-hostname", 1, html_encode(hostname ? hostname : "unknown"), 0); - freez(hostname); - 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, csp->config->feature_flags), 0); - if (!err) err = map(exports, "code-status", 1, CODE_STATUS, 1); - if (!strncmpic(csp->config->usermanual, "file://", 7) || - !strncmpic(csp->config->usermanual, "http", 4)) - { - /* Manual is located somewhere else, just link to it. */ - if (!err) err = map(exports, "user-manual", 1, html_encode(csp->config->usermanual), 0); - } - else - { - /* Manual is delivered by Privoxy. */ - if (!err) err = map(exports, "user-manual", 1, html_encode(CGI_PREFIX"user-manual/"), 0); - } - if (!err) err = map(exports, "actions-help-prefix", 1, ACTIONS_HELP_PREFIX ,1); -#ifdef FEATURE_TOGGLE - if (!err) err = map_conditional(exports, "enabled-display", global_toggle_state); -#else - if (!err) err = map_block_killer(exports, "can-toggle"); -#endif - - snprintf(buf, sizeof(buf), "%d", csp->config->hport); - if (!err) err = map(exports, "my-port", 1, buf, 1); - - if(!strcmp(CODE_STATUS, "stable")) - { - if (!err) err = map_block_killer(exports, "unstable"); - } - - if (csp->config->admin_address != NULL) - { - if (!err) err = map(exports, "admin-address", 1, html_encode(csp->config->admin_address), 0); - local_help_exists = 1; - } - else - { - if (!err) err = map_block_killer(exports, "have-adminaddr-info"); - } - - 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"); - } - - if (err) - { - free_map(exports); - return NULL; - } - - return exports; -} - - -/********************************************************************* - * - * Function : map_block_killer - * - * Description : Convenience function. - * Adds a "killer" for the conditional HTML-template - * block <name>, i.e. a substitution of the regex - * "if-<name>-start.*if-<name>-end" to the given - * export list. - * - * Parameters : - * 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. - * - *********************************************************************/ -jb_err map_block_killer(struct map *exports, const char *name) -{ - char buf[1000]; /* Will do, since the names are hardwired */ - - assert(exports); - assert(name); - assert(strlen(name) < (size_t)490); - - snprintf(buf, sizeof(buf), "if-%s-start.*if-%s-end", name, name); - return map(exports, buf, 1, "", 1); -} - - -/********************************************************************* - * - * Function : map_block_keep - * - * Description : Convenience function. Removes the markers used - * by map-block-killer, to save a few bytes. - * i.e. removes "@if-<name>-start@" and "@if-<name>-end@" - * - * Parameters : - * 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. - * - *********************************************************************/ -jb_err map_block_keep(struct map *exports, const char *name) -{ - jb_err err; - char buf[500]; /* Will do, since the names are hardwired */ - - assert(exports); - assert(name); - assert(strlen(name) < (size_t)490); - - snprintf(buf, sizeof(buf), "if-%s-start", name); - err = map(exports, buf, 1, "", 1); - - if (err) - { - return err; - } - - snprintf(buf, sizeof(buf), "if-%s-end", name); - return map(exports, buf, 1, "", 1); -} - - -/********************************************************************* - * - * Function : map_conditional - * - * Description : Convenience function. - * Adds an "if-then-else" for the conditional HTML-template - * block <name>, i.e. a substitution of the form: - * @if-<name>-then@ - * True text - * @else-not-<name>@ - * False text - * @endif-<name>@ - * - * The control structure and one of the alternatives - * will be hidden. - * - * Parameters : - * 1 : exports = map to extend - * 2 : name = name of conditional block - * 3 : choose_first = nonzero for first, zero for second. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err map_conditional(struct map *exports, const char *name, int choose_first) -{ - char buf[1000]; /* Will do, since the names are hardwired */ - jb_err err; - - assert(exports); - assert(name); - assert(strlen(name) < (size_t)480); - - snprintf(buf, sizeof(buf), (choose_first - ? "else-not-%s@.*@endif-%s" - : "if-%s-then@.*@else-not-%s"), - name, name); - - err = map(exports, buf, 1, "", 1); - if (err) - { - return err; - } - - snprintf(buf, sizeof(buf), (choose_first ? "if-%s-then" : "endif-%s"), name); - return map(exports, buf, 1, "", 1); -} - - -/********************************************************************* - * - * Function : make_menu - * - * Description : Returns an HTML-formatted menu of the available - * unhidden CGIs, excluding the one given in <self> - * and the toggle CGI if toggling is disabled. - * - * Parameters : - * 1 : self = name of CGI to leave out, can be NULL for - * complete listing. - * 2 : feature_flags = feature bitmap from csp->config - * - * - * Returns : menu string, or NULL on out-of-memory error. - * - *********************************************************************/ -char *make_menu(const char *self, const unsigned feature_flags) -{ - const struct cgi_dispatcher *d; - char *result = strdup(""); - - if (self == NULL) - { - self = "NO-SUCH-CGI!"; - } - - /* List available unhidden CGI's and export as "other-cgis" */ - for (d = cgi_dispatchers; d->name; d++) - { - -#ifdef FEATURE_TOGGLE - if (!(feature_flags & RUNTIME_FEATURE_CGI_TOGGLE) && !strcmp(d->name, "toggle")) - { - /* - * Suppress the toggle link if remote toggling is disabled. - */ - continue; - } -#endif /* def FEATURE_TOGGLE */ - - if (d->description && strcmp(d->name, self)) - { - char *html_encoded_prefix; - - /* - * Line breaks would be great, but break - * the "blocked" template's JavaScript. - */ - string_append(&result, "<li><a href=""); - html_encoded_prefix = html_encode(CGI_PREFIX); - if (html_encoded_prefix == NULL) - { - return NULL; - } - else - { - string_append(&result, html_encoded_prefix); - free(html_encoded_prefix); - } - string_append(&result, d->name); - string_append(&result, "">"); - string_append(&result, d->description); - string_append(&result, "</a></li>"); - } - } - - return result; -} - - -/********************************************************************* - * - * Function : dump_map - * - * Description : HTML-dump a map for debugging (as table) - * - * 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(""); - - string_append(&ret, "<table>\n"); - - for (cur_entry = the_map->first; - (cur_entry != NULL) && (ret != NULL); - cur_entry = cur_entry->next) - { - string_append(&ret, "<tr><td><b>"); - string_join (&ret, html_encode(cur_entry->name)); - string_append(&ret, "</b></td><td>"); - string_join (&ret, html_encode(cur_entry->value)); - string_append(&ret, "</td></tr>\n"); - } - - string_append(&ret, "</table>\n"); - return ret; -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/cgi.h b/external/privoxy/cgi.h deleted file mode 100644 index 6228b32..0000000 --- a/external/privoxy/cgi.h +++ /dev/null @@ -1,289 +0,0 @@ -#ifndef CGI_H_INCLUDED -#define CGI_H_INCLUDED -#define CGI_H_VERSION "$Id: cgi.h,v 1.35 2008/05/21 15:24:37 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ - * - * Purpose : Declares functions to intercept request, generate - * html or gif answers, and to compose HTTP resonses. - * - * Functions declared include: - * - * - * Copyright : Written by and Copyright (C) 2001-2007 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: cgi.h,v $ - * Revision 1.35 2008/05/21 15:24:37 fabiankeil - * Mark csp as immutable for a bunch of functions. - * - * Revision 1.34 2008/04/17 14:40:48 fabiankeil - * Provide get_http_time() with the buffer size so it doesn't - * have to blindly assume that the buffer is big enough. - * - * Revision 1.33 2007/01/28 13:41:17 fabiankeil - * - Add HEAD support to finish_http_response. - * - Add error favicon to internal HTML error messages. - * - * Revision 1.32 2006/12/17 17:53:39 fabiankeil - * Suppress the toggle link if remote toggling is disabled. - * - * Revision 1.31 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.29.2.2 2004/02/17 13:30:23 oes - * Moved cgi_error_disabled() from cgiedit.c to - * cgi.c to re-enable build with --disable-editor. - * Fixes Bug #892744. Thanks to Matthew Fischer - * for spotting. - * - * Revision 1.29.2.1 2003/12/17 16:33:28 oes - * Added prototype of new function cgi_redirect - * - * Revision 1.29 2002/05/19 11:33:21 jongfoster - * If a CGI error was not handled, and propogated back to - * dispatch_known_cgi(), then it was assumed to be "out of memory". - * This gave a very misleading error message. - * - * Now other errors will cause a simple message giving the error - * number and asking the user to report a bug. - * - * Bug report: - * http://sourceforge.net/tracker/index.php?func=detail - * &aid=557905&group_id=11118&atid=111118 - * - * Revision 1.28 2002/04/26 12:54:03 oes - * New function add_help_link - * - * Revision 1.27 2002/04/24 02:16:51 oes - * Moved get_char_param, get_string_param and get_number_param here from cgiedit.c - * - * Revision 1.26 2002/04/10 13:38:35 oes - * load_template signature changed - * - * Revision 1.25 2002/04/08 20:50:25 swa - * fixed JB spelling - * - * Revision 1.24 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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(), - * error_response() etc, ranamed others and changed - * param and return types. - * - Removed HTTP/HTML snipplets - * - Removed logentry from cancelled commit - * - * Revision 1.4 2001/06/09 10:50:58 jongfoster - * Changing "show URL info" handler to new style. - * Adding "extern" to some function prototypes. - * - * Revision 1.3 2001/06/03 19:12:16 oes - * introduced new cgi handling - * - * No revisions before 1.3 - * - **********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Main dispatch function - */ -extern struct http_response *dispatch_cgi(struct client_state *csp); - -/* Not exactly a CGI */ -extern struct http_response * error_response(struct client_state *csp, - const char *templatename, - 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(const struct client_state *csp, - 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(const struct client_state *csp, char ** template_ptr, - const char *templatename, int recursive); -extern jb_err template_fill(char ** template_ptr, const struct map *exports); -extern jb_err template_fill_for_cgi(const struct client_state *csp, - const char *templatename, - struct map *exports, - struct http_response *rsp); - -extern void cgi_init_error_messages(void); -extern struct http_response *cgi_error_memory(void); -extern jb_err cgi_redirect (struct http_response * rsp, const char *target); - -extern jb_err cgi_error_no_template(const struct client_state *csp, - struct http_response *rsp, - const char *template_name); -extern jb_err cgi_error_bad_param(const struct client_state *csp, - struct http_response *rsp); -extern jb_err cgi_error_disabled(const struct client_state *csp, - struct http_response *rsp); -extern jb_err cgi_error_unknown(const struct client_state *csp, - struct http_response *rsp, - jb_err error_to_report); - -extern jb_err get_number_param(struct client_state *csp, - const struct map *parameters, - char *name, - unsigned *pvalue); -extern jb_err get_string_param(const struct map *parameters, - const char *param_name, - const char **pparam); -extern char get_char_param(const struct map *parameters, - const char *param_name); - -/* - * Text generators - */ -extern void get_http_time(int time_offset, char *buf, size_t buffer_size); -extern char *add_help_link(const char *item, struct configuration_spec *config); -extern char *make_menu(const char *self, const unsigned feature_flags); -extern char *dump_map(const struct map *the_map); - -/* - * Ad replacement images - */ -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; - -/* Revision control strings from this header and associated .c file */ -extern const char cgi_rcs[]; -extern const char cgi_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef CGI_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/cgiedit.c b/external/privoxy/cgiedit.c deleted file mode 100644 index 6fca21f..0000000 --- a/external/privoxy/cgiedit.c +++ /dev/null @@ -1,4924 +0,0 @@ -const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.65 2009/03/08 14:19:22 fabiankeil 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-2008 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.65 2009/03/08 14:19:22 fabiankeil - * Fix justified (but harmless) compiler warnings - * on platforms where sizeof(int) < sizeof(long). - * - * Revision 1.64 2009/03/01 18:43:09 fabiankeil - * Fix cparser warnings. - * - * Revision 1.63 2008/12/04 18:15:38 fabiankeil - * Fix some cparser warnings. - * - * Revision 1.62 2008/08/31 15:59:02 fabiankeil - * There's no reason to let remote toggling support depend - * on FEATURE_CGI_EDIT_ACTIONS, so make sure it doesn't. - * - * Revision 1.61 2008/03/24 18:12:52 fabiankeil - * Use sizeof() more often. - * - * Revision 1.60 2008/03/15 14:52:35 fabiankeil - * Add CGI editor support for the "disable all filters of this type" - * directives "-client-header-filter", "-server-header-filter", - * "-client-header-tagger" and "-server-header-tagger". - * - * Revision 1.59 2008/03/08 16:25:56 fabiankeil - * After three file modification time mismatches, turn the CGI editor off. - * - * Revision 1.58 2007/11/28 17:57:01 fabiankeil - * Fix double free in cgi_edit_actions_list(). - * Reported by adlab in BR#1840145. - * - * Revision 1.57 2007/10/27 13:32:23 fabiankeil - * Plug minor 5-year-old memory leak. Spotted by - * Valgrind and triggered by Privoxy-Regression-Test. - * - * Revision 1.56 2007/08/05 13:47:03 fabiankeil - * #1763173 from Stefan Huehner: s@const static@static const@. - * - * Revision 1.55 2007/05/31 11:50:20 fabiankeil - * Re-enable support for old-school URLs like - * http://config.privoxy.org/edit-actions-list?f=default - * in the action editor. - * - * They are no longer used by the CGI pages, but make it easier - * to reach the editor directly, without knowing the requested - * file's index in csp->config->actions_file[]. - * - * Revision 1.54 2007/05/14 10:33:51 fabiankeil - * - Use strlcpy() and strlcat() instead of strcpy() and strcat(). - * - * Revision 1.53 2007/04/15 16:39:20 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.52 2007/04/12 10:41:23 fabiankeil - * - Don't mistake VC++'s _snprintf() for a snprintf() replacement. - * - Move some cgi_edit_actions_for_url() variables into structs. - * - Remove bogus comment. - * - * Revision 1.51 2007/04/08 13:21:05 fabiankeil - * Reference action files in CGI URLs by id instead - * of using the first part of the file name. - * Fixes BR 1694250 and BR 1590556. - * - * Revision 1.50 2007/03/29 11:40:34 fabiankeil - * Divide @filter-params@ into @client-header-filter-params@ - * @content-filter-params@ and @server-header-filter-params@. - * - * Revision 1.49 2007/03/20 15:16:34 fabiankeil - * Use dedicated header filter actions instead of abusing "filter". - * Replace "filter-client-headers" and "filter-client-headers" - * with "server-header-filter" and "client-header-filter". - * - * Revision 1.48 2007/02/13 14:35:25 fabiankeil - * Replace hash escaping code to prevent - * crashes, memory and file corruption. - * - * Revision 1.47 2006/12/28 18:04:25 fabiankeil - * Fixed gcc43 conversion warnings. - * - * Revision 1.46 2006/12/27 18:44:52 fabiankeil - * Stop shadowing string.h's index(). - * - * Revision 1.45 2006/12/21 12:57:48 fabiankeil - * Add config option "split-large-forms" - * to work around the browser bug reported - * in BR #1570678. - * - * Revision 1.44 2006/12/09 13:49:16 fabiankeil - * Fix configure option --disable-toggle. - * Thanks to Peter Thoenen for reporting this. - * - * Revision 1.43 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.41.2.12 2006/01/30 15:16:25 david__schmidt - * Remove a little residual debugging info - * - * Revision 1.41.2.11 2006/01/29 23:10:56 david__schmidt - * Multiple filter file support - * - * Revision 1.41.2.10 2005/07/04 03:13:43 david__schmidt - * Undo some damaging memory leak patches - * - * Revision 1.41.2.9 2005/07/04 00:31:04 david__schmidt - * Removing a double free - * - * Revision 1.41.2.8 2005/05/07 21:50:54 david__schmidt - * A few memory leaks plugged (mostly on error paths) - * - * Revision 1.41.2.7 2004/02/17 13:30:23 oes - * Moved cgi_error_disabled() from cgiedit.c to - * cgi.c to re-enable build with --disable-editor. - * Fixes Bug #892744. Thanks to Matthew Fischer - * for spotting. - * - * Revision 1.41.2.6 2003/12/18 08:13:48 oes - * One line lost in last commit - * - * Revision 1.41.2.5 2003/12/17 16:33:47 oes - * - All edit functions that redirect back to the list page - * now use cgi_redirect - * - All redirects now contain useless parameter "foo", whose - * value are raw seconds since epoch, in order to force - * Opera and Konqueror to properly reload the list. Closes - * bug #859993 - * - * Revision 1.41.2.4 2003/03/11 11:53:59 oes - * Cosmetic: Renamed cryptic variable - * - * Revision 1.41.2.3 2002/11/12 15:01:41 oes - * Fix: Don't free uninitialized struct editable_file - * - * Revision 1.41.2.2 2002/08/05 20:02:59 oes - * Bugfix: "Insert new section at top" did not work properly if first non-comment line in file was of type FILE_LINE_ACTION - * - * Revision 1.41.2.1 2002/08/02 12:43:14 oes - * Fixed bug #588514: first_time now set on a per-string basis in actions_from_radio; javascriptify now called on copies - * - * Revision 1.41 2002/05/21 19:09:45 oes - * - Made Add/Edit/Remove URL Submit and Cancel - * buttons jump back to relevant section in eal - * - Bugfix: remove-url-form needs p export - * - * Revision 1.40 2002/05/19 11:34:35 jongfoster - * Handling read-only actions files better - report the actual - * error, not "Out of memory"! - * - * Bug report: - * http://sourceforge.net/tracker/index.php?func=detail - * &aid=557905&group_id=11118&atid=111118 - * - * Revision 1.39 2002/05/12 21:39:15 jongfoster - * - Adding Doxygen-style comments to structures and #defines. - * - Correcting function comments - * - * Revision 1.38 2002/05/03 23:00:38 jongfoster - * Support for templates for "standard actions" buttons. - * See bug #549871 - * - * Revision 1.37 2002/04/30 11:14:52 oes - * Made csp the first parameter in *action_to_html - * - * Revision 1.36 2002/04/26 21:53:30 jongfoster - * Fixing a memory leak. (Near, but not caused by, my earlier commit). - * - * Revision 1.35 2002/04/26 21:50:02 jongfoster - * Honouring default exports in edit-actions-for-url-filter template. - * - * Revision 1.34 2002/04/26 12:54:17 oes - * Adaptions to changes in actions.c - * - * Revision 1.33 2002/04/24 02:17:47 oes - * - Moved get_char_param, get_string_param and get_number_param to cgi.c - * - Comments - * - Activated Jon's code for editing multiple AFs - * - cgi_edit_list_actions now provides context-sensitive - * help, looks up all action sets from standard.action and - * makes buttons for them in the catchall section - * - cgi_edit_action_submit now honors a p parameter, looks up - * the corresponding action set, and sets the catchall pattern's - * actions accordingly. - * - * Revision 1.32 2002/04/19 16:55:31 jongfoster - * Fixing newline problems. If we do our own text file newline - * mangling, we don't want the library to do any, so we need to - * open the files in *binary* mode. - * - * Revision 1.31 2002/04/18 19:21:08 jongfoster - * Added code to detect "conventional" action files, that start - * with a set of actions for all URLs (the pattern "/"). - * These are special-cased in the "edit-actions-list" CGI, so - * that a special UI can be written for them. - * - * Revision 1.30 2002/04/10 13:38:35 oes - * load_template signature changed - * - * Revision 1.29 2002/04/08 16:59:08 oes - * Fixed comment - * - * Revision 1.28 2002/03/27 12:30:29 oes - * Deleted unsused variable - * - * Revision 1.27 2002/03/26 23:06:04 jongfoster - * Removing duplicate @ifs on the toggle page - * - * Revision 1.26 2002/03/26 22:59:17 jongfoster - * Fixing /toggle to display status consistently. - * - * Revision 1.25 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.24 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.23 2002/03/24 13:32:41 swa - * name change related issues - * - * Revision 1.22 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.21 2002/03/22 18:02:48 jongfoster - * Fixing remote toggle - * - * Revision 1.20 2002/03/16 20:28:34 oes - * Added descriptions to the filters so users will know what they select in the cgi editor - * - * Revision 1.19 2002/03/16 18:38:14 jongfoster - * Stopping stupid or malicious users from breaking the actions - * file using the web-based editor. - * - * Revision 1.18 2002/03/16 14:57:44 jongfoster - * Full support for enabling/disabling modular filters. - * - * Revision 1.17 2002/03/16 14:26:42 jongfoster - * First version of modular filters support - READ ONLY! - * Fixing a double-free bug in the out-of-memory handling in map_radio(). - * - * Revision 1.16 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.15 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.14 2002/03/05 00:24:51 jongfoster - * Patch to always edit the current actions file. - * - * Revision 1.13 2002/03/04 02:07:59 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.12 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.11 2002/01/23 01:03:31 jongfoster - * Fixing gcc [CygWin] compiler warnings - * - * Revision 1.10 2002/01/23 00:22:59 jongfoster - * Adding new function cgi_edit_actions_section_swap(), to reorder - * the actions file. - * - * Adding get_url_spec_param() to get a validated URL pattern. - * - * Moving edit_read_line() out of this file and into loaders.c. - * - * Adding missing html_encode() to many CGI functions. - * - * Moving the functions that #include actionlist.h to the end of the file, - * because the Visual C++ 97 debugger gets extremely confused if you try - * to debug any code that comes after them in the file. - * - * Major optimizations in cgi_edit_actions_list() to reduce the size of - * the generated HTML (down 40% from 550k to 304k), with major side-effects - * throughout the editor and templates. In particular, the length of the - * URLs throughout the editor has been drastically reduced, by cutting - * paramater names down to 1 character and CGI names down to 3-4 - * characters, by removing all non-essential CGI paramaters even at the - * expense of having to re-read the actions file for the most trivial - * page, and by using relative rather than absolute URLs. This means - * that this (typical example): - * - * <a href="http://ijbswa.sourceforge.net/config/edit-actions-url-form? - * filename=ijb&ver=1011487572&section=12&pattern=13 - * &oldval=www.oesterhelt.org%2Fdeanimate-demo"> - * - * is now this: - * - * <a href="eau?f=ijb&v=1011487572&p=13"> - * - * Revision 1.9 2002/01/17 20:56:22 jongfoster - * Replacing hard references to the URL of the config interface - * with #defines from project.h - * - * Revision 1.8 2001/11/30 23:35:51 jongfoster - * Renaming actionsfile to ijb.action - * - * Revision 1.7 2001/11/13 00:28:24 jongfoster - * - Renaming parameters from edit-actions-for-url so that they only - * contain legal JavaScript characters. If we wanted to write - * JavaScript that worked with Netscape 4, this is nessacery. - * (Note that at the moment the JavaScript doesn't actually work - * with Netscape 4, but now this is purely a template issue, not - * one affecting code). - * - Adding new CGIs for use by non-JavaScript browsers: - * edit-actions-url-form - * edit-actions-add-url-form - * edit-actions-remove-url-form - * - Fixing || bug. - * - * Revision 1.6 2001/10/29 03:48:09 david__schmidt - * OS/2 native needed a snprintf() routine. Added one to miscutil, brackedted - * by and __OS2__ ifdef. - * - * Revision 1.5 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.4 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.3 2001/10/14 22:12:49 jongfoster - * New version of CGI-based actionsfile editor. - * Major changes, including: - * - Completely new file parser and file output routines - * - edit-actions CGI renamed edit-actions-for-url - * - All CGIs now need a filename parameter, except for... - * - New CGI edit-actions which doesn't need a filename, - * to allow you to start the editor up. - * - edit-actions-submit now works, and now automatically - * redirects you back to the main edit-actions-list handler. - * - * Revision 1.2 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.1 2001/09/16 15:47:37 jongfoster - * First version of CGI-based edit interface. This is very much a - * work-in-progress, and you can't actually use it to edit anything - * yet. You must #define FEATURE_CGI_EDIT_ACTIONS for these changes - * to have any effect. - * - * - **********************************************************************/ - - -#include "config.h" - -/* - * FIXME: Following includes copied from cgi.c - which are actually needed? - */ - -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <ctype.h> -#include <string.h> -#include <assert.h> -#include <sys/stat.h> - -#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" -#ifdef FEATURE_TOGGLE -/* loadcfg.h is for global_toggle_state only */ -#include "loadcfg.h" -#endif /* def FEATURE_TOGGLE */ -#include "urlmatch.h" - -const char cgiedit_h_rcs[] = CGIEDIT_H_VERSION; - - -#ifdef FEATURE_CGI_EDIT_ACTIONS - -/** - * A line in an editable_file. - */ -struct file_line -{ - /** Next entry in the linked list */ - struct file_line * next; - - /** The raw data, to write out if this line is unmodified. */ - char * raw; - - /** Comments and/or whitespace to put before this line if it's modified - and then written out. */ - char * prefix; - - /** The actual data, as a string. Line continuation and comment removal - are performed on the data read from file before it's stored here, so - it will be a single line of data. */ - char * unprocessed; - - /** The type of data on this line. One of the FILE_LINE_xxx constants. */ - int type; - - /** The actual data, processed into some sensible data type. */ - union - { - - /** An action specification. */ - struct action_spec action[1]; - - /** A name=value pair. */ - struct - { - - /** The name in the name=value pair. */ - char * name; - - /** The value in the name=value pair, as a string. */ - char * svalue; - - /** The value in the name=value pair, as an integer. */ - 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; - -}; - -/** This file_line has not been processed yet. */ -#define FILE_LINE_UNPROCESSED 1 - -/** This file_line is blank. Can only appear at the end of a file, due to - the way the parser works. */ -#define FILE_LINE_BLANK 2 - -/** This file_line says {{alias}}. */ -#define FILE_LINE_ALIAS_HEADER 3 - -/** This file_line defines an alias. */ -#define FILE_LINE_ALIAS_ENTRY 4 - -/** This file_line defines an {action}. */ -#define FILE_LINE_ACTION 5 - -/** This file_line specifies a URL pattern. */ -#define FILE_LINE_URL 6 - -/** This file_line says {{settings}}. */ -#define FILE_LINE_SETTINGS_HEADER 7 - -/** This file_line is in a {{settings}} block. */ -#define FILE_LINE_SETTINGS_ENTRY 8 - -/** This file_line says {{description}}. */ -#define FILE_LINE_DESCRIPTION_HEADER 9 - -/** This file_line is in a {{description}} block. */ -#define FILE_LINE_DESCRIPTION_ENTRY 10 - -/* - * Number of file modification time mismatches - * before the CGI editor gets turned off. - */ -#define ACCEPTABLE_TIMESTAMP_MISMATCHES 3 - -/** - * A configuration file, in a format that can be edited and written back to - * disk. - */ -struct editable_file -{ - struct file_line * lines; /**< The contents of the file. A linked list of lines. */ - const char * filename; /**< Full pathname - e.g. "/etc/privoxy/wibble.action". */ - unsigned identifier; /**< The file name's position in csp->config->actions_file[]. */ - 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) */ -}; - -/** - * Information about the filter types. - * Used for macro replacement in cgi_edit_actions_for_url. - */ -struct filter_type_info -{ - const int multi_action_index; /**< The multi action index as defined in project.h */ - const char *macro_name; /**< Name of the macro that has to be replaced - with the prepared templates. - For example "content-filter-params" */ - const char *type; /**< Name of the filter type, - for example "server-header-filter". */ - /* XXX: check if these two can be combined. */ - const char *disable_all_option; /**< Name of the catch-all radio option that has - to be checked or unchecked for this filter type. */ - const char *disable_all_param; /**< Name of the parameter that causes all filters of - this type to be disabled. */ - const char *abbr_type; /**< Abbreviation of the filter type, usually the - first or second character capitalized */ - const char *anchor; /**< Anchor for the User Manual link, - for example "SERVER-HEADER-FILTER" */ -}; - -/* Accessed by index, keep the order in the way the FT_ macros are defined. */ -static const struct filter_type_info filter_type_info[] = -{ - { - ACTION_MULTI_FILTER, - "content-filter-params", "filter", - "filter-all", "filter_all", - "F", "FILTER" - }, - { - ACTION_MULTI_CLIENT_HEADER_FILTER, - "client-header-filter-params", "client-header-filter", - "client-header-filter-all", "client_header_filter_all", - "C", "CLIENT-HEADER-FILTER" - }, - { - ACTION_MULTI_SERVER_HEADER_FILTER, - "server-header-filter-params", "server-header-filter", - "server-header-filter-all", "server_header_filter_all", - "S", "SERVER-HEADER-FILTER" - }, - { - ACTION_MULTI_CLIENT_HEADER_TAGGER, - "client-header-tagger-params", "client-header-tagger", - "client-header-tagger-all", "client_header_tagger_all", - "L", "CLIENT-HEADER-TAGGER" - }, - { - ACTION_MULTI_SERVER_HEADER_TAGGER, - "server-header-tagger-params", "server-header-tagger", - "server-header-tagger-all", "server_header_tagger_all", - "E", "SERVER-HEADER-TAGGER" - }, -}; - -/* 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, - 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_file_read_only(struct client_state *csp, - struct http_response *rsp, - const char *filename); - -/* 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_url_spec_param(struct client_state *csp, - const struct map *parameters, - const char *name, - char **pvalue); - - -/* 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 */ - -static jb_err get_file_name_param(struct client_state *csp, - const struct map *parameters, - const char *param_name, - const char **pfilename); - -/* Internal convenience functions */ -static char *section_target(const unsigned sectionid); - -/********************************************************************* - * - * Function : section_target - * - * Description : Given an unsigned (section id) n, produce a dynamically - * allocated string of the form #l<n>, for use in link - * targets. - * - * XXX: The hash should be moved into the templates - * to make this function more generic and render - * stringify() obsolete. - * - * Parameters : - * 1 : sectionid = start line number of section - * - * Returns : String with link target, or NULL if out of - * memory - * - *********************************************************************/ -static char *section_target(const unsigned sectionid) -{ - char buf[30]; - - snprintf(buf, sizeof(buf), "#l%d", sectionid); - return(strdup(buf)); - -} - - -/********************************************************************* - * - * Function : stringify - * - * Description : Convert a number into a dynamically allocated string. - * - * Parameters : - * 1 : number = The number to convert. - * - * Returns : String with link target, or NULL if out of memory - * - *********************************************************************/ -static char *stringify(const unsigned number) -{ - char buf[6]; - - snprintf(buf, sizeof(buf), "%i", number); - return strdup(buf); -} - - -/********************************************************************* - * - * 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_url - * - * 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 - * i : (action index) 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; - unsigned section_start_line_number = 0; - 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++) - { - if (cur_line->type == FILE_LINE_ACTION) - { - section_start_line_number = line_number; - } - cur_line = cur_line->next; - } - - if ( (cur_line == NULL) - || (line_number != patternid) - || (patternid < 1U) - || (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, stringify(file->identifier), 0); - 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); - if (!err) err = map(exports, "jumptarget", 1, section_target(section_start_line_number), 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 : (number) The action file identifier. - * 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; - unsigned section_start_line_number = 0; - 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++) - { - if (cur_line->type == FILE_LINE_ACTION) - { - section_start_line_number = line_number; - } - cur_line = cur_line->next; - } - - if ( (cur_line == NULL) - || (line_number != patternid) - || (patternid < 1U) - || (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, stringify(file->identifier), 0); - 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); - if (!err) err = map(exports, "jumptarget", 1, section_target(section_start_line_number), 0); - if (!err) err = map(exports, "actions-file", 1, html_encode(file->filename), 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 : file = File 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 (NULL == (fp = fopen(file->filename, "wb"))) - { - 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) - { - - if (NULL != strchr(cur_line->unprocessed, '#')) - { - /* Must quote '#' characters */ - int numhash = 0; - size_t 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) + (size_t)numhash; - if (NULL == (str = malloc(len + 1))) - { - /* Uh oh, just trashed file! */ - fclose(fp); - return JB_ERR_MEMORY; - } - - /* Copy string but quote hashes */ - src = cur_line->unprocessed; - dest = str; - while (*src) - { - if (*src == '#') - { - *dest++ = '\'; - numhash--; - assert(numhash >= 0); - } - *dest++ = *src++; - } - *dest = '\0'; - - assert(numhash == 0); - assert(strlen(str) == len); - assert(str == dest - len); - assert(src - len <= cur_line->unprocessed); - - if ((strlen(str) != len) || (numhash != 0)) - { - /* - * Escaping didn't work as expected, go spread the news. - * Only reached in non-debugging builds. - */ - log_error(LOG_LEVEL_ERROR, - "Looks like hash escaping failed. %s might be corrupted now.", - file->filename); - } - - 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, sizeof(version_buf), "%u", file->version); - version_buf[sizeof(version_buf)-1] = '\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->version_str); - file->version = 0; - file->parse_error_text = NULL; /* Statically allocated */ - file->parse_error = NULL; - - free(file); -} - - -/********************************************************************* - * - * Function : edit_free_file_lines - * - * 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 : pname = Destination for name - * 2 : pvalue = 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 = (size_t)(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 > (size_t)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. - * 3 : newline = How to handle newlines. - * - * 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 : pfile = Destination for the file. Will be set - * to NULL on error. - * - * CGI Parameters : - * f : The action file identifier. - * 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, - struct editable_file **pfile) -{ - struct file_line * lines; - FILE * fp; - jb_err err; - const char *filename = NULL; - struct editable_file * file; - unsigned version = 0; - struct stat statbuf[1]; - char version_buf[22]; - int newline = NEWLINE_UNKNOWN; - unsigned i; - - assert(csp); - assert(parameters); - assert(pfile); - - *pfile = NULL; - - err = get_number_param(csp, parameters, "f", &i); - if ((JB_ERR_OK == err) && (i < MAX_AF_FILES) && (NULL != csp->config->actions_file[i])) - { - filename = csp->config->actions_file[i]; - } - else if (JB_ERR_CGI_PARAMS == err) - { - /* - * Probably an old-school URL like - * http://config.privoxy.org/edit-actions-list?f=default - */ - err = get_file_name_param(csp, parameters, "f", &filename); - } - - if (NULL == filename || stat(filename, statbuf) < 0) - { - /* Error, probably file not found. */ - 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) - { - return err; - } - - if (version != specified_version) - { - return JB_ERR_MODIFIED; - } - } - - if (NULL == (fp = fopen(filename,"rb"))) - { - return JB_ERR_FILE; - } - - err = edit_read_file_lines(fp, &lines, &newline); - - fclose(fp); - - if (err) - { - return err; - } - - file = (struct editable_file *) zalloc(sizeof(*file)); - if (err) - { - edit_free_file_lines(lines); - return err; - } - - file->lines = lines; - file->newline = newline; - file->filename = filename; - file->version = version; - file->identifier = i; - - /* Correct file->version_str */ - freez(file->version_str); - snprintf(version_buf, sizeof(version_buf), "%u", file->version); - version_buf[sizeof(version_buf)-1] = '\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 : - * f : The actions file identifier. - * 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; - static int acceptable_failures = ACCEPTABLE_TIMESTAMP_MISMATCHES - 1; - - assert(csp); - assert(parameters); - assert(pfile); - - *pfile = NULL; - - err = edit_read_file(csp, parameters, require_version, &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) - { - assert(require_version); - err = cgi_error_modified(csp, rsp, lookup(parameters, "f")); - log_error(LOG_LEVEL_ERROR, - "Blocking CGI edit request due to modification time mismatch."); - if (acceptable_failures > 0) - { - log_error(LOG_LEVEL_INFO, - "The CGI editor will be turned off after another %d mismatche(s).", - acceptable_failures); - acceptable_failures--; - } - else - { - log_error(LOG_LEVEL_INFO, - "Timestamp mismatch limit reached, turning CGI editor off. " - "Reload the configuration file to reenable it."); - csp->config->feature_flags &= ~RUNTIME_FEATURE_CGI_EDIT_ACTIONS; - } - } - 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 using the old syntax. - * This function handles security checks and only - * accepts files that Privoxy already knows. - * - * 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 : pfilename = pointer to the filename in - * csp->config->actions_file[] if found. Set to NULL on error. - * - * 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 **pfilename) -{ - const char *param; - const char suffix[] = ".action"; - const char *s; - char *name; - char *fullpath; - char ch; - size_t len; - size_t name_size; - int i; - - assert(csp); - assert(parameters); - assert(pfilename); - - *pfilename = NULL; - - param = lookup(parameters, param_name); - if (!*param) - { - return JB_ERR_CGI_PARAMS; - } - - len = strlen(param); - if (len >= FILENAME_MAX) - { - /* Too long. */ - return JB_ERR_CGI_PARAMS; - } - - /* - * Check every character to see if it's legal. - * Totally unnecessary but we do it anyway. - */ - 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; - } - } - - /* Append extension */ - name_size = len + strlen(suffix) + 1; - name = malloc(name_size); - if (name == NULL) - { - return JB_ERR_MEMORY; - } - strlcpy(name, param, name_size); - strlcat(name, suffix, name_size); - - /* Prepend path */ - fullpath = make_path(csp->config->confdir, name); - free(name); - - if (fullpath == NULL) - { - return JB_ERR_MEMORY; - } - - /* Check if the file is known */ - for (i = 0; i < MAX_AF_FILES; i++) - { - if (NULL != csp->config->actions_file[i] && - !strcmp(fullpath, csp->config->actions_file[i])) - { - /* Success */ - *pfilename = csp->config->actions_file[i]; - freez(fullpath); - - return JB_ERR_OK; - } - } - freez(fullpath); - - return JB_ERR_CGI_PARAMS; -} - - -/********************************************************************* - * - * Function : get_url_spec_param - * - * Description : Get a URL pattern from the parameters - * passed to a CGI function. Removes leading/trailing - * spaces and validates it. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : parameters = map of cgi parameters - * 3 : name = Name of CGI parameter to read - * 4 : pvalue = destination for value. Will be malloc()'d. - * Set to NULL on error. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the parameter was not specified - * or is not valid. - * - *********************************************************************/ -static jb_err get_url_spec_param(struct client_state *csp, - const struct map *parameters, - const char *name, - char **pvalue) -{ - const char *orig_param; - char *param; - char *s; - struct url_spec compiled[1]; - jb_err err; - - assert(csp); - assert(parameters); - assert(name); - assert(pvalue); - - *pvalue = NULL; - - orig_param = lookup(parameters, name); - if (!*orig_param) - { - return JB_ERR_CGI_PARAMS; - } - - /* Copy and trim whitespace */ - param = strdup(orig_param); - if (param == NULL) - { - return JB_ERR_MEMORY; - } - chomp(param); - - /* Must be non-empty, and can't allow 1st character to be '{' */ - if (param[0] == '\0' || param[0] == '{') - { - free(param); - return JB_ERR_CGI_PARAMS; - } - - /* Check for embedded newlines */ - for (s = param; *s != '\0'; s++) - { - if ((*s == '\r') || (*s == '\n')) - { - free(param); - return JB_ERR_CGI_PARAMS; - } - } - - /* Check that regex is valid */ - s = strdup(param); - if (s == NULL) - { - free(param); - return JB_ERR_MEMORY; - } - err = create_url_spec(compiled, s); - free(s); - if (err) - { - free(param); - return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS; - } - free_url_spec(compiled); - - if (param[strlen(param) - 1] == '\') - { - /* - * Must protect trailing '\' from becoming line continuation character. - * Two methods: 1) If it's a domain only, add a trailing '/'. - * 2) For path, add the do-nothing PCRE expression (?:) to the end - */ - if (strchr(param, '/') == NULL) - { - err = string_append(¶m, "/"); - } - else - { - err = string_append(¶m, "(?:)"); - } - if (err) - { - return err; - } - - /* Check that the modified regex is valid */ - s = strdup(param); - if (s == NULL) - { - free(param); - return JB_ERR_MEMORY; - } - err = create_url_spec(compiled, s); - free(s); - if (err) - { - free(param); - return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS; - } - free_url_spec(compiled); - } - - *pvalue = param; - return JB_ERR_OK; -} - -/********************************************************************* - * - * Function : map_radio - * - * Description : Map a set of radio button values. E.g. if you have - * 3 radio buttons, declare them as: - * <option type="radio" name="xyz" @xyz-a@> - * <option type="radio" name="xyz" @xyz-b@> - * <option type="radio" name="xyz" @xyz-c@> - * Then map one of the @xyz-?@ variables to "checked" - * and all the others to empty by calling: - * map_radio(exports, "xyz", "abc", sel) - * Where 'sel' is 'a', 'b', or 'c'. - * - * Parameters : - * 1 : exports = Exports map to modify. - * 2 : optionname = name for map - * 3 : values = null-terminated list of values; - * 4 : value = Selected value. - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * - *********************************************************************/ -static jb_err map_radio(struct map * exports, - const char * optionname, - const char * values, - int value) -{ - char * buf; - char * p; - char c; - const size_t len = strlen(optionname); - const size_t buf_size = len + 3; - - assert(exports); - assert(optionname); - assert(values); - - buf = malloc(buf_size); - if (buf == NULL) - { - return JB_ERR_MEMORY; - } - - strlcpy(buf, optionname, buf_size); - - /* XXX: this looks ... interesting */ - p = buf + len; - *p++ = '-'; - p[1] = '\0'; - - while ((c = *values++) != '\0') - { - if (c != value) - { - *p = c; - if (map(exports, buf, 1, "", 1)) - { - return JB_ERR_MEMORY; - } - } - } - - *p = (char)value; - return map(exports, buf, 0, "checked", 1); -} - - -/********************************************************************* - * - * Function : cgi_error_modified - * - * Description : CGI function that is called when a file is modified - * outside the CGI editor. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : filename = The file that was modified. - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_modified(struct client_state *csp, - struct http_response *rsp, - const char *filename) -{ - struct map *exports; - jb_err err; - - assert(csp); - assert(rsp); - assert(filename); - - if (NULL == (exports = default_exports(csp, NULL))) - { - return JB_ERR_MEMORY; - } - - err = map(exports, "f", 1, html_encode(filename), 0); - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "cgi-error-modified", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_error_parse - * - * Description : CGI function that is called when a file cannot - * be parsed by the CGI editor. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : file = The file that was modified. - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_parse(struct client_state *csp, - struct http_response *rsp, - struct editable_file *file) -{ - struct map *exports; - jb_err err; - struct file_line *cur_line; - - assert(csp); - assert(rsp); - assert(file); - - if (NULL == (exports = default_exports(csp, NULL))) - { - return JB_ERR_MEMORY; - } - - err = map(exports, "f", 1, stringify(file->identifier), 0); - if (!err) err = map(exports, "parse-error", 1, html_encode(file->parse_error_text), 0); - - cur_line = file->parse_error; - assert(cur_line); - - if (!err) err = map(exports, "line-raw", 1, html_encode(cur_line->raw), 0); - if (!err) err = map(exports, "line-data", 1, html_encode(cur_line->unprocessed), 0); - - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "cgi-error-parse", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_error_file - * - * Description : CGI function that is called when a file cannot be - * opened by the CGI editor. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : filename = The file that was modified. - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_file(struct client_state *csp, - struct http_response *rsp, - const char *filename) -{ - struct map *exports; - jb_err err; - - assert(csp); - assert(rsp); - assert(filename); - - if (NULL == (exports = default_exports(csp, NULL))) - { - return JB_ERR_MEMORY; - } - - err = map(exports, "f", 1, html_encode(filename), 0); - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "cgi-error-file", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_error_file_read_only - * - * Description : CGI function that is called when a file cannot be - * opened for writing by the CGI editor. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : filename = The file that we can't write to - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_file_read_only(struct client_state *csp, - struct http_response *rsp, - const char *filename) -{ - struct map *exports; - jb_err err; - - assert(csp); - assert(rsp); - assert(filename); - - if (NULL == (exports = default_exports(csp, NULL))) - { - return JB_ERR_MEMORY; - } - - err = map(exports, "f", 1, html_encode(filename), 0); - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "cgi-error-file-read-only", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions - * - * Description : CGI function that allows the user to choose which - * actions file to edit. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error - * - *********************************************************************/ -jb_err cgi_edit_actions(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - (void)parameters; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - /* FIXME: Incomplete */ - - return cgi_redirect(rsp, CGI_PREFIX "edit-actions-list?f=default"); - -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_list - * - * Description : CGI function that edits the actions list. - * FIXME: This function shouldn't FATAL ever. - * FIXME: This function doesn't check the retval of map() - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : filename - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_FILE if the file cannot be opened or - * contains no data - * JB_ERR_CGI_PARAMS if "filename" was not specified - * or is not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_list(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - char * section_template; - char * url_template; - char * sections; - char * urls; - char buf[150]; - char * s; - struct map * exports; - struct map * section_exports; - struct map * url_exports; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number = 0; - unsigned prev_section_line_number = ((unsigned) (-1)); - int i, url_1_2; - struct file_list * fl; - struct url_actions * b; - char * buttons = NULL; - jb_err err; - - 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; - } - - /* Load actions file */ - err = edit_read_actions_file(csp, rsp, parameters, 0, &file); - if (err) - { - /* No filename specified, can't read file, or out of memory. */ - free_map(exports); - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - /* Find start of actions in file */ - cur_line = file->lines; - line_number = 1; - while ((cur_line != NULL) && (cur_line->type != FILE_LINE_ACTION)) - { - cur_line = cur_line->next; - line_number++; - } - - /* - * Conventional actions files should have a match all block - * at the start: - * cur_line = {...global actions...} - * cur_line->next = / - * cur_line->next->next = {...actions...} or EOF - */ - if ( (cur_line != NULL) - && (cur_line->type == FILE_LINE_ACTION) - && (cur_line->next != NULL) - && (cur_line->next->type == FILE_LINE_URL) - && (0 == strcmp(cur_line->next->unprocessed, "/")) - && ( (cur_line->next->next == NULL) - || (cur_line->next->next->type != FILE_LINE_URL) - ) ) - { - /* - * Generate string with buttons to set actions for "/" to - * any predefined set of actions (named standard.*, probably - * residing in standard.action). - */ - - err = template_load(csp, §ion_template, "edit-actions-list-button", 0); - if (err) - { - edit_free_file(file); - free_map(exports); - if (err == JB_ERR_FILE) - { - return cgi_error_no_template(csp, rsp, "edit-actions-list-button"); - } - return err; - } - - err = template_fill(§ion_template, exports); - if (err) - { - edit_free_file(file); - free_map(exports); - return err; - } - - buttons = strdup(""); - for (i = 0; i < MAX_AF_FILES; i++) - { - if (((fl = csp->actions_list[i]) != NULL) && ((b = fl->f) != NULL)) - { - for (b = b->next; NULL != b; b = b->next) - { - if (!strncmp(b->url->spec, "standard.", 9) && *(b->url->spec + 9) != '\0') - { - if (err || (NULL == (section_exports = new_map()))) - { - freez(buttons); - free(section_template); - edit_free_file(file); - free_map(exports); - return JB_ERR_MEMORY; - } - - err = map(section_exports, "button-name", 1, b->url->spec + 9, 1); - - if (err || (NULL == (s = strdup(section_template)))) - { - free_map(section_exports); - freez(buttons); - free(section_template); - edit_free_file(file); - free_map(exports); - return JB_ERR_MEMORY; - } - - if (!err) err = template_fill(&s, section_exports); - free_map(section_exports); - if (!err) err = string_join(&buttons, s); - } - } - } - } - freez(section_template); - if (!err) err = map(exports, "all-urls-buttons", 1, buttons, 0); - - /* - * Conventional actions file, supply extra editing help. - * (e.g. don't allow them to make it an unconventional one). - */ - if (!err) err = map_conditional(exports, "all-urls-present", 1); - - snprintf(buf, sizeof(buf), "%d", line_number); - if (!err) err = map(exports, "all-urls-s", 1, buf, 1); - snprintf(buf, sizeof(buf), "%d", line_number + 2); - if (!err) err = map(exports, "all-urls-s-next", 1, buf, 1); - if (!err) err = map(exports, "all-urls-actions", 1, - actions_to_html(csp, cur_line->data.action), 0); - - /* Skip the 2 lines */ - cur_line = cur_line->next->next; - line_number += 2; - - /* - * Note that prev_section_line_number is NOT set here. - * This is deliberate and not a bug. It stops a "Move up" - * option appearing on the next section. Clicking "Move - * up" would make the actions file unconventional, which - * we don't want, so we hide this option. - */ - } - else - { - /* - * Non-standard actions file - does not begin with - * the "All URLs" section. - */ - if (!err) err = map_conditional(exports, "all-urls-present", 0); - } - - /* Set up global exports */ - - if (!err) err = map(exports, "actions-file", 1, html_encode(file->filename), 0); - if (!err) err = map(exports, "f", 1, stringify(file->identifier), 0); - if (!err) err = map(exports, "v", 1, file->version_str, 1); - - /* Discourage private additions to default.action */ - - if (!err) err = map_conditional(exports, "default-action", - (strstr("default.action", file->filename) != NULL)); - if (err) - { - edit_free_file(file); - free_map(exports); - return err; - } - - /* Should do all global exports above this point */ - - /* Load templates */ - - err = template_load(csp, §ion_template, "edit-actions-list-section", 0); - if (err) - { - edit_free_file(file); - free_map(exports); - if (err == JB_ERR_FILE) - { - return cgi_error_no_template(csp, rsp, "edit-actions-list-section"); - } - return err; - } - - err = template_load(csp, &url_template, "edit-actions-list-url", 0); - if (err) - { - free(section_template); - edit_free_file(file); - free_map(exports); - if (err == JB_ERR_FILE) - { - return cgi_error_no_template(csp, rsp, "edit-actions-list-url"); - } - return err; - } - - err = template_fill(§ion_template, exports); - if (err) - { - free(url_template); - edit_free_file(file); - free_map(exports); - return err; - } - - err = template_fill(&url_template, exports); - if (err) - { - free(section_template); - edit_free_file(file); - free_map(exports); - return err; - } - - if (NULL == (sections = strdup(""))) - { - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - return JB_ERR_MEMORY; - } - - while ((cur_line != NULL) && (cur_line->type == FILE_LINE_ACTION)) - { - if (NULL == (section_exports = new_map())) - { - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - return JB_ERR_MEMORY; - } - - snprintf(buf, sizeof(buf), "%d", line_number); - err = map(section_exports, "s", 1, buf, 1); - if (!err) err = map(section_exports, "actions", 1, - actions_to_html(csp, cur_line->data.action), 0); - - if ( (!err) - && (cur_line->next != NULL) - && (cur_line->next->type == FILE_LINE_URL)) - { - /* This section contains at least one URL, don't allow delete */ - err = map_block_killer(section_exports, "empty-section"); - } - else - { - if (!err) err = map_block_keep(section_exports, "empty-section"); - } - - if (prev_section_line_number != ((unsigned)(-1))) - { - /* Not last section */ - snprintf(buf, sizeof(buf), "%d", prev_section_line_number); - if (!err) err = map(section_exports, "s-prev", 1, buf, 1); - if (!err) err = map_block_keep(section_exports, "s-prev-exists"); - } - else - { - /* Last section */ - if (!err) err = map_block_killer(section_exports, "s-prev-exists"); - } - prev_section_line_number = line_number; - - if (err) - { - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - return err; - } - - /* Should do all section-specific exports above this point */ - - if (NULL == (urls = strdup(""))) - { - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - return JB_ERR_MEMORY; - } - - url_1_2 = 2; - - cur_line = cur_line->next; - line_number++; - - while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL)) - { - if (NULL == (url_exports = new_map())) - { - free(urls); - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - return JB_ERR_MEMORY; - } - - snprintf(buf, sizeof(buf), "%d", line_number); - err = map(url_exports, "p", 1, buf, 1); - - snprintf(buf, sizeof(buf), "%d", url_1_2); - if (!err) err = map(url_exports, "url-1-2", 1, buf, 1); - - if (!err) err = map(url_exports, "url-html", 1, - html_encode(cur_line->unprocessed), 0); - if (!err) err = map(url_exports, "url", 1, - url_encode(cur_line->unprocessed), 0); - - if (err) - { - free(urls); - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - free_map(url_exports); - return err; - } - - if (NULL == (s = strdup(url_template))) - { - free(urls); - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - free_map(url_exports); - return JB_ERR_MEMORY; - } - - err = template_fill(&s, section_exports); - if (!err) err = template_fill(&s, url_exports); - if (!err) err = string_append(&urls, s); - - free_map(url_exports); - freez(s); - - if (err) - { - freez(urls); - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - return err; - } - - url_1_2 = 3 - url_1_2; - - cur_line = cur_line->next; - line_number++; - } - - err = map(section_exports, "urls", 1, urls, 0); - - /* Could also do section-specific exports here, but it wouldn't be as fast */ - - snprintf(buf, sizeof(buf), "%d", line_number); - if (!err) err = map(section_exports, "s-next", 1, buf, 1); - - if ( (cur_line != NULL) - && (cur_line->type == FILE_LINE_ACTION)) - { - /* Not last section */ - if (!err) err = map_block_keep(section_exports, "s-next-exists"); - } - else - { - /* Last section */ - if (!err) err = map_block_killer(section_exports, "s-next-exists"); - } - - if (err) - { - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - return err; - } - - if (NULL == (s = strdup(section_template))) - { - free(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - free_map(section_exports); - return JB_ERR_MEMORY; - } - - err = template_fill(&s, section_exports); - if (!err) err = string_append(§ions, s); - - freez(s); - free_map(section_exports); - - if (err) - { - freez(sections); - free(section_template); - free(url_template); - edit_free_file(file); - free_map(exports); - return err; - } - } - - edit_free_file(file); - free(section_template); - free(url_template); - - err = map(exports, "sections", 1, sections, 0); - if (err) - { - free_map(exports); - return err; - } - - /* Could also do global exports here, but it wouldn't be as fast */ - - return template_fill_for_cgi(csp, "edit-actions-list", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_for_url - * - * Description : CGI function that edits the Actions list. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_for_url(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map * exports; - unsigned sectionid; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number; - jb_err err; - struct re_filterfile_spec *filter_group; - int i, have_filters = 0; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "s", §ionid); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - cur_line = file->lines; - - for (line_number = 1; (cur_line != NULL) && (line_number < sectionid); line_number++) - { - cur_line = cur_line->next; - } - - if ( (cur_line == NULL) - || (line_number != sectionid) - || (sectionid < 1) - || (cur_line->type != FILE_LINE_ACTION)) - { - /* Invalid "sectionid" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - if (NULL == (exports = default_exports(csp, NULL))) - { - edit_free_file(file); - return JB_ERR_MEMORY; - } - - err = map(exports, "f", 1, stringify(file->identifier), 0); - if (!err) err = map(exports, "v", 1, file->version_str, 1); - if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0); - - if (!err) err = actions_to_radio(exports, cur_line->data.action); - - /* - * XXX: Some browsers (at least IE6 and IE7) have an artifical URL - * length limitation and ignore clicks on the Submit buttons if - * the resulting GET URL would be longer than their limit. - * - * In Privoxy 3.0.5 beta the standard edit-actions-for-url template - * reached this limit and action editing stopped working in these - * browsers (BR #1570678). - * - * The config option split-large-forms works around this browser - * bug (HTTP has no URL lenght limitation) by deviding the action - * list form into multiple smaller ones. It means the URLs are shorter - * and work in broken browsers as well, but the user can no longer change - * all actions with one submit. - * - * A better solution would be to switch to POST requests, - * but this will do for now. - */ - if(!err && (csp->config->feature_flags & RUNTIME_FEATURE_SPLIT_LARGE_FORMS)) - { - /* Generate multiple smaller form by killing the big one. */ - err = map_block_killer(exports, "one-form-only"); - } - else - { - /* Default: Generate one large form by killing the smaller ones. */ - err = map_block_killer(exports, "multiple-forms"); - } - - for (i = 0; i < MAX_AF_FILES; i++) - { - if ((csp->rlist[i] != NULL) && (csp->rlist[i]->f != NULL)) - { - if (!err) err = map_conditional(exports, "any-filters-defined", 1); - have_filters = 1; - break; - } - } - - if (err) - { - edit_free_file(file); - free_map(exports); - return err; - } - - if (0 == have_filters) - { - err = map(exports, "filter-params", 1, "", 1); - } - else - { - /* - * List available filters and their settings. - */ - char *filter_template; - int filter_identifier = 0; - char *prepared_templates[MAX_FILTER_TYPES]; - - for (i = 0; i < MAX_FILTER_TYPES; i++) - { - prepared_templates[i] = strdup(""); - } - - err = template_load(csp, &filter_template, "edit-actions-for-url-filter", 0); - if (err) - { - edit_free_file(file); - free_map(exports); - if (err == JB_ERR_FILE) - { - return cgi_error_no_template(csp, rsp, "edit-actions-for-url-filter"); - } - return err; - } - - err = template_fill(&filter_template, exports); - - for (i = 0; i < MAX_AF_FILES; i++) - { - if ((csp->rlist[i] != NULL) && (csp->rlist[i]->f != NULL)) - { - filter_group = csp->rlist[i]->f; - for (;(!err) && (filter_group != NULL); filter_group = filter_group->next) - { - char current_mode = 'x'; - char number[20]; - struct list_entry *filter_name; - struct map *line_exports; - const int type = filter_group->type; - const int multi_action_index = filter_type_info[type].multi_action_index; - - assert(type < MAX_FILTER_TYPES); - - filter_name = cur_line->data.action->multi_add[multi_action_index]->first; - while ((filter_name != NULL) - && (0 != strcmp(filter_group->name, filter_name->str))) - { - filter_name = filter_name->next; - } - - if (filter_name != NULL) - { - current_mode = 'y'; - } - else - { - filter_name = cur_line->data.action->multi_remove[multi_action_index]->first; - while ((filter_name != NULL) - && (0 != strcmp(filter_group->name, filter_name->str))) - { - filter_name = filter_name->next; - } - if (filter_name != NULL) - { - current_mode = 'n'; - } - } - - /* Generate a unique serial number */ - snprintf(number, sizeof(number), "%x", filter_identifier++); - number[sizeof(number) - 1] = '\0'; - - line_exports = new_map(); - if (line_exports == NULL) - { - err = JB_ERR_MEMORY; - } - else - { - char *filter_line; - - if (!err) err = map(line_exports, "index", 1, number, 1); - if (!err) err = map(line_exports, "name", 1, filter_group->name, 1); - if (!err) err = map(line_exports, "description", 1, filter_group->description, 1); - if (!err) err = map_radio(line_exports, "this-filter", "ynx", current_mode); - if (!err) err = map(line_exports, "filter-type", 1, filter_type_info[type].type, 1); - if (!err) err = map(line_exports, "abbr-filter-type", 1, filter_type_info[type].abbr_type, 1); - if (!err) err = map(line_exports, "anchor", 1, filter_type_info[type].anchor, 1); - - if (!err) - { - filter_line = strdup(filter_template); - if (filter_line == NULL) err = JB_ERR_MEMORY; - } - if (!err) err = template_fill(&filter_line, line_exports); - string_join(&prepared_templates[type], filter_line); - - free_map(line_exports); - } - } - } - } - freez(filter_template); - - /* Replace all filter macros with the aggregated templates */ - for (i = 0; i < MAX_FILTER_TYPES; i++) - { - if (err) break; - err = map(exports, filter_type_info[i].macro_name, 1, prepared_templates[i], 0); - } - - if (err) - { - /* Free aggregated templates */ - for (i = 0; i < MAX_FILTER_TYPES; i++) - { - freez(prepared_templates[i]); - } - } - } - - /* Check or uncheck the "disable all of this type" radio buttons. */ - for (i = 0; i < MAX_FILTER_TYPES; i++) - { - const int a = filter_type_info[i].multi_action_index; - const int disable_all = cur_line->data.action->multi_remove_all[a]; - if (err) break; - err = map_radio(exports, filter_type_info[i].disable_all_option, "nx", (disable_all ? 'n' : 'x')); - } - - edit_free_file(file); - - if (err) - { - free_map(exports); - return err; - } - - return template_fill_for_cgi(csp, "edit-actions-for-url", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_submit - * - * Description : CGI function that actually edits the Actions list. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_submit(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned sectionid; - char * actiontext; - char * newtext; - size_t newtext_size; - size_t len; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number; - char target[1024]; - jb_err err; - int filter_identifier; - int i; - const char * action_set_name; - struct file_list * fl; - struct url_actions * b; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "s", §ionid); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - cur_line = file->lines; - - for (line_number = 1; (cur_line != NULL) && (line_number < sectionid); line_number++) - { - cur_line = cur_line->next; - } - - if ( (cur_line == NULL) - || (line_number != sectionid) - || (sectionid < 1) - || (cur_line->type != FILE_LINE_ACTION)) - { - /* Invalid "sectionid" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - get_string_param(parameters, "p", &action_set_name); - if (action_set_name != NULL) - { - for (filter_identifier = 0; filter_identifier < MAX_AF_FILES; filter_identifier++) - { - if (((fl = csp->actions_list[filter_identifier]) != NULL) && ((b = fl->f) != NULL)) - { - for (b = b->next; NULL != b; b = b->next) - { - if (!strncmp(b->url->spec, "standard.", 9) && !strcmp(b->url->spec + 9, action_set_name)) - { - copy_action(cur_line->data.action, b->action); - goto found; - } - } - } - } - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - - found: ; - } - else - { - err = actions_from_radio(parameters, cur_line->data.action); - } - - if (err) - { - /* Out of memory */ - edit_free_file(file); - return err; - } - - /* Check the "disable all of this type" parameters. */ - for (i = 0; i < MAX_FILTER_TYPES; i++) - { - const int multi_action_index = filter_type_info[i].multi_action_index; - const char ch = get_char_param(parameters, filter_type_info[i].disable_all_param); - - if (ch == 'N') - { - list_remove_all(cur_line->data.action->multi_add[multi_action_index]); - list_remove_all(cur_line->data.action->multi_remove[multi_action_index]); - cur_line->data.action->multi_remove_all[multi_action_index] = 1; - } - else if (ch == 'X') - { - cur_line->data.action->multi_remove_all[multi_action_index] = 0; - } - } - - for (filter_identifier = 0; !err; filter_identifier++) - { - char key_value[30]; - char key_name[30]; - char key_type[30]; - const char *name; - char value; /* - * Filter state. Valid states are: 'Y' (active), - * 'N' (inactive) and 'X' (no change). - * XXX: bad name. - */ - char type; /* - * Abbreviated filter type. Valid types are: 'F' (content filter), - * 'S' (server-header filter) and 'C' (client-header filter). - */ - int multi_action_index = 0; - - /* Generate the keys */ - snprintf(key_value, sizeof(key_value), "filter_r%x", filter_identifier); - key_value[sizeof(key_value) - 1] = '\0'; /* XXX: Why? */ - snprintf(key_name, sizeof(key_name), "filter_n%x", filter_identifier); - key_name[sizeof(key_name) - 1] = '\0'; /* XXX: Why? */ - snprintf(key_type, sizeof(key_type), "filter_t%x", filter_identifier); - - err = get_string_param(parameters, key_name, &name); - if (err) break; - - if (name == NULL) - { - /* End of list */ - break; - } - - type = get_char_param(parameters, key_type); - switch (type) - { - case 'F': - multi_action_index = ACTION_MULTI_FILTER; - break; - case 'S': - multi_action_index = ACTION_MULTI_SERVER_HEADER_FILTER; - break; - case 'C': - multi_action_index = ACTION_MULTI_CLIENT_HEADER_FILTER; - break; - case 'L': - multi_action_index = ACTION_MULTI_CLIENT_HEADER_TAGGER; - break; - case 'E': - multi_action_index = ACTION_MULTI_SERVER_HEADER_TAGGER; - break; - default: - log_error(LOG_LEVEL_ERROR, - "Unknown filter type: %c for filter %s. Filter ignored.", type, name); - continue; - } - assert(multi_action_index); - - value = get_char_param(parameters, key_value); - if (value == 'Y') - { - list_remove_item(cur_line->data.action->multi_add[multi_action_index], name); - if (!err) err = enlist(cur_line->data.action->multi_add[multi_action_index], name); - list_remove_item(cur_line->data.action->multi_remove[multi_action_index], name); - } - else if (value == 'N') - { - list_remove_item(cur_line->data.action->multi_add[multi_action_index], name); - if (!cur_line->data.action->multi_remove_all[multi_action_index]) - { - list_remove_item(cur_line->data.action->multi_remove[multi_action_index], name); - if (!err) err = enlist(cur_line->data.action->multi_remove[multi_action_index], name); - } - } - else if (value == 'X') - { - list_remove_item(cur_line->data.action->multi_add[multi_action_index], name); - list_remove_item(cur_line->data.action->multi_remove[multi_action_index], name); - } - } - - if(err) - { - /* Out of memory */ - edit_free_file(file); - return err; - } - - if (NULL == (actiontext = actions_to_text(cur_line->data.action))) - { - /* Out of memory */ - edit_free_file(file); - return JB_ERR_MEMORY; - } - - len = strlen(actiontext); - if (len == 0) - { - /* - * Empty action - must special-case this. - * Simply setting len to 1 is sufficient... - */ - len = 1; - } - - newtext_size = len + 2; - if (NULL == (newtext = malloc(newtext_size))) - { - /* Out of memory */ - free(actiontext); - edit_free_file(file); - return JB_ERR_MEMORY; - } - strlcpy(newtext, actiontext, newtext_size); - free(actiontext); - newtext[0] = '{'; - newtext[len] = '}'; - newtext[len + 1] = '\0'; - - freez(cur_line->raw); - freez(cur_line->unprocessed); - cur_line->unprocessed = newtext; - - err = edit_write_file(file); - if (err) - { - /* Error writing file */ - if (err == JB_ERR_FILE) - { - /* Read-only file. */ - err = cgi_error_file_read_only(csp, rsp, file->filename); - } - edit_free_file(file); - return err; - } - - snprintf(target, sizeof(target), CGI_PREFIX "edit-actions-list?foo=%lu&f=%i#l%d", - (long) time(NULL), file->identifier, sectionid); - - edit_free_file(file); - - return cgi_redirect(rsp, target); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_url - * - * Description : CGI function that actually edits a URL pattern in - * an actions file. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * filename : Identifies the file to edit - * ver : File's last-modified time - * section : Line number of section to edit - * pattern : Line number of pattern to edit - * newval : New value for pattern - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_url(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned patternid; - char * new_pattern; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number; - unsigned section_start_line_number = 0; - char target[1024]; - 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; - } - if (patternid < 1U) - { - return JB_ERR_CGI_PARAMS; - } - - err = get_url_spec_param(csp, parameters, "u", &new_pattern); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - free(new_pattern); - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - line_number = 1; - cur_line = file->lines; - - while ((cur_line != NULL) && (line_number < patternid)) - { - if (cur_line->type == FILE_LINE_ACTION) - { - section_start_line_number = line_number; - } - cur_line = cur_line->next; - line_number++; - } - - if ( (cur_line == NULL) - || (cur_line->type != FILE_LINE_URL)) - { - /* Invalid "patternid" parameter */ - free(new_pattern); - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - /* At this point, the line to edit is in cur_line */ - - freez(cur_line->raw); - freez(cur_line->unprocessed); - cur_line->unprocessed = new_pattern; - - err = edit_write_file(file); - if (err) - { - /* Error writing file */ - if (err == JB_ERR_FILE) - { - /* Read-only file. */ - err = cgi_error_file_read_only(csp, rsp, file->filename); - } - edit_free_file(file); - return err; - } - - snprintf(target, sizeof(target), CGI_PREFIX "edit-actions-list?foo=%lu&f=%i#l%d", - (long) time(NULL), file->identifier, section_start_line_number); - - edit_free_file(file); - - return cgi_redirect(rsp, target); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_add_url - * - * Description : CGI function that actually adds a URL pattern to - * an actions file. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * filename : Identifies the file to edit - * ver : File's last-modified time - * section : Line number of section to edit - * newval : New pattern - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_add_url(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned sectionid; - char * new_pattern; - struct file_line * new_line; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number; - char target[1024]; - jb_err err; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "s", §ionid); - if (err) - { - return err; - } - if (sectionid < 1U) - { - return JB_ERR_CGI_PARAMS; - } - - err = get_url_spec_param(csp, parameters, "u", &new_pattern); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - free(new_pattern); - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - line_number = 1; - cur_line = file->lines; - - while ((cur_line != NULL) && (line_number < sectionid)) - { - cur_line = cur_line->next; - line_number++; - } - - if ( (cur_line == NULL) - || (cur_line->type != FILE_LINE_ACTION)) - { - /* Invalid "sectionid" parameter */ - free(new_pattern); - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - /* At this point, the section header is in cur_line - add after this. */ - - /* Allocate the new line */ - new_line = (struct file_line *)zalloc(sizeof(*new_line)); - if (new_line == NULL) - { - free(new_pattern); - edit_free_file(file); - return JB_ERR_MEMORY; - } - - /* Fill in the data members of the new line */ - new_line->raw = NULL; - new_line->prefix = NULL; - new_line->unprocessed = new_pattern; - new_line->type = FILE_LINE_URL; - - /* Link new_line into the list, after cur_line */ - new_line->next = cur_line->next; - cur_line->next = new_line; - - /* Done making changes, now commit */ - - err = edit_write_file(file); - if (err) - { - /* Error writing file */ - if (err == JB_ERR_FILE) - { - /* Read-only file. */ - err = cgi_error_file_read_only(csp, rsp, file->filename); - } - edit_free_file(file); - return err; - } - - snprintf(target, sizeof(target), CGI_PREFIX "edit-actions-list?foo=%lu&f=%i#l%d", - (long) time(NULL), file->identifier, sectionid); - - edit_free_file(file); - - return cgi_redirect(rsp, target); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_remove_url - * - * Description : CGI function that actually removes a URL pattern from - * the actions file. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * f : (filename) Identifies the file to edit - * v : (version) File's last-modified time - * p : (pattern) Line number of pattern to remove - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_remove_url(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned patternid; - struct editable_file * file; - struct file_line * cur_line; - struct file_line * prev_line; - unsigned line_number; - unsigned section_start_line_number = 0; - char target[1024]; - jb_err err; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "p", &patternid); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - line_number = 1; - prev_line = NULL; - cur_line = file->lines; - - while ((cur_line != NULL) && (line_number < patternid)) - { - if (cur_line->type == FILE_LINE_ACTION) - { - section_start_line_number = line_number; - } - prev_line = cur_line; - cur_line = cur_line->next; - line_number++; - } - - if ( (cur_line == NULL) - || (prev_line == NULL) - || (cur_line->type != FILE_LINE_URL)) - { - /* Invalid "patternid" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - /* At this point, the line to remove is in cur_line, and the previous - * one is in prev_line - */ - - /* Unlink cur_line */ - prev_line->next = cur_line->next; - cur_line->next = NULL; - - /* Free cur_line */ - edit_free_file_lines(cur_line); - - err = edit_write_file(file); - if (err) - { - /* Error writing file */ - if (err == JB_ERR_FILE) - { - /* Read-only file. */ - err = cgi_error_file_read_only(csp, rsp, file->filename); - } - edit_free_file(file); - return err; - } - - snprintf(target, sizeof(target), CGI_PREFIX "edit-actions-list?foo=%lu&f=%i#l%d", - (long) time(NULL), file->identifier, section_start_line_number); - - edit_free_file(file); - - return cgi_redirect(rsp, target); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_section_remove - * - * Description : CGI function that actually removes a whole section from - * the actions file. The section must be empty first - * (else JB_ERR_CGI_PARAMS). - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * f : (filename) Identifies the file to edit - * v : (version) File's last-modified time - * s : (section) Line number of section to edit - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_section_remove(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned sectionid; - struct editable_file * file; - struct file_line * cur_line; - struct file_line * prev_line; - unsigned line_number; - char target[1024]; - jb_err err; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "s", §ionid); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - line_number = 1; - cur_line = file->lines; - - prev_line = NULL; - while ((cur_line != NULL) && (line_number < sectionid)) - { - prev_line = cur_line; - cur_line = cur_line->next; - line_number++; - } - - if ( (cur_line == NULL) - || (cur_line->type != FILE_LINE_ACTION) ) - { - /* Invalid "sectionid" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - if ( (cur_line->next != NULL) - && (cur_line->next->type == FILE_LINE_URL) ) - { - /* Section not empty. */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - /* At this point, the line to remove is in cur_line, and the previous - * one is in prev_line - */ - - /* Unlink cur_line */ - if (prev_line == NULL) - { - /* Removing the first line from the file */ - file->lines = cur_line->next; - } - else - { - prev_line->next = cur_line->next; - } - cur_line->next = NULL; - - /* Free cur_line */ - edit_free_file_lines(cur_line); - - err = edit_write_file(file); - if (err) - { - /* Error writing file */ - if (err == JB_ERR_FILE) - { - /* Read-only file. */ - err = cgi_error_file_read_only(csp, rsp, file->filename); - } - edit_free_file(file); - return err; - } - - snprintf(target, sizeof(target), CGI_PREFIX "edit-actions-list?foo=%lu&f=%i", - (long) time(NULL), file->identifier); - - edit_free_file(file); - - return cgi_redirect(rsp, target); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_section_add - * - * Description : CGI function that adds a new empty section to - * an actions file. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * f : (filename) Identifies the file to edit - * v : (version) File's last-modified time - * s : (section) Line number of section to add after, 0 for - * start of file. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_section_add(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned sectionid; - struct file_line * new_line; - char * new_text; - struct editable_file * file; - struct file_line * cur_line; - unsigned line_number; - char target[1024]; - jb_err err; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "s", §ionid); - if (err) - { - return err; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - line_number = 1; - cur_line = file->lines; - - if (sectionid <= 1U) - { - /* Add to start of file */ - if (cur_line != NULL && cur_line->type != FILE_LINE_ACTION) - { - /* There's something in the file, find the line before the first - * action. - */ - while ( (cur_line->next != NULL) - && (cur_line->next->type != FILE_LINE_ACTION) ) - { - cur_line = cur_line->next; - line_number++; - } - } - else - { - /* File starts with action line, so insert at top */ - cur_line = NULL; - } - } - else - { - /* Add after stated section. */ - while ((cur_line != NULL) && (line_number < sectionid)) - { - cur_line = cur_line->next; - line_number++; - } - - if ( (cur_line == NULL) - || (cur_line->type != FILE_LINE_ACTION)) - { - /* Invalid "sectionid" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - /* Skip through the section to find the last line in it. */ - while ( (cur_line->next != NULL) - && (cur_line->next->type != FILE_LINE_ACTION) ) - { - cur_line = cur_line->next; - line_number++; - } - } - - /* At this point, the last line in the previous section is in cur_line - * - add after this. (Or if we need to add as the first line, cur_line - * will be NULL). - */ - - new_text = strdup("{}"); - if (NULL == new_text) - { - edit_free_file(file); - return JB_ERR_MEMORY; - } - - /* Allocate the new line */ - new_line = (struct file_line *)zalloc(sizeof(*new_line)); - if (new_line == NULL) - { - free(new_text); - edit_free_file(file); - return JB_ERR_MEMORY; - } - - /* Fill in the data members of the new line */ - new_line->raw = NULL; - new_line->prefix = NULL; - new_line->unprocessed = new_text; - new_line->type = FILE_LINE_ACTION; - - if (cur_line != NULL) - { - /* Link new_line into the list, after cur_line */ - new_line->next = cur_line->next; - cur_line->next = new_line; - } - else - { - /* Link new_line into the list, as first line */ - new_line->next = file->lines; - file->lines = new_line; - } - - /* Done making changes, now commit */ - - err = edit_write_file(file); - if (err) - { - /* Error writing file */ - if (err == JB_ERR_FILE) - { - /* Read-only file. */ - err = cgi_error_file_read_only(csp, rsp, file->filename); - } - edit_free_file(file); - return err; - } - - snprintf(target, sizeof(target), CGI_PREFIX "edit-actions-list?foo=%lu&f=%i", - (long) time(NULL), file->identifier); - - edit_free_file(file); - - return cgi_redirect(rsp, target); -} - - -/********************************************************************* - * - * Function : cgi_edit_actions_section_swap - * - * Description : CGI function that swaps the order of two sections - * in the actions file. Note that this CGI can actually - * swap any two arbitrary sections, but the GUI interface - * currently only allows consecutive sections to be - * specified. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * f : (filename) Identifies the file to edit - * v : (version) File's last-modified time - * s1 : (section1) Line number of first section to swap - * s2 : (section2) Line number of second section to swap - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_CGI_PARAMS if the CGI parameters are not - * specified or not valid. - * - *********************************************************************/ -jb_err cgi_edit_actions_section_swap(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned section1; - unsigned section2; - struct editable_file * file; - struct file_line * cur_line; - struct file_line * prev_line; - struct file_line * line_before_section1; - struct file_line * line_start_section1; - struct file_line * line_end_section1; - struct file_line * line_after_section1; - struct file_line * line_before_section2; - struct file_line * line_start_section2; - struct file_line * line_end_section2; - struct file_line * line_after_section2; - unsigned line_number; - char target[1024]; - jb_err err; - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - return cgi_error_disabled(csp, rsp); - } - - err = get_number_param(csp, parameters, "s1", §ion1); - if (!err) err = get_number_param(csp, parameters, "s2", §ion2); - if (err) - { - return err; - } - - if (section1 > section2) - { - unsigned temp = section2; - section2 = section1; - section1 = temp; - } - - err = edit_read_actions_file(csp, rsp, parameters, 1, &file); - if (err) - { - /* No filename specified, can't read file, modified, or out of memory. */ - return (err == JB_ERR_FILE ? JB_ERR_OK : err); - } - - /* Start at the beginning... */ - line_number = 1; - cur_line = file->lines; - prev_line = NULL; - - /* ... find section1 ... */ - while ((cur_line != NULL) && (line_number < section1)) - { - prev_line = cur_line; - cur_line = cur_line->next; - line_number++; - } - - if ( (cur_line == NULL) - || (cur_line->type != FILE_LINE_ACTION) ) - { - /* Invalid "section1" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - /* If no-op, we've validated params and can skip the rest. */ - if (section1 != section2) - { - /* ... find the end of section1 ... */ - line_before_section1 = prev_line; - line_start_section1 = cur_line; - do - { - prev_line = cur_line; - cur_line = cur_line->next; - line_number++; - } - while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL)); - line_end_section1 = prev_line; - line_after_section1 = cur_line; - - /* ... find section2 ... */ - while ((cur_line != NULL) && (line_number < section2)) - { - prev_line = cur_line; - cur_line = cur_line->next; - line_number++; - } - - if ( (cur_line == NULL) - || (cur_line->type != FILE_LINE_ACTION) ) - { - /* Invalid "section2" parameter */ - edit_free_file(file); - return JB_ERR_CGI_PARAMS; - } - - /* ... find the end of section2 ... */ - line_before_section2 = prev_line; - line_start_section2 = cur_line; - do - { - prev_line = cur_line; - cur_line = cur_line->next; - line_number++; - } - while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL)); - line_end_section2 = prev_line; - line_after_section2 = cur_line; - - /* Now have all the pointers we need. Do the swap. */ - - /* Change the pointer to section1 to point to section2 instead */ - if (line_before_section1 == NULL) - { - file->lines = line_start_section2; - } - else - { - line_before_section1->next = line_start_section2; - } - - if (line_before_section2 == line_end_section1) - { - /* Consecutive sections */ - line_end_section2->next = line_start_section1; - } - else - { - line_end_section2->next = line_after_section1; - line_before_section2->next = line_start_section1; - } - - /* Set the pointer from the end of section1 to the rest of the file */ - line_end_section1->next = line_after_section2; - - err = edit_write_file(file); - if (err) - { - /* Error writing file */ - if (err == JB_ERR_FILE) - { - /* Read-only file. */ - err = cgi_error_file_read_only(csp, rsp, file->filename); - } - edit_free_file(file); - return err; - } - } /* END if (section1 != section2) */ - - snprintf(target, sizeof(target), CGI_PREFIX "edit-actions-list?foo=%lu&f=%i", - (long) time(NULL), file->identifier); - - edit_free_file(file); - - return cgi_redirect(rsp, target); -} - - -/********************************************************************* - * - * Function : javascriptify - * - * Description : Converts a string into a form JavaScript will like. - * - * Netscape 4's JavaScript sucks - it doesn't use - * "id" parameters, so you have to set the "name" - * used to submit a form element to something JavaScript - * will like. (Or access the elements by index in an - * array. That array contains >60 elements and will - * be changed whenever we add a new action to the - * editor, so I'm NOT going to use indexes that have - * to be figured out by hand.) - * - * Currently the only thing we have to worry about - * is "-" ==> "_" conversion. - * - * This is a length-preserving operation so it is - * carried out in-place, no memory is allocated - * or freed. - * - * Parameters : - * 1 : identifier = String to make JavaScript-friendly. - * - * Returns : N/A - * - *********************************************************************/ -static void javascriptify(char * identifier) -{ - char * p = identifier; - while (NULL != (p = strchr(p, '-'))) - { - *p++ = '_'; - } -} - - -/********************************************************************* - * - * Function : actions_to_radio - * - * Description : Converts a actionsfile entry into settings for - * radio buttons and edit boxes on a HTML form. - * - * Parameters : - * 1 : exports = List of substitutions to add to. - * 2 : action = Action to read - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * - *********************************************************************/ -static jb_err actions_to_radio(struct map * exports, - const struct action_spec *action) -{ - unsigned long mask; - unsigned long add; - int mapped_param; - int checked; - char current_mode; - - assert(exports); - assert(action); - - mask = action->mask; - add = action->add; - - /* sanity - prevents "-feature +feature" */ - mask |= add; - - -#define DEFINE_ACTION_BOOL(name, bit) \ - if (!(mask & bit)) \ - { \ - current_mode = 'n'; \ - } \ - else if (add & bit) \ - { \ - current_mode = 'y'; \ - } \ - else \ - { \ - current_mode = 'x'; \ - } \ - if (map_radio(exports, name, "ynx", current_mode)) \ - { \ - return JB_ERR_MEMORY; \ - } - -#define DEFINE_ACTION_STRING(name, bit, index) \ - DEFINE_ACTION_BOOL(name, bit); \ - mapped_param = 0; - -#define DEFINE_CGI_PARAM_RADIO(name, bit, index, value, is_default) \ - if (add & bit) \ - { \ - checked = !strcmp(action->string[index], value); \ - } \ - else \ - { \ - checked = is_default; \ - } \ - mapped_param |= checked; \ - if (map(exports, name "-param-" value, 1, (checked ? "checked" : ""), 1)) \ - { \ - return JB_ERR_MEMORY; \ - } - -#define DEFINE_CGI_PARAM_CUSTOM(name, bit, index, default_val) \ - if (map(exports, name "-param-custom", 1, \ - ((!mapped_param) ? "checked" : ""), 1)) \ - { \ - return JB_ERR_MEMORY; \ - } \ - if (map(exports, name "-param", 1, \ - (((add & bit) && !mapped_param) ? \ - action->string[index] : default_val), 1)) \ - { \ - return JB_ERR_MEMORY; \ - } - -#define DEFINE_CGI_PARAM_NO_RADIO(name, bit, index, default_val) \ - if (map(exports, name "-param", 1, \ - ((add & bit) ? action->string[index] : default_val), 1)) \ - { \ - return JB_ERR_MEMORY; \ - } - -#define DEFINE_ACTION_MULTI(name, index) \ - if (action->multi_add[index]->first) \ - { \ - current_mode = 'y'; \ - } \ - else if (action->multi_remove_all[index]) \ - { \ - current_mode = 'n'; \ - } \ - else if (action->multi_remove[index]->first) \ - { \ - current_mode = 'y'; \ - } \ - else \ - { \ - current_mode = 'x'; \ - } \ - if (map_radio(exports, name, "ynx", current_mode)) \ - { \ - return JB_ERR_MEMORY; \ - } - -#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ - -#include "actionlist.h" - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS -#undef DEFINE_CGI_PARAM_CUSTOM -#undef DEFINE_CGI_PARAM_RADIO -#undef DEFINE_CGI_PARAM_NO_RADIO - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : actions_from_radio - * - * Description : Converts a map of parameters passed to a CGI function - * into an actionsfile entry. - * - * Parameters : - * 1 : parameters = parameters to the CGI call - * 2 : action = Action to change. Must be valid before - * the call, actions not specified will be - * left unchanged. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * - *********************************************************************/ -static jb_err actions_from_radio(const struct map * parameters, - struct action_spec *action) -{ - const char * param; - char * param_dup; - char ch; - const char * js_name; - jb_err err = JB_ERR_OK; - - assert(parameters); - assert(action); - - /* Statics are generally a potential race condition, - * but in this case we're safe and don't need semaphores. - * Be careful if you modify this function. - * - Jon - * The js_name_arr's are never free()d, but this is no - * problem, since they will only be created once and - * used by all threads thereafter. -oes - */ - -#define JAVASCRIPTIFY(dest_var, string) \ - { \ - static int first_time = 1; \ - static char *js_name_arr; \ - if (first_time) \ - { \ - js_name_arr = strdup(string); \ - javascriptify(js_name_arr); \ - } \ - dest_var = js_name_arr; \ - first_time = 0; \ - } \ - -#define DEFINE_ACTION_BOOL(name, bit) \ - JAVASCRIPTIFY(js_name, name); \ - ch = get_char_param(parameters, js_name); \ - if (ch == 'Y') \ - { \ - action->add |= bit; \ - action->mask |= bit; \ - } \ - else if (ch == 'N') \ - { \ - action->add &= ~bit; \ - action->mask &= ~bit; \ - } \ - else if (ch == 'X') \ - { \ - action->add &= ~bit; \ - action->mask |= bit; \ - } \ - -#define DEFINE_ACTION_STRING(name, bit, index) \ - JAVASCRIPTIFY(js_name, name); \ - ch = get_char_param(parameters, js_name); \ - if (ch == 'Y') \ - { \ - param = NULL; \ - JAVASCRIPTIFY(js_name, name "-mode"); \ - if (!err) err = get_string_param(parameters, js_name, ¶m); \ - if ((param == NULL) || (0 == strcmp(param, "CUSTOM"))) \ - { \ - JAVASCRIPTIFY(js_name, name "-param"); \ - if (!err) err = get_string_param(parameters, js_name, ¶m); \ - } \ - if (param != NULL) \ - { \ - if (NULL == (param_dup = strdup(param))) \ - { \ - return JB_ERR_MEMORY; \ - } \ - freez(action->string[index]); \ - action->add |= bit; \ - action->mask |= bit; \ - action->string[index] = param_dup; \ - } \ - } \ - else if (ch == 'N') \ - { \ - if (action->add & bit) \ - { \ - freez(action->string[index]); \ - } \ - action->add &= ~bit; \ - action->mask &= ~bit; \ - } \ - else if (ch == 'X') \ - { \ - if (action->add & bit) \ - { \ - freez(action->string[index]); \ - } \ - action->add &= ~bit; \ - action->mask |= bit; \ - } \ - -#define DEFINE_ACTION_MULTI(name, index) \ - JAVASCRIPTIFY(js_name, name); \ - ch = get_char_param(parameters, js_name); \ - if (ch == 'Y') \ - { \ - /* FIXME */ \ - } \ - else if (ch == 'N') \ - { \ - list_remove_all(action->multi_add[index]); \ - list_remove_all(action->multi_remove[index]); \ - action->multi_remove_all[index] = 1; \ - } \ - else if (ch == 'X') \ - { \ - list_remove_all(action->multi_add[index]); \ - list_remove_all(action->multi_remove[index]); \ - action->multi_remove_all[index] = 0; \ - } \ - -#define DEFINE_ACTION_ALIAS 0 /* No aliases for URL parsing */ - -#include "actionlist.h" - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS -#undef JAVASCRIPTIFY - - return err; -} -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - - -#ifdef FEATURE_TOGGLE -/********************************************************************* - * - * Function : cgi_toggle - * - * Description : CGI function that adds a new empty section to - * an actions file. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * set : If present, how to change toggle setting: - * "enable", "disable", "toggle", or none (default). - * mini : If present, use mini reply template. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * - *********************************************************************/ -jb_err cgi_toggle(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map *exports; - char mode; - const char *template_name; - - assert(csp); - assert(rsp); - assert(parameters); - - if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_TOGGLE)) - { - return cgi_error_disabled(csp, rsp); - } - - mode = get_char_param(parameters, "set"); - - if (mode == 'E') - { - /* Enable */ - global_toggle_state = 1; - } - else if (mode == 'D') - { - /* Disable */ - global_toggle_state = 0; - } - else if (mode == 'T') - { - /* Toggle */ - global_toggle_state = !global_toggle_state; - } - - if (NULL == (exports = default_exports(csp, "toggle"))) - { - return JB_ERR_MEMORY; - } - - template_name = (get_char_param(parameters, "mini") - ? "toggle-mini" - : "toggle"); - - return template_fill_for_cgi(csp, template_name, exports, rsp); -} -#endif /* def FEATURE_TOGGLE */ - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/cgiedit.h b/external/privoxy/cgiedit.h deleted file mode 100644 index ceb5248..0000000 --- a/external/privoxy/cgiedit.h +++ /dev/null @@ -1,175 +0,0 @@ -#ifndef CGIEDIT_H_INCLUDED -#define CGIEDIT_H_INCLUDED -#define CGIEDIT_H_VERSION "$Id: cgiedit.h,v 1.10 2008/08/31 15:59:03 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/cgiedit.h,v $ - * - * Purpose : CGI-based actionsfile editor. - * - * Functions declared include: - * - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: cgiedit.h,v $ - * Revision 1.10 2008/08/31 15:59:03 fabiankeil - * There's no reason to let remote toggling support depend - * on FEATURE_CGI_EDIT_ACTIONS, so make sure it doesn't. - * - * Revision 1.9 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.7.2.2 2004/02/17 13:30:23 oes - * Moved cgi_error_disabled() from cgiedit.c to - * cgi.c to re-enable build with --disable-editor. - * Fixes Bug #892744. Thanks to Matthew Fischer - * for spotting. - * - * Revision 1.7.2.1 2002/11/28 18:15:17 oes - * Added cgi_error_disabled - * - * Revision 1.7 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.6 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.5 2002/01/22 23:24:48 jongfoster - * Adding edit-actions-section-swap - * - * Revision 1.4 2001/11/13 00:28:51 jongfoster - * Adding new CGIs for use by non-JavaScript browsers: - * edit-actions-url-form - * edit-actions-add-url-form - * edit-actions-remove-url-form - * - * Revision 1.3 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.2 2001/10/14 22:12:49 jongfoster - * New version of CGI-based actionsfile editor. - * Major changes, including: - * - Completely new file parser and file output routines - * - edit-actions CGI renamed edit-actions-for-url - * - All CGIs now need a filename parameter, except for... - * - New CGI edit-actions which doesn't need a filename, - * to allow you to start the editor up. - * - edit-actions-submit now works, and now automatically - * redirects you back to the main edit-actions-list handler. - * - * Revision 1.1 2001/09/16 15:47:37 jongfoster - * First version of CGI-based edit interface. This is very much a - * work-in-progress, and you can't actually use it to edit anything - * yet. You must #define FEATURE_CGI_EDIT_ACTIONS for these changes - * to have any effect. - * - * - **********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * CGI functions - */ -#ifdef FEATURE_CGI_EDIT_ACTIONS -extern jb_err cgi_edit_actions (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_for_url(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_list (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_submit (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_url (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_url_form(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_add_url(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_add_url_form(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_remove_url (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_remove_url_form(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_section_remove(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_section_add (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_edit_actions_section_swap (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ -#ifdef FEATURE_TOGGLE -extern jb_err cgi_toggle(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -#endif /* def FEATURE_TOGGLE */ - -/* Revision control strings from this header and associated .c file */ -extern const char cgiedit_rcs[]; -extern const char cgiedit_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef CGI_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/cgisimple.c b/external/privoxy/cgisimple.c deleted file mode 100644 index 3543611..0000000 --- a/external/privoxy/cgisimple.c +++ /dev/null @@ -1,2295 +0,0 @@ -const char cgisimple_rcs[] = "$Id: cgisimple.c,v 1.91 2009/03/08 14:19:23 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/cgisimple.c,v $ - * - * Purpose : Simple CGIs to get information about Privoxy's - * status. - * - * Functions declared include: - * - * - * Copyright : Written by and Copyright (C) 2001-2008 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: cgisimple.c,v $ - * Revision 1.91 2009/03/08 14:19:23 fabiankeil - * Fix justified (but harmless) compiler warnings - * on platforms where sizeof(int) < sizeof(long). - * - * Revision 1.90 2009/03/01 18:43:09 fabiankeil - * Fix cparser warnings. - * - * Revision 1.89 2008/10/11 11:31:14 fabiankeil - * Add FEATURE_CONNECTION_KEEP_ALIVE to the list - * of conditional defines on the show-status page. - * - * Revision 1.88 2008/08/30 12:03:07 fabiankeil - * Remove FEATURE_COOKIE_JAR. - * - * Revision 1.87 2008/08/29 15:59:22 fabiankeil - * Fix two comments. - * - * Revision 1.86 2008/06/28 14:19:05 fabiankeil - * Protocol detection is done case-insensitive, fix assertion - * to do the same. Yay for Privoxy-Regression-Test and zzuf. - * - * Revision 1.85 2008/05/26 17:30:55 fabiankeil - * Provide an OpenSearch Description to access the - * show-url-info page through "search engine plugins". - * - * Revision 1.84 2008/05/26 16:16:55 fabiankeil - * Spell error correctly. - * - * Revision 1.83 2008/05/12 14:51:30 fabiankeil - * Don't complain about an invalid URL if show-url-info is requested - * without parameters. Regression introduced in 1.81 by yours truly. - * - * Revision 1.82 2008/05/10 20:01:47 fabiankeil - * Fix an assertion that could erroneously - * trigger in case of memory shortage. - * - * Revision 1.81 2008/05/05 09:54:39 fabiankeil - * In cgi_show_url_info(), make sure ftp URLs are - * declared invalid. Also simplify the code that adds - * "http://" if no protocol has been specified. - * - * Revision 1.80 2008/05/04 16:18:32 fabiankeil - * Provide parse_http_url() with a third parameter to specify - * whether or not URLs without protocol are acceptable. - * - * Revision 1.79 2008/05/04 13:30:56 fabiankeil - * Streamline parse_http_url()'s prototype. - * - * Revision 1.78 2008/05/03 16:50:11 fabiankeil - * Leverage content_filters_enabled() in cgi_show_url_info(). - * - * Revision 1.77 2008/05/02 09:47:48 fabiankeil - * In cgi_show_url_info, pass an initialized http structure - * to parse_http_url() as that will be required soonish and - * assert that https URLs are recognized correctly. - * - * Revision 1.76 2008/04/28 09:13:30 fabiankeil - * In load_file(), remember the error reason and fclose() - * and return later on instead of right away. - * - * Revision 1.75 2008/04/27 13:52:52 fabiankeil - * Move CGI file loading code into load_file() and - * add checks for unexpected errors. - * - * Revision 1.74 2008/04/26 15:50:56 fabiankeil - * Fix macro name in cgi_show_file() error path. - * - * Revision 1.73 2008/04/26 12:21:55 fabiankeil - * Forget about JB_ERR_PARSE. JB_ERR_CGI_PARAMS to the rescue. - * - * Revision 1.72 2008/04/26 10:34:15 fabiankeil - * If zlib support is unavailable and there are content filters active - * but the prevent-compression action is disabled, include a warning - * on the show-url-info page that compression might prevent filtering. - * - * Revision 1.71 2008/04/25 13:33:56 fabiankeil - * - Factor cgi_show_file() out of cgi_show_status(). - * - Adjust cgi_show_status()'s parameter description to match reality. - * - * Revision 1.70 2008/04/24 16:12:38 fabiankeil - * In cgi_show_status(), load the requested file at once. - * Using string_join() for every line really doesn't scale. - * - * Revision 1.69 2008/04/17 14:40:48 fabiankeil - * Provide get_http_time() with the buffer size so it doesn't - * have to blindly assume that the buffer is big enough. - * - * Revision 1.68 2008/03/27 18:27:21 fabiankeil - * Remove kill-popups action. - * - * Revision 1.67 2008/03/27 17:00:05 fabiankeil - * Turn the favicon blobs into locals. - * - * Revision 1.66 2008/02/23 16:57:12 fabiankeil - * Rename url_actions() to get_url_actions() and let it - * use the standard parameter ordering. - * - * Revision 1.65 2008/02/23 16:33:43 fabiankeil - * Let forward_url() use the standard parameter ordering - * and mark its second parameter immutable. - * - * Revision 1.64 2008/02/03 13:56:07 fabiankeil - * Add SOCKS5 support for show-url-info CGI page. - * - * Revision 1.63 2008/02/01 06:04:31 fabiankeil - * If edit buttons on the show-url-info CGI page are hidden, explain why. - * - * Revision 1.62 2008/02/01 05:52:40 fabiankeil - * Hide edit buttons on the show-url-info CGI page if enable-edit-action - * is disabled. Patch by Lee with additional white space adjustments. - * - * Revision 1.61 2008/01/26 11:13:25 fabiankeil - * If enable-edit-actions is disabled, hide the edit buttons and explain why. - * - * Revision 1.60 2007/10/27 13:12:13 fabiankeil - * Finish 1.49 and check write access before - * showing edit buttons on show-url-info page. - * - * Revision 1.59 2007/10/19 16:42:36 fabiankeil - * Plug memory leak I introduced five months ago. - * Yay Valgrind and Privoxy-Regression-Test. - * - * Revision 1.58 2007/07/21 12:19:50 fabiankeil - * If show-url-info is called with an URL that Privoxy - * would reject as invalid, don't show unresolved forwarding - * variables, "final matches" or claim the site's secure. - * - * Revision 1.57 2007/06/01 16:53:05 fabiankeil - * Adjust cgi_show_url_info() to show what forward-override{} - * would do with the requested URL (instead of showing how the - * request for the CGI page would be forwarded if it wasn't a - * CGI request). - * - * Revision 1.56 2007/05/21 10:50:35 fabiankeil - * - Use strlcpy() instead of strcpy(). - * - Stop treating actions files special. Expect a complete file name - * (with or without path) like it's done for the rest of the files. - * Closes FR#588084. - * - Don't rerun sed() in cgi_show_request(). - * - * Revision 1.55 2007/04/13 13:36:46 fabiankeil - * Reference action files in CGI URLs by id instead - * of using the first part of the file name. - * Fixes BR 1694250 and BR 1590556. - * - * Revision 1.54 2007/04/09 18:11:35 fabiankeil - * Don't mistake VC++'s _snprintf() for a snprintf() replacement. - * - * Revision 1.53 2007/04/08 13:21:04 fabiankeil - * Reference action files in CGI URLs by id instead - * of using the first part of the file name. - * Fixes BR 1694250 and BR 1590556. - * - * Revision 1.52 2007/02/13 15:10:26 fabiankeil - * Apparently fopen()ing in "binary" mode doesn't require - * #ifdefs, it's already done without them in cgiedit.c. - * - * Revision 1.51 2007/02/10 16:55:22 fabiankeil - * - Show forwarding settings on the show-url-info page - * - Fix some HTML syntax errors. - * - * Revision 1.50 2007/01/23 15:51:17 fabiankeil - * Add favicon delivery functions. - * - * Revision 1.49 2007/01/20 16:29:38 fabiankeil - * Suppress edit buttons for action files if Privoxy has - * no write access. Suggested by Roland in PR 1564026. - * - * Revision 1.48 2007/01/20 15:31:31 fabiankeil - * Display warning if show-url-info CGI page - * is used while Privoxy is toggled off. - * - * Revision 1.47 2007/01/12 15:07:10 fabiankeil - * Use zalloc in cgi_send_user_manual. - * - * Revision 1.46 2007/01/02 12:49:46 fabiankeil - * Add FEATURE_ZLIB to the list of conditional - * defines at the show-status page. - * - * Revision 1.45 2006/12/28 18:16:41 fabiankeil - * Fixed gcc43 compiler warnings, zero out cgi_send_user_manual's - * body memory before using it, replaced sprintf calls with snprintf. - * - * Revision 1.44 2006/12/22 14:19:27 fabiankeil - * Removed checks whether or not AF_FILES have - * data structures associated with them in cgi_show_status. - * It doesn't matter as we're only interested in the file names. - * - * For the action files the checks were always true, - * but they prevented empty filter files from being - * listed. Fixes parts of BR 1619208. - * - * Revision 1.43 2006/12/17 17:57:56 fabiankeil - * - Added FEATURE_GRACEFUL_TERMINATION to the - * "conditional #defines" section - * - Escaped ampersands in generated HTML. - * - Renamed re-filter-filename to re-filter-filenames - * - * Revision 1.42 2006/11/21 15:43:12 fabiankeil - * Add special treatment for WIN32 to make sure - * cgi_send_user_manual opens the files in binary mode. - * Fixes BR 1600411 and unbreaks image delivery. - * - * Remove outdated comment. - * - * Revision 1.41 2006/10/09 19:18:28 roro - * Redirect http://p.p/user-manual (without trailing slash) to - * http://p.p/user-manual/ (with trailing slash), otherwise links will be broken. - * - * Revision 1.40 2006/09/09 13:05:33 fabiankeil - * Modified cgi_send_user_manual to serve binary - * content without destroying it first. Should also be - * faster now. Added ".jpg" check for Content-Type guessing. - * - * Revision 1.39 2006/09/08 09:49:23 fabiankeil - * Deliver documents in the user-manual directory - * with "Content-Type text/css" if their filename - * ends with ".css". - * - * Revision 1.38 2006/09/06 18:45:03 fabiankeil - * Incorporate modified version of Roland Rosenfeld's patch to - * optionally access the user-manual via Privoxy. Closes patch 679075. - * - * Formatting changed to Privoxy style, added call to - * cgi_error_no_template if the requested file doesn't - * exist and modified check whether or not Privoxy itself - * should serve the manual. Should work cross-platform now. - * - * Revision 1.37 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.35.2.7 2006/01/29 23:10:56 david__schmidt - * Multiple filter file support - * - * Revision 1.35.2.6 2005/07/04 03:13:43 david__schmidt - * Undo some damaging memory leak patches - * - * Revision 1.35.2.5 2005/05/07 21:50:55 david__schmidt - * A few memory leaks plugged (mostly on error paths) - * - * Revision 1.35.2.4 2005/04/04 02:21:24 david__schmidt - * Another instance of: - * Don't show "Edit" buttons #ifndef FEATURE_CGI_EDIT_ACTIONS - * Thanks to Magnus Holmgren for the patch - * - * Revision 1.35.2.3 2003/12/17 16:34:15 oes - * - Prevent line wrap beween "View/Edit" link buttons on status page - * - Some (mostly irrelevant) fixes for Out-of-mem-case handling - * - * Revision 1.35.2.2 2003/04/03 13:48:28 oes - * Don't show "Edit" buttons #ifndef FEATURE_CGI_EDIT_ACTIONS - * - * Revision 1.35.2.1 2002/07/04 15:02:38 oes - * Added ability to send redirects to send-banner CGI, so that it can completely mimic the image blocking action if called with type=auto - * - * Revision 1.35.2.1 2002/07/01 17:32:04 morcego - * Applying patch from Andreas as provided by Hal on the list. - * Message-ID: <20020701121218.V1606@feenix.burgiss.net> - * - * Revision 1.35 2002/05/12 21:44:44 jongfoster - * Adding amiga.[ch] revision information, if on an amiga. - * - * Revision 1.34 2002/04/30 12:06:12 oes - * Deleted unused code from default_cgi - * - * Revision 1.33 2002/04/30 11:14:52 oes - * Made csp the first parameter in *action_to_html - * - * Revision 1.32 2002/04/26 18:29:13 jongfoster - * Fixing this Visual C++ warning: - * cgisimple.c(775) : warning C4018: '<' : signed/unsigned mismatch - * - * Revision 1.31 2002/04/26 12:54:36 oes - * - Kill obsolete REDIRECT_URL code - * - Error handling fixes - * - Style sheet related HTML snipplet changes - * - cgi_show_url_info: - * - Matches now in table, actions on single lines, - * linked to help - * - standard.action suppressed - * - Buttons to View and Edit AFs - * - * Revision 1.30 2002/04/24 02:18:08 oes - * - show-status is now the starting point for editing - * the actions files, generate list of all AFs with buttons - * for viewing and editing, new look for file list (Jon: - * buttons now aligned ;-P ), view mode now supports multiple - * AFs, name changes, no view links for unspecified files, - * no edit link for standard.action. - * - * - Jon's multiple AF patch: cgi_show_url_info now uses all - * AFs and marks the output accordingly - * - * Revision 1.29 2002/04/10 13:38:35 oes - * load_template signature changed - * - * Revision 1.28 2002/04/07 15:42:12 jongfoster - * Fixing send-banner?type=auto when the image-blocker is - * a redirect to send-banner - * - * Revision 1.27 2002/04/05 15:50:48 oes - * added send-stylesheet CGI - * - * Revision 1.26 2002/04/04 00:36:36 gliptak - * always use pcre for matching - * - * Revision 1.25 2002/04/03 22:28:03 gliptak - * Removed references to gnu_regex - * - * Revision 1.24 2002/04/02 16:12:47 oes - * Fix: moving misplaced lines into #ifdef FEATURE_FORCE - * - * Revision 1.23 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.22 2002/03/24 16:18:15 jongfoster - * Removing old logo - * - * Revision 1.21 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.20 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.19 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.18 2002/03/12 01:44:49 oes - * Changed default for "blocked" image from jb logo to checkboard pattern - * - * Revision 1.17 2002/03/08 16:43:18 oes - * Added choice beween GIF and PNG built-in images - * - * Revision 1.16 2002/03/07 03:48:38 oes - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - Added a 4x4 pattern PNG which is less intrusive - * than the logo but also clearly marks the deleted banners - * - * Revision 1.15 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.14 2002/03/02 04:14:50 david__schmidt - * Clean up a little CRLF unpleasantness that suddenly appeared - * - * Revision 1.13 2002/02/21 00:10:37 jongfoster - * Adding send-banner?type=auto option - * - * Revision 1.12 2002/01/23 01:03:32 jongfoster - * Fixing gcc [CygWin] compiler warnings - * - * Revision 1.11 2002/01/23 00:01:04 jongfoster - * Adding cgi_transparent_gif() for http://i.j.b/t - * Adding missing html_encode() to many CGI functions. - * Adding urlmatch.[ch] to http://i.j.b/show-version - * - * Revision 1.10 2002/01/17 21:10:37 jongfoster - * Changes to cgi_show_url_info to use new matching code from urlmatch.c. - * Also fixing a problem in the same function with improperly quoted URLs - * in output HTML, and adding code to handle https:// URLs correctly. - * - * Revision 1.9 2001/11/30 23:09:15 jongfoster - * Now reports on FEATURE_CGI_EDIT_ACTIONS - * Removing FEATURE_DENY_GZIP from template - * - * Revision 1.8 2001/11/13 00:14:07 jongfoster - * Fixing stupid bug now I've figured out what || means. - * (It always returns 0 or 1, not one of it's paramaters.) - * - * Revision 1.7 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.6 2001/10/14 22:00:32 jongfoster - * Adding support for a 404 error when an invalid CGI page is requested. - * - * Revision 1.5 2001/10/07 15:30:41 oes - * Removed FEATURE_DENY_GZIP - * - * Revision 1.4 2001/10/02 15:31:12 oes - * Introduced show-request cgi - * - * Revision 1.3 2001/09/22 16:34:44 jongfoster - * Removing unneeded #includes - * - * Revision 1.2 2001/09/19 18:01:11 oes - * Fixed comments; cosmetics - * - * Revision 1.1 2001/09/16 17:08:54 jongfoster - * Moving simple CGI functions from cgi.c to new file cgisimple.c - * - * - **********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> -#include <stdlib.h> -#include <ctype.h> -#include <string.h> -#include <assert.h> - -#ifdef HAVE_ACCESS -#include <unistd.h> -#endif /* def HAVE_ACCESS */ - -#include "project.h" -#include "cgi.h" -#include "cgisimple.h" -#include "list.h" -#include "encode.h" -#include "jcc.h" -#include "filters.h" -#include "actions.h" -#include "miscutil.h" -#include "loadcfg.h" -#include "parsers.h" -#include "urlmatch.h" -#include "errlog.h" - -const char cgisimple_h_rcs[] = CGISIMPLE_H_VERSION; - -static char *show_rcs(void); -static jb_err show_defines(struct map *exports); -static jb_err cgi_show_file(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -static jb_err load_file(const char *filename, char **buffer, size_t *length); - -/********************************************************************* - * - * Function : cgi_default - * - * Description : CGI function that is called for the CGI_SITE_1_HOST - * and CGI_SITE_2_HOST/CGI_SITE_2_PATH base URLs. - * Boring - only exports the default exports. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * - *********************************************************************/ -jb_err cgi_default(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map *exports; - - (void)parameters; - - assert(csp); - assert(rsp); - - if (NULL == (exports = default_exports(csp, ""))) - { - return JB_ERR_MEMORY; - } - - return template_fill_for_cgi(csp, "default", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_error_404 - * - * Description : CGI function that is called if an unknown action was - * given. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_error_404(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map *exports; - - assert(csp); - assert(rsp); - assert(parameters); - - if (NULL == (exports = default_exports(csp, NULL))) - { - return JB_ERR_MEMORY; - } - - rsp->status = strdup("404 Privoxy configuration page not found"); - if (rsp->status == NULL) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - return template_fill_for_cgi(csp, "cgi-error-404", exports, rsp); -} - - -#ifdef FEATURE_GRACEFUL_TERMINATION -/********************************************************************* - * - * Function : cgi_die - * - * Description : CGI function to shut down Privoxy. - * NOTE: Turning this on in a production build - * would be a BAD idea. An EXTREMELY BAD idea. - * In short, don't do it. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_die (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - assert(csp); - assert(rsp); - assert(parameters); - - /* quit */ - g_terminate = 1; - - /* - * I don't really care what gets sent back to the browser. - * Take the easy option - "out of memory" page. - */ - - return JB_ERR_MEMORY; -} -#endif /* def FEATURE_GRACEFUL_TERMINATION */ - - -/********************************************************************* - * - * Function : cgi_show_request - * - * Description : Show the client's request and what sed() would have - * made of it. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_show_request(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - char *p; - struct map *exports; - - assert(csp); - assert(rsp); - assert(parameters); - - if (NULL == (exports = default_exports(csp, "show-request"))) - { - return JB_ERR_MEMORY; - } - - /* - * Repair the damage done to the IOB by get_header() - */ - for (p = csp->iob->buf; p < csp->iob->eod; p++) - { - if (*p == '\0') *p = '\n'; - } - - /* - * Export the original client's request and the one we would - * be sending to the server if this wasn't a CGI call - */ - - if (map(exports, "client-request", 1, html_encode(csp->iob->buf), 0)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - if (map(exports, "processed-request", 1, - html_encode_and_free_original(list_to_text(csp->headers)), 0)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - return template_fill_for_cgi(csp, "show-request", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_send_banner - * - * Description : CGI function that returns a banner. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * type : Selects the type of banner between "trans", "logo", - * and "auto". Defaults to "logo" if absent or invalid. - * "auto" means to select as if we were image-blocking. - * (Only the first character really counts; b and t are - * equivalent). - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_send_banner(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - char imagetype = lookup(parameters, "type")[0]; - - /* - * If type is auto, then determine the right thing - * to do from the set-image-blocker action - */ - if (imagetype == 'a') - { - /* - * Default to pattern - */ - imagetype = 'p'; - -#ifdef FEATURE_IMAGE_BLOCKING - if ((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0) - { - static const char prefix1[] = CGI_PREFIX "send-banner?type="; - static const char prefix2[] = "http://" CGI_SITE_1_HOST "/send-banner?type="; - const char *p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER]; - - if (p == NULL) - { - /* Use default - nothing to do here. */ - } - else if (0 == strcmpic(p, "blank")) - { - imagetype = 'b'; - } - else if (0 == strcmpic(p, "pattern")) - { - imagetype = 'p'; - } - - /* - * If the action is to call this CGI, determine - * the argument: - */ - else if (0 == strncmpic(p, prefix1, sizeof(prefix1) - 1)) - { - imagetype = p[sizeof(prefix1) - 1]; - } - else if (0 == strncmpic(p, prefix2, sizeof(prefix2) - 1)) - { - imagetype = p[sizeof(prefix2) - 1]; - } - - /* - * Everything else must (should) be a URL to - * redirect to. - */ - else - { - imagetype = 'r'; - } - } -#endif /* def FEATURE_IMAGE_BLOCKING */ - } - - /* - * Now imagetype is either the non-auto type we were called with, - * or it was auto and has since been determined. In any case, we - * can proceed to actually answering the request by sending a redirect - * or an image as appropriate: - */ - if (imagetype == 'r') - { - rsp->status = strdup("302 Local Redirect from Privoxy"); - if (rsp->status == NULL) - { - return JB_ERR_MEMORY; - } - if (enlist_unique_header(rsp->headers, "Location", - csp->action->string[ACTION_STRING_IMAGE_BLOCKER])) - { - return JB_ERR_MEMORY; - } - } - else - { - if ((imagetype == 'b') || (imagetype == 't')) - { - rsp->body = bindup(image_blank_data, image_blank_length); - rsp->content_length = image_blank_length; - } - else - { - rsp->body = bindup(image_pattern_data, image_pattern_length); - rsp->content_length = image_pattern_length; - } - - if (rsp->body == NULL) - { - return JB_ERR_MEMORY; - } - if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE)) - { - return JB_ERR_MEMORY; - } - - rsp->is_static = 1; - } - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : cgi_transparent_image - * - * Description : CGI function that sends a 1x1 transparent image. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_transparent_image(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - (void)csp; - (void)parameters; - - rsp->body = bindup(image_blank_data, image_blank_length); - rsp->content_length = image_blank_length; - - if (rsp->body == NULL) - { - return JB_ERR_MEMORY; - } - - if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE)) - { - return JB_ERR_MEMORY; - } - - rsp->is_static = 1; - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : cgi_send_default_favicon - * - * Description : CGI function that sends the standard favicon. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_send_default_favicon(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - static const char default_favicon_data[] = - "\000\000\001\000\001\000\020\020\002\000\000\000\000\000\260" - "\000\000\000\026\000\000\000\050\000\000\000\020\000\000\000" - "\040\000\000\000\001\000\001\000\000\000\000\000\100\000\000" - "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000" - "\000\000\377\377\377\000\377\000\052\000\017\360\000\000\077" - "\374\000\000\161\376\000\000\161\376\000\000\361\377\000\000" - "\361\377\000\000\360\017\000\000\360\007\000\000\361\307\000" - "\000\361\307\000\000\361\307\000\000\360\007\000\000\160\036" - "\000\000\177\376\000\000\077\374\000\000\017\360\000\000\360" - "\017\000\000\300\003\000\000\200\001\000\000\200\001\000\000" - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" - "\000\000\200\001\000\000\200\001\000\000\300\003\000\000\360" - "\017\000\000"; - static const size_t favicon_length = sizeof(default_favicon_data) - 1; - - (void)csp; - (void)parameters; - - rsp->body = bindup(default_favicon_data, favicon_length); - rsp->content_length = favicon_length; - - if (rsp->body == NULL) - { - return JB_ERR_MEMORY; - } - - if (enlist(rsp->headers, "Content-Type: image/x-icon")) - { - return JB_ERR_MEMORY; - } - - rsp->is_static = 1; - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : cgi_send_error_favicon - * - * Description : CGI function that sends the favicon for error pages. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_send_error_favicon(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - static const char error_favicon_data[] = - "\000\000\001\000\001\000\020\020\002\000\000\000\000\000\260" - "\000\000\000\026\000\000\000\050\000\000\000\020\000\000\000" - "\040\000\000\000\001\000\001\000\000\000\000\000\100\000\000" - "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000" - "\000\000\377\377\377\000\000\000\377\000\017\360\000\000\077" - "\374\000\000\161\376\000\000\161\376\000\000\361\377\000\000" - "\361\377\000\000\360\017\000\000\360\007\000\000\361\307\000" - "\000\361\307\000\000\361\307\000\000\360\007\000\000\160\036" - "\000\000\177\376\000\000\077\374\000\000\017\360\000\000\360" - "\017\000\000\300\003\000\000\200\001\000\000\200\001\000\000" - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" - "\000\000\200\001\000\000\200\001\000\000\300\003\000\000\360" - "\017\000\000"; - static const size_t favicon_length = sizeof(error_favicon_data) - 1; - - (void)csp; - (void)parameters; - - rsp->body = bindup(error_favicon_data, favicon_length); - rsp->content_length = favicon_length; - - if (rsp->body == NULL) - { - return JB_ERR_MEMORY; - } - - if (enlist(rsp->headers, "Content-Type: image/x-icon")) - { - return JB_ERR_MEMORY; - } - - rsp->is_static = 1; - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : cgi_send_stylesheet - * - * Description : CGI function that sends a css stylesheet found - * in the cgi-style.css template - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_send_stylesheet(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - jb_err err; - - assert(csp); - assert(rsp); - - (void)parameters; - - err = template_load(csp, &rsp->body, "cgi-style.css", 0); - - if (err == JB_ERR_FILE) - { - /* - * No way to tell user; send empty stylesheet - */ - log_error(LOG_LEVEL_ERROR, "Could not find cgi-style.css template"); - } - else if (err) - { - return err; /* JB_ERR_MEMORY */ - } - - if (enlist(rsp->headers, "Content-Type: text/css")) - { - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : cgi_send_url_info_osd - * - * Description : CGI function that sends the OpenSearch Description - * template for the show-url-info page. It allows to - * access the page through "search engine plugins". - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_send_url_info_osd(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - jb_err err = JB_ERR_MEMORY; - struct map *exports = default_exports(csp, NULL); - - (void)csp; - (void)parameters; - - if (NULL != exports) - { - err = template_fill_for_cgi(csp, "url-info-osd.xml", exports, rsp); - if (JB_ERR_OK == err) - { - err = enlist(rsp->headers, - "Content-Type: application/opensearchdescription+xml"); - } - } - - return err; - -} - - -/********************************************************************* - * - * Function : cgi_send_user_manual - * - * Description : CGI function that sends a file in the user - * manual directory. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : file=name.html, the name of the HTML file - * (relative to user-manual from config) - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_send_user_manual(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - const char * filename; - char *full_path; - jb_err err = JB_ERR_OK; - size_t length; - - assert(csp); - assert(rsp); - assert(parameters); - - if (!parameters->first) - { - /* requested http://p.p/user-manual (without trailing slash) */ - return cgi_redirect(rsp, CGI_PREFIX "user-manual/"); - } - - get_string_param(parameters, "file", &filename); - /* Check paramter for hack attempts */ - if (filename && strchr(filename, '/')) - { - return JB_ERR_CGI_PARAMS; - } - if (filename && strstr(filename, "..")) - { - return JB_ERR_CGI_PARAMS; - } - - full_path = make_path(csp->config->usermanual, filename ? filename : "index.html"); - if (full_path == NULL) - { - return JB_ERR_MEMORY; - } - - err = load_file(full_path, &rsp->body, &rsp->content_length); - if (JB_ERR_OK != err) - { - assert((JB_ERR_FILE == err) || (JB_ERR_MEMORY == err)); - if (JB_ERR_FILE == err) - { - err = cgi_error_no_template(csp, rsp, full_path); - } - freez(full_path); - return err; - } - freez(full_path); - - /* Guess correct Content-Type based on the filename's ending */ - if (filename) - { - length = strlen(filename); - } - else - { - length = 0; - } - if((length>=4) && !strcmp(&filename[length-4], ".css")) - { - err = enlist(rsp->headers, "Content-Type: text/css"); - } - else if((length>=4) && !strcmp(&filename[length-4], ".jpg")) - { - err = enlist(rsp->headers, "Content-Type: image/jpeg"); - } - else - { - err = enlist(rsp->headers, "Content-Type: text/html"); - } - - return err; -} - - -/********************************************************************* - * - * Function : cgi_show_version - * - * Description : CGI function that returns a a web page describing the - * file versions of Privoxy. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : none - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_show_version(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - struct map *exports; - - assert(csp); - assert(rsp); - assert(parameters); - - if (NULL == (exports = default_exports(csp, "show-version"))) - { - return JB_ERR_MEMORY; - } - - if (map(exports, "sourceversions", 1, show_rcs(), 0)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - return template_fill_for_cgi(csp, "show-version", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_show_status - * - * Description : CGI function that returns a web page describing the - * current status of Privoxy. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * file : Which file to show. Only first letter is checked, - * valid values are: - * - "a"ction file - * - "r"egex - * - "t"rust - * Default is to show menu and other information. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_show_status(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - char *s = NULL; - unsigned i; - int j; - - char buf[BUFFER_SIZE]; -#ifdef FEATURE_STATISTICS - float perc_rej; /* Percentage of http requests rejected */ - int local_urls_read; - int local_urls_rejected; -#endif /* ndef FEATURE_STATISTICS */ - jb_err err = JB_ERR_OK; - - struct map *exports; - - assert(csp); - assert(rsp); - assert(parameters); - - if ('\0' != *(lookup(parameters, "file"))) - { - return cgi_show_file(csp, rsp, parameters); - } - - if (NULL == (exports = default_exports(csp, "show-status"))) - { - return JB_ERR_MEMORY; - } - - s = strdup(""); - for (j = 0; (s != NULL) && (j < Argc); j++) - { - if (!err) err = string_join (&s, html_encode(Argv[j])); - if (!err) err = string_append(&s, " "); - } - if (!err) err = map(exports, "invocation", 1, s, 0); - - if (!err) err = map(exports, "options", 1, csp->config->proxy_args, 1); - if (!err) err = show_defines(exports); - - if (err) - { - free_map(exports); - return JB_ERR_MEMORY; - } - -#ifdef FEATURE_STATISTICS - local_urls_read = urls_read; - local_urls_rejected = urls_rejected; - - /* - * Need to alter the stats not to include the fetch of this - * page. - * - * Can't do following thread safely! doh! - * - * urls_read--; - * urls_rejected--; * This will be incremented subsequently * - */ - - if (local_urls_read == 0) - { - if (!err) err = map_block_killer(exports, "have-stats"); - } - else - { - if (!err) err = map_block_killer(exports, "have-no-stats"); - - perc_rej = (float)local_urls_rejected * 100.0F / - (float)local_urls_read; - - snprintf(buf, sizeof(buf), "%d", local_urls_read); - if (!err) err = map(exports, "requests-received", 1, buf, 1); - - snprintf(buf, sizeof(buf), "%d", local_urls_rejected); - if (!err) err = map(exports, "requests-blocked", 1, buf, 1); - - snprintf(buf, sizeof(buf), "%6.2f", perc_rej); - if (!err) err = map(exports, "percent-blocked", 1, buf, 1); - } - -#else /* ndef FEATURE_STATISTICS */ - err = err || map_block_killer(exports, "statistics"); -#endif /* ndef FEATURE_STATISTICS */ - - /* - * List all action files in use, together with view and edit links, - * except for standard.action, which should only be viewable. (Not - * enforced in the editor itself) - * FIXME: Shouldn't include hardwired HTML here, use line template instead! - */ - s = strdup(""); - for (i = 0; i < MAX_AF_FILES; i++) - { - if (csp->actions_list[i] != NULL) - { - if (!err) err = string_append(&s, "<tr><td>"); - if (!err) err = string_join(&s, html_encode(csp->actions_list[i]->filename)); - snprintf(buf, sizeof(buf), - "</td><td class="buttons"><a href="/show-status?file=actions&index=%u">View</a>", i); - if (!err) err = string_append(&s, buf); - -#ifdef FEATURE_CGI_EDIT_ACTIONS - if ((csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS) - && (NULL == strstr(csp->actions_list[i]->filename, "standard.action")) - && (NULL != csp->config->actions_file_short[i])) - { -#ifdef HAVE_ACCESS - if (access(csp->config->actions_file[i], W_OK) == 0) - { -#endif /* def HAVE_ACCESS */ - snprintf(buf, sizeof(buf), " <a href="/edit-actions-list?f=%u">Edit</a>", i); - if (!err) err = string_append(&s, buf); -#ifdef HAVE_ACCESS - } - else - { - if (!err) err = string_append(&s, " <strong>No write access.</strong>"); - } -#endif /* def HAVE_ACCESS */ - } -#endif - - if (!err) err = string_append(&s, "</td></tr>\n"); - } - } - if (*s != '\0') - { - if (!err) err = map(exports, "actions-filenames", 1, s, 0); - } - else - { - if (!err) err = map(exports, "actions-filenames", 1, "<tr><td>None specified</td></tr>", 1); - } - - /* - * List all re_filterfiles in use, together with view options. - * FIXME: Shouldn't include hardwired HTML here, use line template instead! - */ - s = strdup(""); - for (i = 0; i < MAX_AF_FILES; i++) - { - if (csp->rlist[i] != NULL) - { - if (!err) err = string_append(&s, "<tr><td>"); - if (!err) err = string_join(&s, html_encode(csp->rlist[i]->filename)); - snprintf(buf, sizeof(buf), - "</td><td class="buttons"><a href="/show-status?file=filter&index=%u">View</a>", i); - if (!err) err = string_append(&s, buf); - if (!err) err = string_append(&s, "</td></tr>\n"); - } - } - if (*s != '\0') - { - if (!err) err = map(exports, "re-filter-filenames", 1, s, 0); - } - else - { - if (!err) err = map(exports, "re-filter-filenames", 1, "<tr><td>None specified</td></tr>", 1); - if (!err) err = map_block_killer(exports, "have-filterfile"); - } - -#ifdef FEATURE_TRUST - if (csp->tlist) - { - if (!err) err = map(exports, "trust-filename", 1, html_encode(csp->tlist->filename), 0); - } - else - { - if (!err) err = map(exports, "trust-filename", 1, "None specified", 1); - if (!err) err = map_block_killer(exports, "have-trustfile"); - } -#else - if (!err) err = map_block_killer(exports, "trust-support"); -#endif /* ndef FEATURE_TRUST */ - -#ifdef FEATURE_CGI_EDIT_ACTIONS - if (!err && (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - err = map_block_killer(exports, "cgi-editor-is-disabled"); - } -#endif /* ndef CGI_EDIT_ACTIONS */ - - if (err) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - return template_fill_for_cgi(csp, "show-status", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_show_url_info - * - * Description : CGI function that determines and shows which actions - * Privoxy will perform for a given url, and which - * matches starting from the defaults have lead to that. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * url : The url whose actions are to be determined. - * If url is unset, the url-given conditional will be - * set, so that all but the form can be suppressed in - * the template. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_show_url_info(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - char *url_param; - struct map *exports; - char buf[150]; - - assert(csp); - assert(rsp); - assert(parameters); - - if (NULL == (exports = default_exports(csp, "show-url-info"))) - { - return JB_ERR_MEMORY; - } - - /* - * Get the url= parameter (if present) and remove any leading/trailing spaces. - */ - url_param = strdup(lookup(parameters, "url")); - if (url_param == NULL) - { - free_map(exports); - return JB_ERR_MEMORY; - } - chomp(url_param); - - /* - * Handle prefixes. 4 possibilities: - * 1) "http://" or "https://" prefix present and followed by URL - OK - * 2) Only the "http://" or "https://" part is present, no URL - change - * to empty string so it will be detected later as "no URL". - * 3) Parameter specified but doesn't contain "http(s?)://" - add a - * "http://" prefix. - * 4) Parameter not specified or is empty string - let this fall through - * for now, next block of code will handle it. - */ - if (0 == strncmp(url_param, "http://", 7)) - { - if (url_param[7] == '\0') - { - /* - * Empty URL (just prefix). - * Make it totally empty so it's caught by the next if() - */ - url_param[0] = '\0'; - } - } - else if (0 == strncmp(url_param, "https://", 8)) - { - if (url_param[8] == '\0') - { - /* - * Empty URL (just prefix). - * Make it totally empty so it's caught by the next if() - */ - url_param[0] = '\0'; - } - } - else if ((url_param[0] != '\0') && (NULL == strstr(url_param, "://"))) - { - /* No prefix - assume http:// */ - char *url_param_prefixed = strdup("http://"); - - if (JB_ERR_OK != string_join(&url_param_prefixed, url_param)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - url_param = url_param_prefixed; - } - - /* - * Hide "toggle off" warning if Privoxy is toggled on. - */ - if ( -#ifdef FEATURE_TOGGLE - (global_toggle_state == 1) && -#endif /* def FEATURE_TOGGLE */ - map_block_killer(exports, "privoxy-is-toggled-off") - ) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - if (url_param[0] == '\0') - { - /* URL paramater not specified, display query form only. */ - free(url_param); - if (map_block_killer(exports, "url-given") - || map(exports, "url", 1, "", 1)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - } - else - { - /* Given a URL, so query it. */ - jb_err err; - char *matches; - char *s; - int hits = 0; - struct file_list *fl; - struct url_actions *b; - struct http_request url_to_query[1]; - struct current_action_spec action[1]; - int i; - - if (map(exports, "url", 1, html_encode(url_param), 0)) - { - free(url_param); - free_map(exports); - return JB_ERR_MEMORY; - } - - init_current_action(action); - - if (map(exports, "default", 1, current_action_to_html(csp, action), 0)) - { - free_current_action(action); - free(url_param); - free_map(exports); - return JB_ERR_MEMORY; - } - - memset(url_to_query, '\0', sizeof(url_to_query)); - err = parse_http_url(url_param, url_to_query, REQUIRE_PROTOCOL); - assert((err != JB_ERR_OK) || (url_to_query->ssl == !strncmpic(url_param, "https://", 8))); - - free(url_param); - - if (err == JB_ERR_MEMORY) - { - free_http_request(url_to_query); - free_current_action(action); - free_map(exports); - return JB_ERR_MEMORY; - } - else if (err) - { - /* Invalid URL */ - - err = map(exports, "matches", 1, "<b>[Invalid URL specified!]</b>" , 1); - if (!err) err = map(exports, "final", 1, lookup(exports, "default"), 1); - if (!err) err = map_block_killer(exports, "valid-url"); - - free_current_action(action); - free_http_request(url_to_query); - - if (err) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - return template_fill_for_cgi(csp, "show-url-info", exports, rsp); - } - - /* - * We have a warning about SSL paths. Hide it for unencrypted sites. - */ - if (!url_to_query->ssl) - { - if (map_block_killer(exports, "https")) - { - free_current_action(action); - free_map(exports); - free_http_request(url_to_query); - return JB_ERR_MEMORY; - } - } - - matches = strdup("<table summary="" class="transparent">"); - - for (i = 0; i < MAX_AF_FILES; i++) - { - if (NULL == csp->config->actions_file_short[i] - || !strcmp(csp->config->actions_file_short[i], "standard.action")) continue; - - b = NULL; - hits = 1; - if ((fl = csp->actions_list[i]) != NULL) - { - if ((b = fl->f) != NULL) - { - /* FIXME: Hardcoded HTML! */ - string_append(&matches, "<tr><th>In file: "); - string_join (&matches, html_encode(csp->config->actions_file_short[i])); - snprintf(buf, sizeof(buf), " <a class="cmd" href="/show-status?file=actions&index=%d">", i); - string_append(&matches, buf); - string_append(&matches, "View</a>"); -#ifdef FEATURE_CGI_EDIT_ACTIONS - if (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS) - { -#ifdef HAVE_ACCESS - if (access(csp->config->actions_file[i], W_OK) == 0) - { -#endif /* def HAVE_ACCESS */ - snprintf(buf, sizeof(buf), - " <a class="cmd" href="/edit-actions-list?f=%d">", i); - string_append(&matches, buf); - string_append(&matches, "Edit</a>"); -#ifdef HAVE_ACCESS - } - else - { - string_append(&matches, " <strong>No write access.</strong>"); - } -#endif /* def HAVE_ACCESS */ - } -#endif /* FEATURE_CGI_EDIT_ACTIONS */ - - string_append(&matches, "</th></tr>\n"); - - hits = 0; - b = b->next; - } - } - - for (; (b != NULL) && (matches != NULL); b = b->next) - { - if (url_match(b->url, url_to_query)) - { - string_append(&matches, "<tr><td>{"); - string_join (&matches, actions_to_html(csp, b->action)); - string_append(&matches, " }<br>\n<code>"); - string_join (&matches, html_encode(b->url->spec)); - string_append(&matches, "</code></td></tr>\n"); - - if (merge_current_action(action, b->action)) - { - freez(matches); - free_http_request(url_to_query); - free_current_action(action); - free_map(exports); - return JB_ERR_MEMORY; - } - hits++; - } - } - - if (!hits) - { - string_append(&matches, "<tr><td>(no matches in this file)</td></tr>\n"); - } - } - string_append(&matches, "</table>\n"); - - /* - * XXX: Kludge to make sure the "Forward settings" section - * shows what forward-override{} would do with the requested URL. - * No one really cares how the CGI request would be forwarded - * if it wasn't intercepted as CGI request in the first place. - * - * From here on the action bitmask will no longer reflect - * the real url (http://config.privoxy.org/show-url-info?url=.*), - * but luckily it's no longer required later on anyway. - */ - free_current_action(csp->action); - get_url_actions(csp, url_to_query); - - /* - * Fill in forwarding settings. - * - * The possibilities are: - * - no forwarding - * - http forwarding only - * - socks4(a) forwarding only - * - socks4(a) and http forwarding. - * - * XXX: Parts of this code could be reused for the - * "forwarding-failed" template which currently doesn't - * display the proxy port and an eventual second forwarder. - */ - { - const struct forward_spec *fwd = forward_url(csp, url_to_query); - - if ((fwd->gateway_host == NULL) && (fwd->forward_host == NULL)) - { - if (!err) err = map_block_killer(exports, "socks-forwarder"); - if (!err) err = map_block_killer(exports, "http-forwarder"); - } - else - { - char port[10]; /* We save proxy ports as int but need a string here */ - - if (!err) err = map_block_killer(exports, "no-forwarder"); - - if (fwd->gateway_host != NULL) - { - char *socks_type = NULL; - - switch (fwd->type) - { - case SOCKS_4: - socks_type = "socks4"; - break; - case SOCKS_4A: - socks_type = "socks4a"; - break; - case SOCKS_5: - socks_type = "socks5"; - break; - default: - log_error(LOG_LEVEL_FATAL, "Unknown socks type: %d.", fwd->type); - } - - if (!err) err = map(exports, "socks-type", 1, socks_type, 1); - if (!err) err = map(exports, "gateway-host", 1, fwd->gateway_host, 1); - snprintf(port, sizeof(port), "%d", fwd->gateway_port); - if (!err) err = map(exports, "gateway-port", 1, port, 1); - } - else - { - if (!err) err = map_block_killer(exports, "socks-forwarder"); - } - - if (fwd->forward_host != NULL) - { - if (!err) err = map(exports, "forward-host", 1, fwd->forward_host, 1); - snprintf(port, sizeof(port), "%d", fwd->forward_port); - if (!err) err = map(exports, "forward-port", 1, port, 1); - } - else - { - if (!err) err = map_block_killer(exports, "http-forwarder"); - } - } - } - - free_http_request(url_to_query); - - if (err || matches == NULL) - { - free_current_action(action); - free_map(exports); - return JB_ERR_MEMORY; - } - -#ifdef FEATURE_CGI_EDIT_ACTIONS - if ((csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS)) - { - err = map_block_killer(exports, "cgi-editor-is-disabled"); - } -#endif /* FEATURE_CGI_EDIT_ACTIONS */ - - /* - * If zlib support is available, if no content filters - * are enabled or if the prevent-compression action is enabled, - * suppress the "compression could prevent filtering" warning. - */ -#ifndef FEATURE_ZLIB - if (!content_filters_enabled(action) || - (action->flags & ACTION_NO_COMPRESSION)) -#endif - { - if (!err) err = map_block_killer(exports, "filters-might-be-ineffective"); - } - - if (err || map(exports, "matches", 1, matches , 0)) - { - free_current_action(action); - free_map(exports); - return JB_ERR_MEMORY; - } - - s = current_action_to_html(csp, action); - - free_current_action(action); - - if (map(exports, "final", 1, s, 0)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - } - - return template_fill_for_cgi(csp, "show-url-info", exports, rsp); -} - - -/********************************************************************* - * - * Function : cgi_robots_txt - * - * Description : CGI function to return "/robots.txt". - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : None - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err cgi_robots_txt(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - char buf[100]; - jb_err err; - - (void)csp; - (void)parameters; - - rsp->body = strdup( - "# This is the Privoxy control interface.\n" - "# It isn't very useful to index it, and you're likely to break stuff.\n" - "# So go away!\n" - "\n" - "User-agent: *\n" - "Disallow: /\n" - "\n"); - if (rsp->body == NULL) - { - return JB_ERR_MEMORY; - } - - err = enlist_unique(rsp->headers, "Content-Type: text/plain", 13); - - rsp->is_static = 1; - - get_http_time(7 * 24 * 60 * 60, buf, sizeof(buf)); /* 7 days into future */ - if (!err) err = enlist_unique_header(rsp->headers, "Expires", buf); - - return (err ? JB_ERR_MEMORY : JB_ERR_OK); -} - - -/********************************************************************* - * - * Function : show_defines - * - * Description : Add to a map the state od all conditional #defines - * used when building - * - * Parameters : - * 1 : exports = map to extend - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err show_defines(struct map *exports) -{ - jb_err err = JB_ERR_OK; - -#ifdef FEATURE_ACL - if (!err) err = map_conditional(exports, "FEATURE_ACL", 1); -#else /* ifndef FEATURE_ACL */ - if (!err) err = map_conditional(exports, "FEATURE_ACL", 0); -#endif /* ndef FEATURE_ACL */ - -#ifdef FEATURE_CGI_EDIT_ACTIONS - if (!err) err = map_conditional(exports, "FEATURE_CGI_EDIT_ACTIONS", 1); -#else /* ifndef FEATURE_CGI_EDIT_ACTIONS */ - if (!err) err = map_conditional(exports, "FEATURE_CGI_EDIT_ACTIONS", 0); -#endif /* ndef FEATURE_CGI_EDIT_ACTIONS */ - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - if (!err) err = map_conditional(exports, "FEATURE_CONNECTION_KEEP_ALIVE", 1); -#else /* ifndef FEATURE_CGI_EDIT_ACTIONS */ - if (!err) err = map_conditional(exports, "FEATURE_CONNECTION_KEEP_ALIVE", 0); -#endif /* ndef FEATURE_CONNECTION_KEEP_ALIVE */ - -#ifdef FEATURE_FAST_REDIRECTS - if (!err) err = map_conditional(exports, "FEATURE_FAST_REDIRECTS", 1); -#else /* ifndef FEATURE_FAST_REDIRECTS */ - if (!err) err = map_conditional(exports, "FEATURE_FAST_REDIRECTS", 0); -#endif /* ndef FEATURE_FAST_REDIRECTS */ - -#ifdef FEATURE_FORCE_LOAD - if (!err) err = map_conditional(exports, "FEATURE_FORCE_LOAD", 1); - if (!err) err = map(exports, "FORCE_PREFIX", 1, FORCE_PREFIX, 1); -#else /* ifndef FEATURE_FORCE_LOAD */ - if (!err) err = map_conditional(exports, "FEATURE_FORCE_LOAD", 0); - if (!err) err = map(exports, "FORCE_PREFIX", 1, "(none - disabled)", 1); -#endif /* ndef FEATURE_FORCE_LOAD */ - -#ifdef FEATURE_GRACEFUL_TERMINATION - if (!err) err = map_conditional(exports, "FEATURE_GRACEFUL_TERMINATION", 1); -#else /* ifndef FEATURE_GRACEFUL_TERMINATION */ - if (!err) err = map_conditional(exports, "FEATURE_GRACEFUL_TERMINATION", 0); -#endif /* ndef FEATURE_GRACEFUL_TERMINATION */ - -#ifdef FEATURE_IMAGE_BLOCKING - if (!err) err = map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 1); -#else /* ifndef FEATURE_IMAGE_BLOCKING */ - if (!err) err = map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 0); -#endif /* ndef FEATURE_IMAGE_BLOCKING */ - -#ifdef FEATURE_IMAGE_DETECT_MSIE - if (!err) err = map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 1); -#else /* ifndef FEATURE_IMAGE_DETECT_MSIE */ - if (!err) err = map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 0); -#endif /* ndef FEATURE_IMAGE_DETECT_MSIE */ - -#ifdef FEATURE_NO_GIFS - if (!err) err = map_conditional(exports, "FEATURE_NO_GIFS", 1); -#else /* ifndef FEATURE_NO_GIFS */ - if (!err) err = map_conditional(exports, "FEATURE_NO_GIFS", 0); -#endif /* ndef FEATURE_NO_GIFS */ - -#ifdef FEATURE_PTHREAD - if (!err) err = map_conditional(exports, "FEATURE_PTHREAD", 1); -#else /* ifndef FEATURE_PTHREAD */ - if (!err) err = map_conditional(exports, "FEATURE_PTHREAD", 0); -#endif /* ndef FEATURE_PTHREAD */ - -#ifdef FEATURE_STATISTICS - if (!err) err = map_conditional(exports, "FEATURE_STATISTICS", 1); -#else /* ifndef FEATURE_STATISTICS */ - if (!err) err = map_conditional(exports, "FEATURE_STATISTICS", 0); -#endif /* ndef FEATURE_STATISTICS */ - -#ifdef FEATURE_TOGGLE - if (!err) err = map_conditional(exports, "FEATURE_TOGGLE", 1); -#else /* ifndef FEATURE_TOGGLE */ - if (!err) err = map_conditional(exports, "FEATURE_TOGGLE", 0); -#endif /* ndef FEATURE_TOGGLE */ - -#ifdef FEATURE_TRUST - if (!err) err = map_conditional(exports, "FEATURE_TRUST", 1); -#else /* ifndef FEATURE_TRUST */ - if (!err) err = map_conditional(exports, "FEATURE_TRUST", 0); -#endif /* ndef FEATURE_TRUST */ - -#ifdef FEATURE_ZLIB - if (!err) err = map_conditional(exports, "FEATURE_ZLIB", 1); -#else /* ifndef FEATURE_ZLIB */ - if (!err) err = map_conditional(exports, "FEATURE_ZLIB", 0); -#endif /* ndef FEATURE_ZLIB */ - -#ifdef STATIC_PCRE - if (!err) err = map_conditional(exports, "STATIC_PCRE", 1); -#else /* ifndef STATIC_PCRE */ - if (!err) err = map_conditional(exports, "STATIC_PCRE", 0); -#endif /* ndef STATIC_PCRE */ - -#ifdef STATIC_PCRS - if (!err) err = map_conditional(exports, "STATIC_PCRS", 1); -#else /* ifndef STATIC_PCRS */ - if (!err) err = map_conditional(exports, "STATIC_PCRS", 0); -#endif /* ndef STATIC_PCRS */ - - return err; -} - - -/********************************************************************* - * - * Function : show_rcs - * - * Description : Create a string with the rcs info for all sourcefiles - * - * Parameters : None - * - * Returns : A string, or NULL on out-of-memory. - * - *********************************************************************/ -static char *show_rcs(void) -{ - char *result = strdup(""); - char buf[BUFFER_SIZE]; - - /* Instead of including *all* dot h's in the project (thus creating a - * tremendous amount of dependencies), I will concede to declaring them - * as extern's. This forces the developer to add to this list, but oh well. - */ - -#define SHOW_RCS(__x) \ - { \ - extern const char __x[]; \ - snprintf(buf, sizeof(buf), " %s\n", __x); \ - string_append(&result, buf); \ - } - - /* In alphabetical order */ - SHOW_RCS(actions_h_rcs) - SHOW_RCS(actions_rcs) -#ifdef AMIGA - SHOW_RCS(amiga_h_rcs) - SHOW_RCS(amiga_rcs) -#endif /* def AMIGA */ - SHOW_RCS(cgi_h_rcs) - SHOW_RCS(cgi_rcs) -#ifdef FEATURE_CGI_EDIT_ACTIONS - SHOW_RCS(cgiedit_h_rcs) - SHOW_RCS(cgiedit_rcs) -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - SHOW_RCS(cgisimple_h_rcs) - SHOW_RCS(cgisimple_rcs) -#ifdef __MINGW32__ - SHOW_RCS(cygwin_h_rcs) -#endif - SHOW_RCS(deanimate_h_rcs) - SHOW_RCS(deanimate_rcs) - SHOW_RCS(encode_h_rcs) - SHOW_RCS(encode_rcs) - SHOW_RCS(errlog_h_rcs) - SHOW_RCS(errlog_rcs) - SHOW_RCS(filters_h_rcs) - SHOW_RCS(filters_rcs) - SHOW_RCS(gateway_h_rcs) - SHOW_RCS(gateway_rcs) - SHOW_RCS(jbsockets_h_rcs) - SHOW_RCS(jbsockets_rcs) - SHOW_RCS(jcc_h_rcs) - SHOW_RCS(jcc_rcs) - SHOW_RCS(list_h_rcs) - SHOW_RCS(list_rcs) - SHOW_RCS(loadcfg_h_rcs) - SHOW_RCS(loadcfg_rcs) - SHOW_RCS(loaders_h_rcs) - SHOW_RCS(loaders_rcs) - SHOW_RCS(miscutil_h_rcs) - SHOW_RCS(miscutil_rcs) - SHOW_RCS(parsers_h_rcs) - SHOW_RCS(parsers_rcs) - SHOW_RCS(pcrs_rcs) - SHOW_RCS(pcrs_h_rcs) - SHOW_RCS(project_h_rcs) - SHOW_RCS(ssplit_h_rcs) - SHOW_RCS(ssplit_rcs) - SHOW_RCS(urlmatch_h_rcs) - SHOW_RCS(urlmatch_rcs) -#ifdef _WIN32 -#ifndef _WIN_CONSOLE - SHOW_RCS(w32log_h_rcs) - SHOW_RCS(w32log_rcs) - SHOW_RCS(w32res_h_rcs) - SHOW_RCS(w32taskbar_h_rcs) - SHOW_RCS(w32taskbar_rcs) -#endif /* ndef _WIN_CONSOLE */ - SHOW_RCS(win32_h_rcs) - SHOW_RCS(win32_rcs) -#endif /* def _WIN32 */ - -#undef SHOW_RCS - - return result; - -} - - -/********************************************************************* - * - * Function : cgi_show_file - * - * Description : CGI function that shows the content of a - * configuration file. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : rsp = http_response data structure for output - * 3 : parameters = map of cgi parameters - * - * CGI Parameters : - * file : Which file to show. Only first letter is checked, - * valid values are: - * - "a"ction file - * - "r"egex - * - "t"rust - * Default is to show menu and other information. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err cgi_show_file(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) -{ - unsigned i; - const char * filename = NULL; - char * file_description = NULL; - - assert(csp); - assert(rsp); - assert(parameters); - - switch (*(lookup(parameters, "file"))) - { - case 'a': - if (!get_number_param(csp, parameters, "index", &i) && i < MAX_AF_FILES && csp->actions_list[i]) - { - filename = csp->actions_list[i]->filename; - file_description = "Actions File"; - } - break; - - case 'f': - if (!get_number_param(csp, parameters, "index", &i) && i < MAX_AF_FILES && csp->rlist[i]) - { - filename = csp->rlist[i]->filename; - file_description = "Filter File"; - } - break; - -#ifdef FEATURE_TRUST - case 't': - if (csp->tlist) - { - filename = csp->tlist->filename; - file_description = "Trust File"; - } - break; -#endif /* def FEATURE_TRUST */ - } - - if (NULL != filename) - { - struct map *exports; - char *s; - jb_err err; - size_t length; - - exports = default_exports(csp, "show-status"); - if (NULL == exports) - { - return JB_ERR_MEMORY; - } - - if ( map(exports, "file-description", 1, file_description, 1) - || map(exports, "filepath", 1, html_encode(filename), 0) ) - { - free_map(exports); - return JB_ERR_MEMORY; - } - - err = load_file(filename, &s, &length); - if (JB_ERR_OK != err) - { - if (map(exports, "contents", 1, "<h1>ERROR OPENING FILE!</h1>", 1)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - } - else - { - s = html_encode_and_free_original(s); - if (NULL == s) - { - return JB_ERR_MEMORY; - } - - if (map(exports, "contents", 1, s, 0)) - { - free_map(exports); - return JB_ERR_MEMORY; - } - } - - return template_fill_for_cgi(csp, "show-status-file", exports, rsp); - } - - return JB_ERR_CGI_PARAMS; -} - - -/********************************************************************* - * - * Function : load_file - * - * Description : Loads a file into a buffer. - * - * Parameters : - * 1 : filename = Name of the file to be loaded. - * 2 : buffer = Used to return the file's content. - * 3 : length = Used to return the size of the file. - * - * Returns : JB_ERR_OK in case of success, - * JB_ERR_FILE in case of ordinary file loading errors - * (fseek() and ftell() errors are fatal) - * JB_ERR_MEMORY in case of out-of-memory. - * - *********************************************************************/ -static jb_err load_file(const char *filename, char **buffer, size_t *length) -{ - FILE *fp; - long ret; - jb_err err = JB_ERR_OK; - - fp = fopen(filename, "rb"); - if (NULL == fp) - { - return JB_ERR_FILE; - } - - /* Get file length */ - if (fseek(fp, 0, SEEK_END)) - { - log_error(LOG_LEVEL_FATAL, - "Unexpected error while fseek()ing to the end of %s: %E", - filename); - } - ret = ftell(fp); - if (-1 == ret) - { - log_error(LOG_LEVEL_FATAL, - "Unexpected ftell() error while loading %s: %E", - filename); - } - *length = (size_t)ret; - - /* Go back to the beginning. */ - if (fseek(fp, 0, SEEK_SET)) - { - log_error(LOG_LEVEL_FATAL, - "Unexpected error while fseek()ing to the beginning of %s: %E", - filename); - } - - *buffer = (char *)zalloc(*length + 1); - if (NULL == *buffer) - { - err = JB_ERR_MEMORY; - } - else if (!fread(*buffer, *length, 1, fp)) - { - /* - * May happen if the file size changes between fseek() and - * fread(). If it does, we just log it and serve what we got. - */ - log_error(LOG_LEVEL_ERROR, - "Couldn't completely read file %s.", filename); - err = JB_ERR_FILE; - } - - fclose(fp); - - return err; - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/cgisimple.h b/external/privoxy/cgisimple.h deleted file mode 100644 index 2bce214..0000000 --- a/external/privoxy/cgisimple.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef CGISIMPLE_H_INCLUDED -#define CGISIMPLE_H_INCLUDED -#define CGISIMPLE_H_VERSION "$Id: cgisimple.h,v 1.16 2008/05/26 17:30:55 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/cgisimple.h,v $ - * - * Purpose : Declares functions to intercept request, generate - * html or gif answers, and to compose HTTP resonses. - * - * Functions declared include: - * - * - * Copyright : Written by and Copyright (C) 2001-2007 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: cgisimple.h,v $ - * Revision 1.16 2008/05/26 17:30:55 fabiankeil - * Provide an OpenSearch Description to access the - * show-url-info page through "search engine plugins". - * - * Revision 1.15 2007/01/23 15:51:17 fabiankeil - * Add favicon delivery functions. - * - * Revision 1.14 2006/09/06 18:45:03 fabiankeil - * Incorporate modified version of Roland Rosenfeld's patch to - * optionally access the user-manual via Privoxy. Closes patch 679075. - * - * Formatting changed to Privoxy style, added call to - * cgi_error_no_template if the requested file doesn't - * exist and modified check whether or not Privoxy itself - * should serve the manual. Should work cross-platform now. - * - * Revision 1.13 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.11 2002/04/05 15:50:53 oes - * added send-stylesheet CGI - * - * Revision 1.10 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.9 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.8 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.7 2002/03/08 16:43:59 oes - * Renamed cgi_transparent_png to cgi_transparent_image - * - * Revision 1.6 2002/03/07 03:48:59 oes - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - * Revision 1.5 2002/01/22 23:26:03 jongfoster - * Adding cgi_transparent_gif() for http://i.j.b/t - * - * Revision 1.4 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.3 2001/10/14 22:00:32 jongfoster - * Adding support for a 404 error when an invalid CGI page is requested. - * - * Revision 1.2 2001/10/02 15:31:20 oes - * Introduced show-request cgi - * - * Revision 1.1 2001/09/16 17:08:54 jongfoster - * Moving simple CGI functions from cgi.c to new file cgisimple.c - * - * - **********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * CGI functions - */ -extern jb_err cgi_default (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_error_404 (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_robots_txt (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_send_banner (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_show_status (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_show_url_info(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_show_version (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_show_request (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_transparent_image (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_send_error_favicon (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_send_default_favicon (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_send_stylesheet(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_send_url_info_osd(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -extern jb_err cgi_send_user_manual(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); - - -#ifdef FEATURE_GRACEFUL_TERMINATION -extern jb_err cgi_die (struct client_state *csp, - struct http_response *rsp, - const struct map *parameters); -#endif - -/* Revision control strings from this header and associated .c file */ -extern const char cgisimple_rcs[]; -extern const char cgisimple_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef CGISIMPLE_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/config b/external/privoxy/config deleted file mode 100644 index 741382a..0000000 --- a/external/privoxy/config +++ /dev/null @@ -1,1530 +0,0 @@ -# Sample Configuration File for Privoxy v3.0.12 -# -# $Id: config,v 1.76 2009/03/21 11:51:51 fabiankeil Exp $ -# -# Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ -# -#################################################################### -# # -# Table of Contents # -# # -# I. INTRODUCTION # -# II. FORMAT OF THE CONFIGURATION FILE # -# # -# 1. LOCAL SET-UP DOCUMENTATION # -# 2. CONFIGURATION AND LOG FILE LOCATIONS # -# 3. DEBUGGING # -# 4. ACCESS CONTROL AND SECURITY # -# 5. FORWARDING # -# 6. WINDOWS GUI OPTIONS # -# # -#################################################################### -# -# -# I. INTRODUCTION -# =============== -# -# This file holds Privoxy's main configuration. Privoxy detects -# configuration changes automatically, so you don't have to restart -# it unless you want to load a different configuration file. -# -# The configuration will be reloaded with the first request after -# the change was done, this request itself will still use the old -# configuration, though. In other words: it takes two requests before -# you see the result of your changes. Requests that are dropped due -# to ACL don't trigger reloads. -# -# When starting Privoxy on Unix systems, give the location of this -# file as last argument. On Windows systems, Privoxy will look for -# this file with the name 'config.txt' in the current working directory -# of the Privoxy process. -# -# -# II. FORMAT OF THE CONFIGURATION FILE -# ==================================== -# -# 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, -# -# actionsfile default.action -# -# Indicates that the actionsfile is named 'default.action'. -# -# The '#' indicates a comment. Any part of a line following a '#' -# is ignored, except if the '#' is preceded by a ''. -# -# Thus, by placing a # at the start of an existing configuration -# line, you can make it a comment and it will be treated as if it -# weren't there. This is called "commenting out" an option and can -# be useful. Removing the # again is called "uncommenting". -# -# Note that commenting out an option and leaving it at its default -# are two completely different things! Most options behave very -# differently when unset. See the "Effect if unset" explanation in -# each option's description for details. -# -# Long lines can be continued on the next line by using a `' as the -# last character. -# -# -# -# 1. LOCAL SET-UP DOCUMENTATION -# ============================== -# -# If you intend to operate Privoxy for more users than just yourself, -# it might be a good idea to let them know how to reach you, what -# you block and why you do that, your policies, etc. -# -# -# -# 1.1. user-manual -# ================= -# -# Specifies: -# -# Location of the Privoxy User Manual. -# -# Type of value: -# -# A fully qualified URI -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# http://www.privoxy.org/version/user-manual/ will be used, -# where version is the Privoxy version. -# -# Notes: -# -# The User Manual URI is the single best source of information on -# Privoxy, and is used for help links from some of the internal -# CGI pages. The manual itself is normally packaged with the -# binary distributions, so you probably want to set this to a -# locally installed copy. -# -# Examples: -# -# The best all purpose solution is simply to put the full local -# PATH to where the User Manual is located: -# -# user-manual /usr/share/doc/privoxy/user-manual -# -# -# The User Manual is then available to anyone with -# access to Privoxy, by following the built-in URL: -# http://config.privoxy.org/user-manual/ (or the shortcut: -# http://p.p/user-manual/). -# -# If the documentation is not on the local system, it can be -# accessed from a remote server, as: -# -# user-manual http://example.com/privoxy/user-manual/ -# -# -# WARNING!!! -# -# If set, this option should be the first option in the config -# file, because it is used while the config file is being read. -# -#user-manual http://www.privoxy.org/user-manual/ -# -# -# 1.2. trust-info-url -# ==================== -# -# Specifies: -# -# A URL to be displayed in the error page that users will see if -# access to an untrusted page is denied. -# -# Type of value: -# -# URL -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No links are displayed on the "untrusted" error page. -# -# Notes: -# -# The value of this option only matters if the experimental trust -# mechanism has been activated. (See trustfile below.) -# -# If you use the trust mechanism, it is a good idea to write -# up some on-line documentation about your trust policy and to -# specify the URL(s) here. Use multiple times for multiple URLs. -# -# The URL(s) should be added to the trustfile as well, so users -# don't end up locked out from the information on why they were -# locked out in the first place! -# -#trust-info-url http://www.example.com/why_we_block.html -#trust-info-url http://www.example.com/what_we_allow.html -# -# -# 1.3. admin-address -# =================== -# -# Specifies: -# -# An email address to reach the Privoxy administrator. -# -# Type of value: -# -# Email address -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No email address is displayed on error pages and the CGI user -# interface. -# -# Notes: -# -# If both admin-address and proxy-info-url are unset, the whole -# "Local Privoxy Support" box on all generated pages will not -# be shown. -# -#admin-address privoxy-admin@example.com -# -# -# 1.4. proxy-info-url -# ==================== -# -# Specifies: -# -# A URL to documentation about the local Privoxy setup, -# configuration or policies. -# -# Type of value: -# -# URL -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No link to local documentation is displayed on error pages and -# the CGI user interface. -# -# Notes: -# -# If both admin-address and proxy-info-url are unset, the whole -# "Local Privoxy Support" box on all generated pages will not -# be shown. -# -# This URL shouldn't be blocked ;-) -# -#proxy-info-url http://www.example.com/proxy-service.html -# -# -# 2. CONFIGURATION AND LOG FILE LOCATIONS -# ======================================== -# -# Privoxy can (and normally does) use a number of other files for -# additional configuration, help and logging. This section of the -# configuration file tells Privoxy where to find those other files. -# -# The user running Privoxy, must have read permission for all -# configuration files, and write permission to any files that would -# be modified, such as log files and actions files. -# -# -# -# 2.1. confdir -# ============= -# -# Specifies: -# -# The directory where the other configuration files are located. -# -# Type of value: -# -# Path name -# -# Default value: -# -# /etc/privoxy (Unix) or Privoxy installation dir (Windows) -# -# Effect if unset: -# -# Mandatory -# -# Notes: -# -# No trailing "/", please. -# -confdir . -# -# -# 2.2. templdir -# ============== -# -# Specifies: -# -# An alternative directory where the templates are loaded from. -# -# Type of value: -# -# Path name -# -# Default value: -# -# unset -# -# Effect if unset: -# -# The templates are assumed to be located in confdir/template. -# -# Notes: -# -# Privoxy's original templates are usually overwritten with each -# update. Use this option to relocate customized templates that -# should be kept. As template variables might change between -# updates, you shouldn't expect templates to work with Privoxy -# releases other than the one they were part of, though. -# -#templdir . -# -# -# 2.3. logdir -# ============ -# -# Specifies: -# -# The directory where all logging takes place (i.e. where the -# logfile is located). -# -# Type of value: -# -# Path name -# -# Default value: -# -# /var/log/privoxy (Unix) or Privoxy installation dir (Windows) -# -# Effect if unset: -# -# Mandatory -# -# Notes: -# -# No trailing "/", please. -# -logdir . -# -# -# 2.4. actionsfile -# ================= -# -# Specifies: -# -# The actions file(s) to use -# -# Type of value: -# -# Complete file name, relative to confdir -# -# Default values: -# -# match-all.action # Actions that are applied to all sites and maybe overruled later on. -# -# default.action # Main actions file -# -# user.action # User customizations -# -# Effect if unset: -# -# No actions are taken at all. More or less neutral proxying. -# -# Notes: -# -# Multiple actionsfile lines are permitted, and are in fact -# recommended! -# -# The default values are default.action, which is the "main" -# actions file maintained by the developers, and user.action, -# where you can make your personal additions. -# -# Actions files contain all the per site and per URL configuration -# for ad blocking, cookie management, privacy considerations, -# etc. There is no point in using Privoxy without at least one -# actions file. -# -# Note that since Privoxy 3.0.7, the complete filename, including -# the ".action" extension has to be specified. The syntax change -# was necessary to be consistent with the other file options and -# to allow previously forbidden characters. -# -actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on. -actionsfile default.action # Main actions file -actionsfile user.action # User customizations -# -# -# 2.5. filterfile -# ================ -# -# Specifies: -# -# The filter file(s) to use -# -# Type of value: -# -# File name, relative to confdir -# -# Default value: -# -# default.filter (Unix) or default.filter.txt (Windows) -# -# Effect if unset: -# -# No textual content filtering takes place, i.e. all +filter{name} -# actions in the actions files are turned neutral. -# -# Notes: -# -# Multiple filterfile lines are permitted. -# -# The filter files contain content modification rules that use -# regular expressions. These rules permit powerful changes on the -# content of Web pages, and optionally the headers as well, e.g., -# you could try to disable your favorite JavaScript annoyances, -# re-write the actual displayed text, or just have some fun -# playing buzzword bingo with web pages. -# -# The +filter{name} actions rely on the relevant filter (name) -# to be defined in a filter file! -# -# A pre-defined filter file called default.filter that contains a -# number of useful filters for common problems is included in the -# distribution. See the section on the filter action for a list. -# -# It is recommended to place any locally adapted filters into a -# separate file, such as user.filter. -# -filterfile default.filter -#filterfile user.filter # User customizations -# -# -# 2.6. logfile -# ============= -# -# Specifies: -# -# The log file to use -# -# Type of value: -# -# File name, relative to logdir -# -# Default value: -# -# Unset (commented out). When activated: logfile (Unix) or -# privoxy.log (Windows). -# -# Effect if unset: -# -# No logfile is written. -# -# Notes: -# -# The logfile is where all logging and error messages are -# written. The level of detail and number of messages are set with -# the debug option (see below). 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) and it can help you to monitor -# what your browser is doing. -# -# Depending on the debug options below, the logfile may be a -# privacy risk if third parties can get access to it. As most -# users will never look at it, Privoxy 3.0.7 and later only log -# fatal errors by default. -# -# For most troubleshooting purposes, you will have to change that, -# please refer to the debugging section for details. -# -# 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 Red Hat based Linux -# distributions, a logrotate script has been included. -# -# Any log files must be writable by whatever user Privoxy is -# being run as (on Unix, default user id is "privoxy"). -# -logfile logfile -# -# -# 2.7. trustfile -# =============== -# -# Specifies: -# -# The name of the trust file to use -# -# Type of value: -# -# File name, relative to confdir -# -# Default value: -# -# Unset (commented out). When activated: trust (Unix) or trust.txt -# (Windows) -# -# Effect if unset: -# -# The entire trust mechanism is disabled. -# -# Notes: -# -# The trust mechanism is an experimental feature for building -# white-lists and should be used with care. It is NOT recommended -# for the casual user. -# -# If you specify a trust file, Privoxy will only allow access to -# sites that are specified in the trustfile. Sites can be listed -# in one of two ways: -# -# Prepending a ~ character limits access to this site only (and -# any sub-paths within this site), e.g. ~www.example.com allows -# access to ~www.example.com/ features/news.html, etc. -# -# Or, you can designate sites as trusted referrers, by prepending -# the name with a + character. The effect is that access to -# untrusted sites will be granted -- but only if a link from -# this trusted referrer was used to get there. The link target -# will then be added to the "trustfile" so that future, direct -# accesses will be granted. Sites added via this mechanism do -# not become trusted referrers themselves (i.e. they are added -# with a ~ designation). There is a limit of 512 such entries, -# after which new entries will not be made. -# -# If you use the + operator in the trust file, it may grow -# considerably over time. -# -# It is recommended that Privoxy be compiled with the -# --disable-force, --disable-toggle and --disable-editor options, -# if this feature is to be used. -# -# Possible applications include limiting Internet access for -# children. -# -#trustfile trust -# -# -# 3. DEBUGGING -# ============= -# -# These options are mainly useful when tracing a problem. Note that -# you might also want to invoke Privoxy with the --no-daemon command -# line option when debugging. -# -# -# -# 3.1. debug -# =========== -# -# Specifies: -# -# Key values that determine what information gets logged. -# -# Type of value: -# -# Integer values -# -# Default value: -# -# 0 (i.e.: only fatal errors (that cause Privoxy to exit) are logged) -# -# Effect if unset: -# -# Default value is used (see above). -# -# Notes: -# -# The available debug levels are: -# -# debug 1 # Log the destination for each request Privoxy let through. See also debug 1024. -# debug 2 # show each connection status -# debug 4 # show I/O status -# debug 8 # show header parsing -# debug 16 # log all data written to the network into the logfile -# debug 32 # debug force feature -# debug 64 # debug regular expression filters -# debug 128 # debug redirects -# debug 256 # debug GIF de-animation -# debug 512 # Common Log Format -# debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. -# debug 2048 # CGI user interface -# debug 4096 # Startup banner and warnings. -# debug 8192 # Non-fatal errors -# -# -# To select multiple debug levels, you can either add them or -# use multiple debug lines. -# -# A debug level of 1 is informative because it will show you each -# request as it happens. 1, 4096 and 8192 are recommended so that -# you will notice when things go wrong. The other levels are -# probably only of interest if you are hunting down a specific -# problem. They can produce a hell of an output (especially 16). -# -# Privoxy used to ship with the debug levels recommended above -# enabled by default, but due to privacy concerns 3.0.7 and later -# are configured to only log fatal errors. -# -# If you are used to the more verbose settings, simply enable -# the debug lines below again. -# -# If you want to use pure CLF (Common Log Format), you should set -# "debug 512" ONLY and not enable anything else. -# -# Privoxy has a hard-coded limit for the length of log messages. If -# it's reached, messages are logged truncated and marked with -# "... [too long, truncated]". -# -# Please don't file any support requests without trying to -# reproduce the problem with increased debug level first. Once -# you read the log messages, you may even be able to solve the -# problem on your own. -# -#debug 1 # Log the destination for each request Privoxy let through. -#debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. -#debug 4096 # Startup banner and warnings -#debug 8192 # Non-fatal errors -# -# -# 3.2. single-threaded -# ===================== -# -# Specifies: -# -# Whether to run only one server thread. -# -# Type of value: -# -# None -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Multi-threaded (or, where unavailable: forked) operation, -# i.e. the ability to serve multiple requests simultaneously. -# -# Notes: -# -# This option is only there for debugging purposes. It will -# drastically reduce performance. -# -#single-threaded -# -# -# 3.3. hostname -# ============== -# -# Specifies: -# -# The hostname shown on the CGI pages. -# -# Type of value: -# -# Text -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# The hostname provided by the operating system is used. -# -# Notes: -# -# On some misconfigured systems resolving the hostname fails or -# takes too much time and slows Privoxy down. Setting a fixed -# hostname works around the problem. -# -# In other circumstances it might be desirable to show a hostname -# other than the one returned by the operating system. For example -# if the system has several different hostnames and you don't -# want to use the first one. -# -# Note that Privoxy does not validate the specified hostname value. -# -#hostname hostname.example.org -# -# -# 4. ACCESS CONTROL AND SECURITY -# =============================== -# -# This section of the config file controls the security-relevant -# aspects of Privoxy's configuration. -# -# -# -# 4.1. listen-address -# ==================== -# -# Specifies: -# -# The IP address and TCP port on which Privoxy will listen for -# client requests. -# -# Type of value: -# -# [IP-Address]:Port -# -# Default value: -# -# 127.0.0.1:8118 -# -# Effect if unset: -# -# Bind to 127.0.0.1 (localhost), port 8118. This is suitable and -# recommended for home users who run Privoxy on the same machine -# as their browser. -# -# Notes: -# -# You will need to configure your browser(s) to this proxy address -# and port. -# -# 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. -# -# 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 below), and/or a firewall. -# -# If you open Privoxy to untrusted users, you will also -# want to make sure that the following actions are disabled: -# enable-edit-actions and enable-remote-toggle -# -# 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 -# -# -listen-address 127.0.0.1:8118 -# -# -# 4.2. toggle -# ============ -# -# Specifies: -# -# Initial state of "toggle" status -# -# Type of value: -# -# 1 or 0 -# -# Default value: -# -# 1 -# -# Effect if unset: -# -# Act as if toggled on -# -# Notes: -# -# If set to 0, Privoxy will start in "toggled off" mode, -# i.e. mostly behave like a normal, content-neutral proxy -# with both ad blocking and content filtering disabled. See -# enable-remote-toggle below. -# -# The windows version will only display the toggle icon in the -# system tray if this option is present. -# -toggle 1 -# -# -# 4.3. enable-remote-toggle -# ========================== -# -# Specifies: -# -# Whether or not the web-based toggle feature may be used -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# The web-based toggle feature is disabled. -# -# Notes: -# -# When toggled off, Privoxy mostly acts like a normal, -# content-neutral proxy, i.e. doesn't block ads or filter content. -# -# Access to the toggle feature can not be controlled separately by -# "ACLs" or HTTP authentication, so that everybody who can access -# Privoxy (see "ACLs" and listen-address above) can toggle it -# for all users. So this option is not recommended for multi-user -# environments with untrusted users. -# -# Note that malicious client side code (e.g Java) is also capable -# of using this option. -# -# As a lot of Privoxy users don't read documentation, this feature -# is disabled by default. -# -# Note that you must have compiled Privoxy with support for this -# feature, otherwise this option has no effect. -# -enable-remote-toggle 0 -# -# -# 4.4. enable-remote-http-toggle -# =============================== -# -# Specifies: -# -# Whether or not Privoxy recognizes special HTTP headers to change -# its behaviour. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Privoxy ignores special HTTP headers. -# -# Notes: -# -# When toggled on, the client can change Privoxy's behaviour by -# setting special HTTP headers. Currently the only supported -# special header is "X-Filter: No", to disable filtering for -# the ongoing request, even if it is enabled in one of the -# action files. -# -# This feature is disabled by default. If you are using Privoxy in -# a environment with trusted clients, you may enable this feature -# at your discretion. Note that malicious client side code (e.g -# Java) is also capable of using this feature. -# -# This option will be removed in future releases as it has been -# obsoleted by the more general header taggers. -# -enable-remote-http-toggle 0 -# -# -# 4.5. enable-edit-actions -# ========================= -# -# Specifies: -# -# Whether or not the web-based actions file editor may be used -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# The web-based actions file editor is disabled. -# -# Notes: -# -# Access to the editor can not be controlled separately by -# "ACLs" or HTTP authentication, so that everybody who can access -# Privoxy (see "ACLs" and listen-address above) can modify its -# configuration for all users. -# -# This option is not recommended for environments with untrusted -# users and as a lot of Privoxy users don't read documentation, -# this feature is disabled by default. -# -# Note that malicious client side code (e.g Java) is also capable -# of using the actions editor and you shouldn't enable this -# options unless you understand the consequences and are sure -# your browser is configured correctly. -# -# Note that you must have compiled Privoxy with support for this -# feature, otherwise this option has no effect. -# -enable-edit-actions 0 -# -# -# 4.6. enforce-blocks -# ==================== -# -# Specifies: -# -# Whether the user is allowed to ignore blocks and can "go there -# anyway". -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Blocks are not enforced. -# -# Notes: -# -# Privoxy is mainly used to block and filter requests as a service -# to the user, for example to block ads and other junk that clogs -# the pipes. Privoxy's configuration isn't perfect and sometimes -# innocent pages are blocked. In this situation it makes sense to -# allow the user to enforce the request and have Privoxy ignore -# the block. -# -# In the default configuration Privoxy's "Blocked" page contains -# a "go there anyway" link to adds a special string (the force -# prefix) to the request URL. If that link is used, Privoxy -# will detect the force prefix, remove it again and let the -# request pass. -# -# Of course Privoxy can also be used to enforce a network -# policy. In that case the user obviously should not be able to -# bypass any blocks, and that's what the "enforce-blocks" option -# is for. If it's enabled, Privoxy hides the "go there anyway" -# link. If the user adds the force prefix by hand, it will not -# be accepted and the circumvention attempt is logged. -# -# Examples: -# -# enforce-blocks 1 -# -enforce-blocks 0 -# -# -# 4.7. ACLs: permit-access and deny-access -# ========================================= -# -# Specifies: -# -# Who can access what. -# -# Type of value: -# -# src_addr[/src_masklen] [dst_addr[/dst_masklen]] -# -# Where src_addr and dst_addr are IP addresses in dotted decimal -# notation or valid DNS names, and src_masklen and dst_masklen are -# subnet masks in CIDR notation, i.e. integer values from 2 to 30 -# representing the length (in bits) of the network address. The -# masks and the whole destination part are optional. -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't restrict access further than implied by listen-address -# -# Notes: -# -# Access controls are included at the request of ISPs and systems -# administrators, and are not usually needed by individual -# users. For a typical home user, it will normally suffice to -# ensure that Privoxy only listens on the localhost (127.0.0.1) -# or internal (home) network address by means of the listen-address -# option. -# -# Please see the warnings in the FAQ that Privoxy is not intended -# to be a substitute for a firewall or to encourage anyone to -# defer addressing basic security weaknesses. -# -# Multiple ACL lines are OK. If any ACLs are specified, Privoxy -# only talks to IP addresses that match at least one permit-access -# line and don't match any subsequent deny-access line. In other -# words, the last match wins, with the default being deny-access. -# -# If Privoxy is using a forwarder (see forward below) for a -# particular destination URL, the dst_addr that is examined is -# the address of the forwarder and NOT the address of the ultimate -# target. This is necessary because it may be impossible for the -# local Privoxy to determine the IP address of the ultimate target -# (that's often what gateways are used for). -# -# You should prefer using IP addresses over DNS names, because -# the address lookups take time. All DNS names must resolve! You -# can not use domain patterns like "*.org" or partial domain -# names. If a DNS name resolves to multiple IP addresses, only -# the first one is used. -# -# Denying access to particular sites by ACL may have undesired -# side effects if the site in question is hosted on a machine -# which also hosts other sites (most sites are). -# -# Examples: -# -# Explicitly define the default behavior if no ACL and -# listen-address are set: "localhost" is OK. The absence of a -# dst_addr implies that all destination addresses are OK: -# -# permit-access localhost -# -# -# Allow any host on the same class C subnet as www.privoxy.org -# access to nothing but www.example.com (or other domains hosted -# on the same system): -# -# permit-access www.privoxy.org/24 www.example.com/32 -# -# -# Allow access from any host on the 26-bit subnet 192.168.45.64 to -# anywhere, with the exception that 192.168.45.73 may not access -# the IP address behind www.dirty-stuff.example.com: -# -# permit-access 192.168.45.64/26 -# deny-access 192.168.45.73 www.dirty-stuff.example.com -# -# -# -# 4.8. buffer-limit -# ================== -# -# Specifies: -# -# Maximum size of the buffer for content filtering. -# -# Type of value: -# -# Size in Kbytes -# -# Default value: -# -# 4096 -# -# Effect if unset: -# -# Use a 4MB (4096 KB) limit. -# -# Notes: -# -# 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. Hence this option. -# -# When a document buffer size reaches the buffer-limit, it is -# flushed to the client unfiltered and no further attempt to filter -# the rest of the document is made. Remember that there may be -# multiple threads running, which might require up to buffer-limit -# Kbytes each, unless you have enabled "single-threaded" above. -# -buffer-limit 4096 -# -# -# 5. FORWARDING -# ============== -# -# This feature allows routing of HTTP requests through a chain of -# multiple proxies. -# -# Forwarding can be used to chain Privoxy with a caching proxy to -# speed up browsing. Using a parent proxy may also be necessary if -# the machine that Privoxy runs on has no direct Internet access. -# -# Note that parent proxies can severely decrease your privacy -# level. For example a parent proxy could add your IP address to the -# request headers and if it's a caching proxy it may add the "Etag" -# header to revalidation requests again, even though you configured -# Privoxy to remove it. It may also ignore Privoxy's header time -# randomization and use the original values which could be used by -# the server as cookie replacement to track your steps between visits. -# -# Also specified here are SOCKS proxies. Privoxy supports the SOCKS -# 4 and SOCKS 4A protocols. -# -# -# -# 5.1. forward -# ============= -# -# Specifies: -# -# To which parent HTTP proxy specific requests should be routed. -# -# Type of value: -# -# target_pattern http_parent[:port] -# -# where target_pattern is a URL pattern that specifies to which -# requests (i.e. URLs) this forward rule shall apply. Use / -# to denote "all URLs". http_parent[:port] is the DNS name or -# IP address of the parent HTTP proxy through which the requests -# should be forwarded, optionally followed by its listening port -# (default: 8080). Use a single dot (.) to denote "no forwarding". -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't use parent HTTP proxies. -# -# Notes: -# -# If http_parent is ".", then requests are not forwarded to -# another HTTP proxy but are made directly to the web servers. -# -# Multiple lines are OK, they are checked in sequence, and the -# last match wins. -# -# Examples: -# -# Everything goes to an example parent proxy, except SSL on port -# 443 (which it doesn't handle): -# -# forward / parent-proxy.example.org:8080 -# forward :443 . -# -# -# Everything goes to our example ISP's caching proxy, except for -# requests to that ISP's sites: -# -# forward / caching-proxy.isp.example.net:8000 -# forward .isp.example.net . -# -# -# -# -# 5.2. forward-socks4, forward-socks4a and forward-socks5 -# ======================================================== -# -# Specifies: -# -# Through which SOCKS proxy (and optionally to which parent HTTP -# proxy) specific requests should be routed. -# -# Type of value: -# -# target_pattern socks_proxy[:port] http_parent[:port] -# -# where target_pattern is a URL pattern that specifies to which -# requests (i.e. URLs) this forward rule shall apply. Use / to -# denote "all URLs". http_parent and socks_proxy are IP addresses -# in dotted decimal notation or valid DNS names (http_parent may -# be "." to denote "no HTTP forwarding"), and the optional port -# parameters are TCP ports, i.e. integer values from 1 to 65535 -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't use SOCKS proxies. -# -# Notes: -# -# Multiple lines are OK, they are checked in sequence, and the -# last match wins. -# -# The difference between forward-socks4 and forward-socks4a -# is that in the SOCKS 4A protocol, the DNS resolution of the -# target hostname happens on the SOCKS server, while in SOCKS 4 -# it happens locally. -# -# With forward-socks5 the DNS resolution will happen on the remote -# server as well. -# -# If http_parent is ".", then requests are not forwarded to another -# HTTP proxy but are made (HTTP-wise) directly to the web servers, -# albeit through a SOCKS proxy. -# -# Examples: -# -# From the company example.com, direct connections are made to all -# "internal" domains, but everything outbound goes through their -# ISP's proxy by way of example.com's corporate SOCKS 4A gateway -# to the Internet. -# -# forward-socks4a / socks-gw.example.com:1080 www-cache.isp.example.net:8080 -# forward .example.com . -# -# -# A rule that uses a SOCKS 4 gateway for all destinations but no -# HTTP parent looks like this: -# -# forward-socks4 / socks-gw.example.com:1080 . -# -# -# To chain Privoxy and Tor, both running on the same system, -# you would use something like: -# -# forward-socks4a / 127.0.0.1:9050 . -# -# -# The public Tor network can't be used to reach your local network, -# if you need to access local servers you therefore might want -# to make some exceptions: -# -# forward 192.168.*.*/ . -# forward 10.*.*.*/ . -# forward 127.*.*.*/ . -# -# -# Unencrypted connections to systems in these address ranges will -# be as (un) secure as the local network is, but the alternative -# is that you can't reach the local network through Privoxy at -# all. Of course this may actually be desired and there is no -# reason to make these exceptions if you aren't sure you need them. -# -# If you also want to be able to reach servers in your local -# network by using their names, you will need additional exceptions -# that look like this: -# -# forward localhost/ . -# -# -# -# -# 5.3. forwarded-connect-retries -# =============================== -# -# Specifies: -# -# How often Privoxy retries if a forwarded connection request -# fails. -# -# Type of value: -# -# Number of retries. -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Connections forwarded through other proxies are treated like -# direct connections and no retry attempts are made. -# -# Notes: -# -# forwarded-connect-retries is mainly interesting for socks4a -# connections, where Privoxy can't detect why the connections -# failed. The connection might have failed because of a DNS timeout -# in which case a retry makes sense, but it might also have failed -# because the server doesn't exist or isn't reachable. In this -# case the retry will just delay the appearance of Privoxy's -# error message. -# -# Note that in the context of this option, "forwarded connections" -# includes all connections that Privoxy forwards through other -# proxies. This option is not limited to the HTTP CONNECT method. -# -# Only use this option, if you are getting lots of -# forwarding-related error messages that go away when you try again -# manually. Start with a small value and check Privoxy's logfile -# from time to time, to see how many retries are usually needed. -# -# Examples: -# -# forwarded-connect-retries 1 -# -forwarded-connect-retries 0 -# -# -# 5.4. accept-intercepted-requests -# ================================= -# -# Specifies: -# -# Whether intercepted requests should be treated as valid. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Only proxy requests are accepted, intercepted requests are -# treated as invalid. -# -# Notes: -# -# If you don't trust your clients and want to force them to use -# Privoxy, enable this option and configure your packet filter -# to redirect outgoing HTTP connections into Privoxy. -# -# Make sure that Privoxy's own requests aren't redirected as well. -# Additionally take care that Privoxy can't intentionally connect -# to itself, otherwise you could run into redirection loops if -# Privoxy's listening port is reachable by the outside or an -# attacker has access to the pages you visit. -# -# Examples: -# -# accept-intercepted-requests 1 -# -accept-intercepted-requests 0 -# -# -# 5.5. allow-cgi-request-crunching -# ================================= -# -# Specifies: -# -# Whether requests to Privoxy's CGI pages can be blocked or -# redirected. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Privoxy ignores block and redirect actions for its CGI pages. -# -# Notes: -# -# By default Privoxy ignores block or redirect actions for -# its CGI pages. Intercepting these requests can be useful in -# multi-user setups to implement fine-grained access control, -# but it can also render the complete web interface useless and -# make debugging problems painful if done without care. -# -# Don't enable this option unless you're sure that you really -# need it. -# -# Examples: -# -# allow-cgi-request-crunching 1 -# -allow-cgi-request-crunching 0 -# -# -# 5.6. split-large-forms -# ======================= -# -# Specifies: -# -# Whether the CGI interface should stay compatible with broken -# HTTP clients. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# The CGI form generate long GET URLs. -# -# Notes: -# -# Privoxy's CGI forms can lead to rather long URLs. This isn't -# a problem as far as the HTTP standard is concerned, but it can -# confuse clients with arbitrary URL length limitations. -# -# Enabling split-large-forms causes Privoxy to divide big forms -# into smaller ones to keep the URL length down. It makes editing -# a lot less convenient and you can no longer submit all changes -# at once, but at least it works around this browser bug. -# -# If you don't notice any editing problems, there is no reason -# to enable this option, but if one of the submit buttons appears -# to be broken, you should give it a try. -# -# Examples: -# -# split-large-forms 1 -# -split-large-forms 0 -# -# -# 5.7. keep-alive-timeout -# ======================== -# -# Specifies: -# -# Number of seconds after which an open connection will no longer -# be reused. -# -# Type of value: -# -# Time in seconds. -# -# Default value: -# -# None -# -# Effect if unset: -# -# Connections are not reused. -# -# Notes: -# -# This option has no effect if Privoxy has been compiled without -# keep-alive support. -# -# Notes: -# -# Note that reusing connections doesn't necessary cause -# speedups. There are also a few privacy implications you should -# be aware of. -# -# Outgoing connections are shared between clients (if there are -# more than one) and closing the client that initiated the outgoing -# connection does not affect the connection between Privoxy and -# the server unless the client's request hasn't been completed -# yet. If the outgoing connection is idle, it will not be closed -# until either Privoxy's or the server's timeout is reached. While -# it's open, the server knows that the system running Privoxy is -# still there. -# -# Examples: -# -# keep-alive-timeout 300 -# -keep-alive-timeout 300 -# -# -# 5.8. socket-timeout -# ==================== -# -# Specifies: -# -# Number of seconds after which a socket times out if no data -# is received. -# -# Type of value: -# -# Time in seconds. -# -# Default value: -# -# None -# -# Effect if unset: -# -# A default value of 300 seconds is used. -# -# Notes: -# -# For SOCKS requests the timeout currently doesn't start until -# the SOCKS server accepted the request. This will be fixed in -# the next release. -# -# Examples: -# -# socket-timeout 300 -# -socket-timeout 300 -# -# -# 6. 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 -# -# diff --git a/external/privoxy/config.guess b/external/privoxy/config.guess deleted file mode 100644 index d622a44..0000000 --- a/external/privoxy/config.guess +++ /dev/null @@ -1,1530 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. - -timestamp='2012-02-10' - -# 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, see http://www.gnu.org/licenses/. -# -# 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. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to config-patches@gnu.org and include a ChangeLog -# entry. -# -# 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. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess... - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system `$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to config-patches@gnu.org." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try `$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=$?; (rm -f $tmpfiles 2>/dev/null; rmdir $tmp 2>/dev/null) && exit $exitcode" 0 ; -trap "rm -f $tmpfiles 2>/dev/null; rmdir $tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha (.*) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # 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. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - 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 ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - 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 ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - 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 ;; - 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 ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /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 ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # 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 ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include <stdio.h> /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/([0-9]*).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - 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 ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????: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 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <sys/systemcfg.h> - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - 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 ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include <stdlib.h> - #include <unistd.h> - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <unistd.h> - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*([A-Z]90)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's////'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's////'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - 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 i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: (.*)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - 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 ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - 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 ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` - echo ${UNAME_MACHINE}-pc-isc$UNAME_REL - elif /bin/uname -X 2>/dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - 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 ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*: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; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - 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; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *: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 ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says Richard.M.Bartel@ccMail.Census.GOV - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes hewes@openmarket.com. - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - 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 ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; - x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c <<EOF -#ifdef _SEQUENT_ -# include <sys/types.h> -# include <sys/utsname.h> -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include <sys/param.h> - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach ([0-9]*).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include <sys/param.h> -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# 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 ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 <<EOF -$0: unable to guess system type - -This script, last modified $timestamp, has failed to recognize -the operating system you are using. It is advised that you -download the most up to date version of the config scripts from - - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess... -and - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;h... - -If the version you run ($0) is already up to date, please -send the following data and any information you think might be -pertinent to config-patches@gnu.org in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/external/privoxy/config.orig b/external/privoxy/config.orig deleted file mode 100644 index 176dd5f..0000000 --- a/external/privoxy/config.orig +++ /dev/null @@ -1,1530 +0,0 @@ -# Sample Configuration File for Privoxy v3.0.12 -# -# $Id: config,v 1.75 2009/03/21 11:35:37 hal9 Exp $ -# -# Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ -# -#################################################################### -# # -# Table of Contents # -# # -# I. INTRODUCTION # -# II. FORMAT OF THE CONFIGURATION FILE # -# # -# 1. LOCAL SET-UP DOCUMENTATION # -# 2. CONFIGURATION AND LOG FILE LOCATIONS # -# 3. DEBUGGING # -# 4. ACCESS CONTROL AND SECURITY # -# 5. FORWARDING # -# 6. WINDOWS GUI OPTIONS # -# # -#################################################################### -# -# -# I. INTRODUCTION -# =============== -# -# This file holds Privoxy's main configuration. Privoxy detects -# configuration changes automatically, so you don't have to restart -# it unless you want to load a different configuration file. -# -# The configuration will be reloaded with the first request after -# the change was done, this request itself will still use the old -# configuration, though. In other words: it takes two requests before -# you see the result of your changes. Requests that are dropped due -# to ACL don't trigger reloads. -# -# When starting Privoxy on Unix systems, give the location of this -# file as last argument. On Windows systems, Privoxy will look for -# this file with the name 'config.txt' in the current working directory -# of the Privoxy process. -# -# -# II. FORMAT OF THE CONFIGURATION FILE -# ==================================== -# -# 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, -# -# actionsfile default.action -# -# Indicates that the actionsfile is named 'default.action'. -# -# The '#' indicates a comment. Any part of a line following a '#' -# is ignored, except if the '#' is preceded by a ''. -# -# Thus, by placing a # at the start of an existing configuration -# line, you can make it a comment and it will be treated as if it -# weren't there. This is called "commenting out" an option and can -# be useful. Removing the # again is called "uncommenting". -# -# Note that commenting out an option and leaving it at its default -# are two completely different things! Most options behave very -# differently when unset. See the "Effect if unset" explanation in -# each option's description for details. -# -# Long lines can be continued on the next line by using a `' as the -# last character. -# -# -# -# 1. LOCAL SET-UP DOCUMENTATION -# ============================== -# -# If you intend to operate Privoxy for more users than just yourself, -# it might be a good idea to let them know how to reach you, what -# you block and why you do that, your policies, etc. -# -# -# -# 1.1. user-manual -# ================= -# -# Specifies: -# -# Location of the Privoxy User Manual. -# -# Type of value: -# -# A fully qualified URI -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# http://www.privoxy.org/version/user-manual/ will be used, -# where version is the Privoxy version. -# -# Notes: -# -# The User Manual URI is the single best source of information on -# Privoxy, and is used for help links from some of the internal -# CGI pages. The manual itself is normally packaged with the -# binary distributions, so you probably want to set this to a -# locally installed copy. -# -# Examples: -# -# The best all purpose solution is simply to put the full local -# PATH to where the User Manual is located: -# -# user-manual /usr/share/doc/privoxy/user-manual -# -# -# The User Manual is then available to anyone with -# access to Privoxy, by following the built-in URL: -# http://config.privoxy.org/user-manual/ (or the shortcut: -# http://p.p/user-manual/). -# -# If the documentation is not on the local system, it can be -# accessed from a remote server, as: -# -# user-manual http://example.com/privoxy/user-manual/ -# -# -# WARNING!!! -# -# If set, this option should be the first option in the config -# file, because it is used while the config file is being read. -# -user-manual /home/halb/privoxy/share/doc/privoxy/user-manual/ -# -# -# 1.2. trust-info-url -# ==================== -# -# Specifies: -# -# A URL to be displayed in the error page that users will see if -# access to an untrusted page is denied. -# -# Type of value: -# -# URL -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No links are displayed on the "untrusted" error page. -# -# Notes: -# -# The value of this option only matters if the experimental trust -# mechanism has been activated. (See trustfile below.) -# -# If you use the trust mechanism, it is a good idea to write -# up some on-line documentation about your trust policy and to -# specify the URL(s) here. Use multiple times for multiple URLs. -# -# The URL(s) should be added to the trustfile as well, so users -# don't end up locked out from the information on why they were -# locked out in the first place! -# -#trust-info-url http://www.example.com/why_we_block.html -#trust-info-url http://www.example.com/what_we_allow.html -# -# -# 1.3. admin-address -# =================== -# -# Specifies: -# -# An email address to reach the Privoxy administrator. -# -# Type of value: -# -# Email address -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No email address is displayed on error pages and the CGI user -# interface. -# -# Notes: -# -# If both admin-address and proxy-info-url are unset, the whole -# "Local Privoxy Support" box on all generated pages will not -# be shown. -# -#admin-address privoxy-admin@example.com -# -# -# 1.4. proxy-info-url -# ==================== -# -# Specifies: -# -# A URL to documentation about the local Privoxy setup, -# configuration or policies. -# -# Type of value: -# -# URL -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# No link to local documentation is displayed on error pages and -# the CGI user interface. -# -# Notes: -# -# If both admin-address and proxy-info-url are unset, the whole -# "Local Privoxy Support" box on all generated pages will not -# be shown. -# -# This URL shouldn't be blocked ;-) -# -#proxy-info-url http://www.example.com/proxy-service.html -# -# -# 2. CONFIGURATION AND LOG FILE LOCATIONS -# ======================================== -# -# Privoxy can (and normally does) use a number of other files for -# additional configuration, help and logging. This section of the -# configuration file tells Privoxy where to find those other files. -# -# The user running Privoxy, must have read permission for all -# configuration files, and write permission to any files that would -# be modified, such as log files and actions files. -# -# -# -# 2.1. confdir -# ============= -# -# Specifies: -# -# The directory where the other configuration files are located. -# -# Type of value: -# -# Path name -# -# Default value: -# -# /etc/privoxy (Unix) or Privoxy installation dir (Windows) -# -# Effect if unset: -# -# Mandatory -# -# Notes: -# -# No trailing "/", please. -# -confdir /home/halb/privoxy/etc -# -# -# 2.2. templdir -# ============== -# -# Specifies: -# -# An alternative directory where the templates are loaded from. -# -# Type of value: -# -# Path name -# -# Default value: -# -# unset -# -# Effect if unset: -# -# The templates are assumed to be located in confdir/template. -# -# Notes: -# -# Privoxy's original templates are usually overwritten with each -# update. Use this option to relocate customized templates that -# should be kept. As template variables might change between -# updates, you shouldn't expect templates to work with Privoxy -# releases other than the one they were part of, though. -# -#templdir . -# -# -# 2.3. logdir -# ============ -# -# Specifies: -# -# The directory where all logging takes place (i.e. where the -# logfile is located). -# -# Type of value: -# -# Path name -# -# Default value: -# -# /var/log/privoxy (Unix) or Privoxy installation dir (Windows) -# -# Effect if unset: -# -# Mandatory -# -# Notes: -# -# No trailing "/", please. -# -logdir /home/halb/privoxy/var/log/privoxy -# -# -# 2.4. actionsfile -# ================= -# -# Specifies: -# -# The actions file(s) to use -# -# Type of value: -# -# Complete file name, relative to confdir -# -# Default values: -# -# match-all.action # Actions that are applied to all sites and maybe overruled later on. -# -# default.action # Main actions file -# -# user.action # User customizations -# -# Effect if unset: -# -# No actions are taken at all. More or less neutral proxying. -# -# Notes: -# -# Multiple actionsfile lines are permitted, and are in fact -# recommended! -# -# The default values are default.action, which is the "main" -# actions file maintained by the developers, and user.action, -# where you can make your personal additions. -# -# Actions files contain all the per site and per URL configuration -# for ad blocking, cookie management, privacy considerations, -# etc. There is no point in using Privoxy without at least one -# actions file. -# -# Note that since Privoxy 3.0.7, the complete filename, including -# the ".action" extension has to be specified. The syntax change -# was necessary to be consistent with the other file options and -# to allow previously forbidden characters. -# -actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on. -actionsfile default.action # Main actions file -actionsfile user.action # User customizations -# -# -# 2.5. filterfile -# ================ -# -# Specifies: -# -# The filter file(s) to use -# -# Type of value: -# -# File name, relative to confdir -# -# Default value: -# -# default.filter (Unix) or default.filter.txt (Windows) -# -# Effect if unset: -# -# No textual content filtering takes place, i.e. all +filter{name} -# actions in the actions files are turned neutral. -# -# Notes: -# -# Multiple filterfile lines are permitted. -# -# The filter files contain content modification rules that use -# regular expressions. These rules permit powerful changes on the -# content of Web pages, and optionally the headers as well, e.g., -# you could try to disable your favorite JavaScript annoyances, -# re-write the actual displayed text, or just have some fun -# playing buzzword bingo with web pages. -# -# The +filter{name} actions rely on the relevant filter (name) -# to be defined in a filter file! -# -# A pre-defined filter file called default.filter that contains a -# number of useful filters for common problems is included in the -# distribution. See the section on the filter action for a list. -# -# It is recommended to place any locally adapted filters into a -# separate file, such as user.filter. -# -filterfile default.filter -#filterfile user.filter # User customizations -# -# -# 2.6. logfile -# ============= -# -# Specifies: -# -# The log file to use -# -# Type of value: -# -# File name, relative to logdir -# -# Default value: -# -# Unset (commented out). When activated: logfile (Unix) or -# privoxy.log (Windows). -# -# Effect if unset: -# -# No logfile is written. -# -# Notes: -# -# The logfile is where all logging and error messages are -# written. The level of detail and number of messages are set with -# the debug option (see below). 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) and it can help you to monitor -# what your browser is doing. -# -# Depending on the debug options below, the logfile may be a -# privacy risk if third parties can get access to it. As most -# users will never look at it, Privoxy 3.0.7 and later only log -# fatal errors by default. -# -# For most troubleshooting purposes, you will have to change that, -# please refer to the debugging section for details. -# -# 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 Red Hat based Linux -# distributions, a logrotate script has been included. -# -# Any log files must be writable by whatever user Privoxy is -# being run as (on Unix, default user id is "privoxy"). -# -logfile logfile -# -# -# 2.7. trustfile -# =============== -# -# Specifies: -# -# The name of the trust file to use -# -# Type of value: -# -# File name, relative to confdir -# -# Default value: -# -# Unset (commented out). When activated: trust (Unix) or trust.txt -# (Windows) -# -# Effect if unset: -# -# The entire trust mechanism is disabled. -# -# Notes: -# -# The trust mechanism is an experimental feature for building -# white-lists and should be used with care. It is NOT recommended -# for the casual user. -# -# If you specify a trust file, Privoxy will only allow access to -# sites that are specified in the trustfile. Sites can be listed -# in one of two ways: -# -# Prepending a ~ character limits access to this site only (and -# any sub-paths within this site), e.g. ~www.example.com allows -# access to ~www.example.com/ features/news.html, etc. -# -# Or, you can designate sites as trusted referrers, by prepending -# the name with a + character. The effect is that access to -# untrusted sites will be granted -- but only if a link from -# this trusted referrer was used to get there. The link target -# will then be added to the "trustfile" so that future, direct -# accesses will be granted. Sites added via this mechanism do -# not become trusted referrers themselves (i.e. they are added -# with a ~ designation). There is a limit of 512 such entries, -# after which new entries will not be made. -# -# If you use the + operator in the trust file, it may grow -# considerably over time. -# -# It is recommended that Privoxy be compiled with the -# --disable-force, --disable-toggle and --disable-editor options, -# if this feature is to be used. -# -# Possible applications include limiting Internet access for -# children. -# -#trustfile trust -# -# -# 3. DEBUGGING -# ============= -# -# These options are mainly useful when tracing a problem. Note that -# you might also want to invoke Privoxy with the --no-daemon command -# line option when debugging. -# -# -# -# 3.1. debug -# =========== -# -# Specifies: -# -# Key values that determine what information gets logged. -# -# Type of value: -# -# Integer values -# -# Default value: -# -# 0 (i.e.: only fatal errors (that cause Privoxy to exit) are logged) -# -# Effect if unset: -# -# Default value is used (see above). -# -# Notes: -# -# The available debug levels are: -# -# debug 1 # Log the destination for each request Privoxy let through. See also debug 1024. -# debug 2 # show each connection status -# debug 4 # show I/O status -# debug 8 # show header parsing -# debug 16 # log all data written to the network into the logfile -# debug 32 # debug force feature -# debug 64 # debug regular expression filters -# debug 128 # debug redirects -# debug 256 # debug GIF de-animation -# debug 512 # Common Log Format -# debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. -# debug 2048 # CGI user interface -# debug 4096 # Startup banner and warnings. -# debug 8192 # Non-fatal errors -# -# -# To select multiple debug levels, you can either add them or -# use multiple debug lines. -# -# A debug level of 1 is informative because it will show you each -# request as it happens. 1, 4096 and 8192 are recommended so that -# you will notice when things go wrong. The other levels are -# probably only of interest if you are hunting down a specific -# problem. They can produce a hell of an output (especially 16). -# -# Privoxy used to ship with the debug levels recommended above -# enabled by default, but due to privacy concerns 3.0.7 and later -# are configured to only log fatal errors. -# -# If you are used to the more verbose settings, simply enable -# the debug lines below again. -# -# If you want to use pure CLF (Common Log Format), you should set -# "debug 512" ONLY and not enable anything else. -# -# Privoxy has a hard-coded limit for the length of log messages. If -# it's reached, messages are logged truncated and marked with -# "... [too long, truncated]". -# -# Please don't file any support requests without trying to -# reproduce the problem with increased debug level first. Once -# you read the log messages, you may even be able to solve the -# problem on your own. -# -#debug 1 # Log the destination for each request Privoxy let through. -#debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. -#debug 4096 # Startup banner and warnings -#debug 8192 # Non-fatal errors -# -# -# 3.2. single-threaded -# ===================== -# -# Specifies: -# -# Whether to run only one server thread. -# -# Type of value: -# -# None -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Multi-threaded (or, where unavailable: forked) operation, -# i.e. the ability to serve multiple requests simultaneously. -# -# Notes: -# -# This option is only there for debugging purposes. It will -# drastically reduce performance. -# -#single-threaded -# -# -# 3.3. hostname -# ============== -# -# Specifies: -# -# The hostname shown on the CGI pages. -# -# Type of value: -# -# Text -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# The hostname provided by the operating system is used. -# -# Notes: -# -# On some misconfigured systems resolving the hostname fails or -# takes too much time and slows Privoxy down. Setting a fixed -# hostname works around the problem. -# -# In other circumstances it might be desirable to show a hostname -# other than the one returned by the operating system. For example -# if the system has several different hostnames and you don't -# want to use the first one. -# -# Note that Privoxy does not validate the specified hostname value. -# -#hostname hostname.example.org -# -# -# 4. ACCESS CONTROL AND SECURITY -# =============================== -# -# This section of the config file controls the security-relevant -# aspects of Privoxy's configuration. -# -# -# -# 4.1. listen-address -# ==================== -# -# Specifies: -# -# The IP address and TCP port on which Privoxy will listen for -# client requests. -# -# Type of value: -# -# [IP-Address]:Port -# -# Default value: -# -# 127.0.0.1:8118 -# -# Effect if unset: -# -# Bind to 127.0.0.1 (localhost), port 8118. This is suitable and -# recommended for home users who run Privoxy on the same machine -# as their browser. -# -# Notes: -# -# You will need to configure your browser(s) to this proxy address -# and port. -# -# 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. -# -# 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 below), and/or a firewall. -# -# If you open Privoxy to untrusted users, you will also -# want to make sure that the following actions are disabled: -# enable-edit-actions and enable-remote-toggle -# -# 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 -# -# -listen-address 127.0.0.1:8118 -# -# -# 4.2. toggle -# ============ -# -# Specifies: -# -# Initial state of "toggle" status -# -# Type of value: -# -# 1 or 0 -# -# Default value: -# -# 1 -# -# Effect if unset: -# -# Act as if toggled on -# -# Notes: -# -# If set to 0, Privoxy will start in "toggled off" mode, -# i.e. mostly behave like a normal, content-neutral proxy -# with both ad blocking and content filtering disabled. See -# enable-remote-toggle below. -# -# The windows version will only display the toggle icon in the -# system tray if this option is present. -# -toggle 1 -# -# -# 4.3. enable-remote-toggle -# ========================== -# -# Specifies: -# -# Whether or not the web-based toggle feature may be used -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# The web-based toggle feature is disabled. -# -# Notes: -# -# When toggled off, Privoxy mostly acts like a normal, -# content-neutral proxy, i.e. doesn't block ads or filter content. -# -# Access to the toggle feature can not be controlled separately by -# "ACLs" or HTTP authentication, so that everybody who can access -# Privoxy (see "ACLs" and listen-address above) can toggle it -# for all users. So this option is not recommended for multi-user -# environments with untrusted users. -# -# Note that malicious client side code (e.g Java) is also capable -# of using this option. -# -# As a lot of Privoxy users don't read documentation, this feature -# is disabled by default. -# -# Note that you must have compiled Privoxy with support for this -# feature, otherwise this option has no effect. -# -enable-remote-toggle 0 -# -# -# 4.4. enable-remote-http-toggle -# =============================== -# -# Specifies: -# -# Whether or not Privoxy recognizes special HTTP headers to change -# its behaviour. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Privoxy ignores special HTTP headers. -# -# Notes: -# -# When toggled on, the client can change Privoxy's behaviour by -# setting special HTTP headers. Currently the only supported -# special header is "X-Filter: No", to disable filtering for -# the ongoing request, even if it is enabled in one of the -# action files. -# -# This feature is disabled by default. If you are using Privoxy in -# a environment with trusted clients, you may enable this feature -# at your discretion. Note that malicious client side code (e.g -# Java) is also capable of using this feature. -# -# This option will be removed in future releases as it has been -# obsoleted by the more general header taggers. -# -enable-remote-http-toggle 0 -# -# -# 4.5. enable-edit-actions -# ========================= -# -# Specifies: -# -# Whether or not the web-based actions file editor may be used -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# The web-based actions file editor is disabled. -# -# Notes: -# -# Access to the editor can not be controlled separately by -# "ACLs" or HTTP authentication, so that everybody who can access -# Privoxy (see "ACLs" and listen-address above) can modify its -# configuration for all users. -# -# This option is not recommended for environments with untrusted -# users and as a lot of Privoxy users don't read documentation, -# this feature is disabled by default. -# -# Note that malicious client side code (e.g Java) is also capable -# of using the actions editor and you shouldn't enable this -# options unless you understand the consequences and are sure -# your browser is configured correctly. -# -# Note that you must have compiled Privoxy with support for this -# feature, otherwise this option has no effect. -# -enable-edit-actions 0 -# -# -# 4.6. enforce-blocks -# ==================== -# -# Specifies: -# -# Whether the user is allowed to ignore blocks and can "go there -# anyway". -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Blocks are not enforced. -# -# Notes: -# -# Privoxy is mainly used to block and filter requests as a service -# to the user, for example to block ads and other junk that clogs -# the pipes. Privoxy's configuration isn't perfect and sometimes -# innocent pages are blocked. In this situation it makes sense to -# allow the user to enforce the request and have Privoxy ignore -# the block. -# -# In the default configuration Privoxy's "Blocked" page contains -# a "go there anyway" link to adds a special string (the force -# prefix) to the request URL. If that link is used, Privoxy -# will detect the force prefix, remove it again and let the -# request pass. -# -# Of course Privoxy can also be used to enforce a network -# policy. In that case the user obviously should not be able to -# bypass any blocks, and that's what the "enforce-blocks" option -# is for. If it's enabled, Privoxy hides the "go there anyway" -# link. If the user adds the force prefix by hand, it will not -# be accepted and the circumvention attempt is logged. -# -# Examples: -# -# enforce-blocks 1 -# -enforce-blocks 0 -# -# -# 4.7. ACLs: permit-access and deny-access -# ========================================= -# -# Specifies: -# -# Who can access what. -# -# Type of value: -# -# src_addr[/src_masklen] [dst_addr[/dst_masklen]] -# -# Where src_addr and dst_addr are IP addresses in dotted decimal -# notation or valid DNS names, and src_masklen and dst_masklen are -# subnet masks in CIDR notation, i.e. integer values from 2 to 30 -# representing the length (in bits) of the network address. The -# masks and the whole destination part are optional. -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't restrict access further than implied by listen-address -# -# Notes: -# -# Access controls are included at the request of ISPs and systems -# administrators, and are not usually needed by individual -# users. For a typical home user, it will normally suffice to -# ensure that Privoxy only listens on the localhost (127.0.0.1) -# or internal (home) network address by means of the listen-address -# option. -# -# Please see the warnings in the FAQ that Privoxy is not intended -# to be a substitute for a firewall or to encourage anyone to -# defer addressing basic security weaknesses. -# -# Multiple ACL lines are OK. If any ACLs are specified, Privoxy -# only talks to IP addresses that match at least one permit-access -# line and don't match any subsequent deny-access line. In other -# words, the last match wins, with the default being deny-access. -# -# If Privoxy is using a forwarder (see forward below) for a -# particular destination URL, the dst_addr that is examined is -# the address of the forwarder and NOT the address of the ultimate -# target. This is necessary because it may be impossible for the -# local Privoxy to determine the IP address of the ultimate target -# (that's often what gateways are used for). -# -# You should prefer using IP addresses over DNS names, because -# the address lookups take time. All DNS names must resolve! You -# can not use domain patterns like "*.org" or partial domain -# names. If a DNS name resolves to multiple IP addresses, only -# the first one is used. -# -# Denying access to particular sites by ACL may have undesired -# side effects if the site in question is hosted on a machine -# which also hosts other sites (most sites are). -# -# Examples: -# -# Explicitly define the default behavior if no ACL and -# listen-address are set: "localhost" is OK. The absence of a -# dst_addr implies that all destination addresses are OK: -# -# permit-access localhost -# -# -# Allow any host on the same class C subnet as www.privoxy.org -# access to nothing but www.example.com (or other domains hosted -# on the same system): -# -# permit-access www.privoxy.org/24 www.example.com/32 -# -# -# Allow access from any host on the 26-bit subnet 192.168.45.64 to -# anywhere, with the exception that 192.168.45.73 may not access -# the IP address behind www.dirty-stuff.example.com: -# -# permit-access 192.168.45.64/26 -# deny-access 192.168.45.73 www.dirty-stuff.example.com -# -# -# -# 4.8. buffer-limit -# ================== -# -# Specifies: -# -# Maximum size of the buffer for content filtering. -# -# Type of value: -# -# Size in Kbytes -# -# Default value: -# -# 4096 -# -# Effect if unset: -# -# Use a 4MB (4096 KB) limit. -# -# Notes: -# -# 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. Hence this option. -# -# When a document buffer size reaches the buffer-limit, it is -# flushed to the client unfiltered and no further attempt to filter -# the rest of the document is made. Remember that there may be -# multiple threads running, which might require up to buffer-limit -# Kbytes each, unless you have enabled "single-threaded" above. -# -buffer-limit 4096 -# -# -# 5. FORWARDING -# ============== -# -# This feature allows routing of HTTP requests through a chain of -# multiple proxies. -# -# Forwarding can be used to chain Privoxy with a caching proxy to -# speed up browsing. Using a parent proxy may also be necessary if -# the machine that Privoxy runs on has no direct Internet access. -# -# Note that parent proxies can severely decrease your privacy -# level. For example a parent proxy could add your IP address to the -# request headers and if it's a caching proxy it may add the "Etag" -# header to revalidation requests again, even though you configured -# Privoxy to remove it. It may also ignore Privoxy's header time -# randomization and use the original values which could be used by -# the server as cookie replacement to track your steps between visits. -# -# Also specified here are SOCKS proxies. Privoxy supports the SOCKS -# 4 and SOCKS 4A protocols. -# -# -# -# 5.1. forward -# ============= -# -# Specifies: -# -# To which parent HTTP proxy specific requests should be routed. -# -# Type of value: -# -# target_pattern http_parent[:port] -# -# where target_pattern is a URL pattern that specifies to which -# requests (i.e. URLs) this forward rule shall apply. Use / -# to denote "all URLs". http_parent[:port] is the DNS name or -# IP address of the parent HTTP proxy through which the requests -# should be forwarded, optionally followed by its listening port -# (default: 8080). Use a single dot (.) to denote "no forwarding". -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't use parent HTTP proxies. -# -# Notes: -# -# If http_parent is ".", then requests are not forwarded to -# another HTTP proxy but are made directly to the web servers. -# -# Multiple lines are OK, they are checked in sequence, and the -# last match wins. -# -# Examples: -# -# Everything goes to an example parent proxy, except SSL on port -# 443 (which it doesn't handle): -# -# forward / parent-proxy.example.org:8080 -# forward :443 . -# -# -# Everything goes to our example ISP's caching proxy, except for -# requests to that ISP's sites: -# -# forward / caching-proxy.isp.example.net:8000 -# forward .isp.example.net . -# -# -# -# -# 5.2. forward-socks4, forward-socks4a and forward-socks5 -# ======================================================== -# -# Specifies: -# -# Through which SOCKS proxy (and optionally to which parent HTTP -# proxy) specific requests should be routed. -# -# Type of value: -# -# target_pattern socks_proxy[:port] http_parent[:port] -# -# where target_pattern is a URL pattern that specifies to which -# requests (i.e. URLs) this forward rule shall apply. Use / to -# denote "all URLs". http_parent and socks_proxy are IP addresses -# in dotted decimal notation or valid DNS names (http_parent may -# be "." to denote "no HTTP forwarding"), and the optional port -# parameters are TCP ports, i.e. integer values from 1 to 65535 -# -# Default value: -# -# Unset -# -# Effect if unset: -# -# Don't use SOCKS proxies. -# -# Notes: -# -# Multiple lines are OK, they are checked in sequence, and the -# last match wins. -# -# The difference between forward-socks4 and forward-socks4a -# is that in the SOCKS 4A protocol, the DNS resolution of the -# target hostname happens on the SOCKS server, while in SOCKS 4 -# it happens locally. -# -# With forward-socks5 the DNS resolution will happen on the remote -# server as well. -# -# If http_parent is ".", then requests are not forwarded to another -# HTTP proxy but are made (HTTP-wise) directly to the web servers, -# albeit through a SOCKS proxy. -# -# Examples: -# -# From the company example.com, direct connections are made to all -# "internal" domains, but everything outbound goes through their -# ISP's proxy by way of example.com's corporate SOCKS 4A gateway -# to the Internet. -# -# forward-socks4a / socks-gw.example.com:1080 www-cache.isp.example.net:8080 -# forward .example.com . -# -# -# A rule that uses a SOCKS 4 gateway for all destinations but no -# HTTP parent looks like this: -# -# forward-socks4 / socks-gw.example.com:1080 . -# -# -# To chain Privoxy and Tor, both running on the same system, -# you would use something like: -# -# forward-socks4a / 127.0.0.1:9050 . -# -# -# The public Tor network can't be used to reach your local network, -# if you need to access local servers you therefore might want -# to make some exceptions: -# -# forward 192.168.*.*/ . -# forward 10.*.*.*/ . -# forward 127.*.*.*/ . -# -# -# Unencrypted connections to systems in these address ranges will -# be as (un) secure as the local network is, but the alternative -# is that you can't reach the local network through Privoxy at -# all. Of course this may actually be desired and there is no -# reason to make these exceptions if you aren't sure you need them. -# -# If you also want to be able to reach servers in your local -# network by using their names, you will need additional exceptions -# that look like this: -# -# forward localhost/ . -# -# -# -# -# 5.3. forwarded-connect-retries -# =============================== -# -# Specifies: -# -# How often Privoxy retries if a forwarded connection request -# fails. -# -# Type of value: -# -# Number of retries. -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Connections forwarded through other proxies are treated like -# direct connections and no retry attempts are made. -# -# Notes: -# -# forwarded-connect-retries is mainly interesting for socks4a -# connections, where Privoxy can't detect why the connections -# failed. The connection might have failed because of a DNS timeout -# in which case a retry makes sense, but it might also have failed -# because the server doesn't exist or isn't reachable. In this -# case the retry will just delay the appearance of Privoxy's -# error message. -# -# Note that in the context of this option, "forwarded connections" -# includes all connections that Privoxy forwards through other -# proxies. This option is not limited to the HTTP CONNECT method. -# -# Only use this option, if you are getting lots of -# forwarding-related error messages that go away when you try again -# manually. Start with a small value and check Privoxy's logfile -# from time to time, to see how many retries are usually needed. -# -# Examples: -# -# forwarded-connect-retries 1 -# -forwarded-connect-retries 0 -# -# -# 5.4. accept-intercepted-requests -# ================================= -# -# Specifies: -# -# Whether intercepted requests should be treated as valid. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Only proxy requests are accepted, intercepted requests are -# treated as invalid. -# -# Notes: -# -# If you don't trust your clients and want to force them to use -# Privoxy, enable this option and configure your packet filter -# to redirect outgoing HTTP connections into Privoxy. -# -# Make sure that Privoxy's own requests aren't redirected as well. -# Additionally take care that Privoxy can't intentionally connect -# to itself, otherwise you could run into redirection loops if -# Privoxy's listening port is reachable by the outside or an -# attacker has access to the pages you visit. -# -# Examples: -# -# accept-intercepted-requests 1 -# -accept-intercepted-requests 0 -# -# -# 5.5. allow-cgi-request-crunching -# ================================= -# -# Specifies: -# -# Whether requests to Privoxy's CGI pages can be blocked or -# redirected. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# Privoxy ignores block and redirect actions for its CGI pages. -# -# Notes: -# -# By default Privoxy ignores block or redirect actions for -# its CGI pages. Intercepting these requests can be useful in -# multi-user setups to implement fine-grained access control, -# but it can also render the complete web interface useless and -# make debugging problems painful if done without care. -# -# Don't enable this option unless you're sure that you really -# need it. -# -# Examples: -# -# allow-cgi-request-crunching 1 -# -allow-cgi-request-crunching 0 -# -# -# 5.6. split-large-forms -# ======================= -# -# Specifies: -# -# Whether the CGI interface should stay compatible with broken -# HTTP clients. -# -# Type of value: -# -# 0 or 1 -# -# Default value: -# -# 0 -# -# Effect if unset: -# -# The CGI form generate long GET URLs. -# -# Notes: -# -# Privoxy's CGI forms can lead to rather long URLs. This isn't -# a problem as far as the HTTP standard is concerned, but it can -# confuse clients with arbitrary URL length limitations. -# -# Enabling split-large-forms causes Privoxy to divide big forms -# into smaller ones to keep the URL length down. It makes editing -# a lot less convenient and you can no longer submit all changes -# at once, but at least it works around this browser bug. -# -# If you don't notice any editing problems, there is no reason -# to enable this option, but if one of the submit buttons appears -# to be broken, you should give it a try. -# -# Examples: -# -# split-large-forms 1 -# -split-large-forms 0 -# -# -# 5.7. keep-alive-timeout -# ======================== -# -# Specifies: -# -# Number of seconds after which an open connection will no longer -# be reused. -# -# Type of value: -# -# Time in seconds. -# -# Default value: -# -# None -# -# Effect if unset: -# -# Connections are not reused. -# -# Notes: -# -# This option has no effect if Privoxy has been compiled without -# keep-alive support. -# -# Notes: -# -# Note that reusing connections doesn't necessary cause -# speedups. There are also a few privacy implications you should -# be aware of. -# -# Outgoing connections are shared between clients (if there are -# more than one) and closing the client that initiated the outgoing -# connection does not affect the connection between Privoxy and -# the server unless the client's request hasn't been completed -# yet. If the outgoing connection is idle, it will not be closed -# until either Privoxy's or the server's timeout is reached. While -# it's open, the server knows that the system running Privoxy is -# still there. -# -# Examples: -# -# keep-alive-timeout 300 -# -keep-alive-timeout 300 -# -# -# 5.8. socket-timeout -# ==================== -# -# Specifies: -# -# Number of seconds after which a socket times out if no data -# is received. -# -# Type of value: -# -# Time in seconds. -# -# Default value: -# -# None -# -# Effect if unset: -# -# A default value of 300 seconds is used. -# -# Notes: -# -# For SOCKS requests the timeout currently doesn't start until -# the SOCKS server accepted the request. This will be fixed in -# the next release. -# -# Examples: -# -# socket-timeout 300 -# -socket-timeout 300 -# -# -# 6. 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 -# -# diff --git a/external/privoxy/config.sub b/external/privoxy/config.sub deleted file mode 100644 index c894da4..0000000 --- a/external/privoxy/config.sub +++ /dev/null @@ -1,1773 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. - -timestamp='2012-02-10' - -# 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, see http://www.gnu.org/licenses/. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to config-patches@gnu.org. Submit a context -# diff and a properly formatted GNU ChangeLog entry. -# -# 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. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;h... - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to config-patches@gnu.org." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try `$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^(.*)-([^-]*-[^-]*)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^(.*)-([^-]*-[^-]*)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^(.*)-([^-]*-[^-]*)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -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/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration `$1': machine `$basic_machine' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # 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 - ;; - abacus) - basic_machine=abacus-unknown - ;; - 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 - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - 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 | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - 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 - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - 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 - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-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 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - 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 - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-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 - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - 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 - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration `$1': machine `$basic_machine' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -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* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -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 - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -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 - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-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 - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/external/privoxy/configure.in b/external/privoxy/configure.in deleted file mode 100644 index 2945a7a..0000000 --- a/external/privoxy/configure.in +++ /dev/null @@ -1,1463 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -dnl -dnl $Id: configure.in,v 1.126 2009/03/21 10:45:06 fabiankeil Exp $ -dnl -dnl Written by and Copyright (C) 2001-2009 the -dnl Privoxy team. http://www.privoxy.org/ -dnl -dnl Based on the Internet Junkbuster originally written -dnl by and Copyright (C) 1997 Anonymous Coders and -dnl Junkbusters Corporation. http://www.junkbusters.com -dnl -dnl This program is free software; you can redistribute it -dnl and/or modify it under the terms of the GNU General -dnl Public License as published by the Free Software -dnl Foundation; either version 2 of the License, or (at -dnl your option) any later version. -dnl -dnl This program is distributed in the hope that it will -dnl be useful, but WITHOUT ANY WARRANTY; without even the -dnl implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. See the GNU General Public -dnl License for more details. -dnl -dnl The GNU General Public License should be included with -dnl this file. If not, you can view it at -dnl http://www.gnu.org/copyleft/gpl.html -dnl or write to the Free Software Foundation, Inc., 59 -dnl Temple Place - Suite 330, Boston, MA 02111-1307, USA. -dnl -dnl $Log: configure.in,v $ -dnl Revision 1.126 2009/03/21 10:45:06 fabiankeil -dnl Declare the code stable. -dnl -dnl Revision 1.125 2009/02/25 16:58:03 fabiankeil -dnl And the journey continues. Bump version to 3.0.12 UNRELEASED. -dnl -dnl Revision 1.124 2009/02/12 15:42:00 fabiankeil -dnl Declare the code stable. -dnl -dnl Revision 1.123 2009/02/06 18:17:32 fabiankeil -dnl Boldly enable keep-alive support where possible. -dnl -dnl Revision 1.122 2008/10/18 11:17:52 fabiankeil -dnl Connection keep-alive support is ready for testing, -dnl allow enabling it through the configure script. -dnl -dnl Revision 1.121 2008/08/30 12:03:07 fabiankeil -dnl Remove FEATURE_COOKIE_JAR. -dnl -dnl Revision 1.120 2008/08/21 17:19:50 fabiankeil -dnl Change version to 3.0.11 UNRELEASED. -dnl -dnl Revision 1.119 2008/08/13 16:53:50 fabiankeil -dnl Change version to 3.0.10 stable. -dnl -dnl Revision 1.118 2008/06/27 12:50:44 fabiankeil -dnl Here's looking at you, Gentoo Linux: Show a warning if -dnl --disable-pthread is used even though pthreads are available. -dnl -dnl Revision 1.117 2008/06/14 12:47:30 fabiankeil -dnl Set CODE_STATUS to beta. -dnl -dnl Revision 1.116 2008/06/08 11:55:09 fabiankeil -dnl - Show a warning if the soon-to-be-removed static PCRE code is used. -dnl - Hide the "using built-in static pcrs" message. With dynamic linking -dnl against PCRS disabled, the message isn't particularly useful. -dnl -dnl Revision 1.115 2008/05/25 15:50:14 fabiankeil -dnl Try to use zlib by default, but just show a warning if it's -dnl unavailable. Remove --enable-zlib, add --disable-zlib. -dnl -dnl Revision 1.114 2008/04/06 15:18:33 fabiankeil -dnl Oh well, rename the --enable-pcre-host-patterns option to -dnl --enable-extended-host-patterns as it's not really PCRE syntax. -dnl -dnl Revision 1.113 2008/04/06 14:54:26 fabiankeil -dnl Use PCRE syntax in host patterns when configured -dnl with --enable-pcre-host-patterns. -dnl -dnl Revision 1.112 2008/03/27 18:27:22 fabiankeil -dnl Remove kill-popups action. -dnl -dnl Revision 1.111 2008/02/03 14:40:47 fabiankeil -dnl Remove unused OSX_DARWIN macro. Reported by Mark Miller in #1852529. -dnl -dnl Revision 1.110 2008/01/26 10:52:13 fabiankeil -dnl Change version to 3.0.9 UNRELEASED. -dnl -dnl Revision 1.109 2008/01/20 14:07:09 fabiankeil -dnl Set CODE_STATUS to stable. -dnl -dnl Revision 1.108 2007/12/10 02:30:00 hal9 -dnl Change versioning for > 3.0.7 && < 3.0.8 -dnl -dnl Revision 1.107 2007/11/15 02:50:14 hal9 -dnl Setting to "beta" (for doc builds, etc). -dnl -dnl Revision 1.106 2007/05/11 11:49:41 fabiankeil -dnl Check for strlcat(). -dnl -dnl Revision 1.105 2007/04/09 17:34:58 fabiankeil -dnl Check for snprintf(). -dnl -dnl Revision 1.104 2007/03/31 13:35:11 fabiankeil -dnl Add checks for gettimeofday() and strlcpy(). -dnl -dnl Revision 1.103 2007/01/20 16:29:38 fabiankeil -dnl Suppress edit buttons for action files if Privoxy has -dnl no write access. Suggested by Roland in PR 1564026. -dnl -dnl Revision 1.102 2007/01/18 14:55:45 fabiankeil -dnl Check for tzset() and putenv() to make sure the -dnl replacement timegm() isn't included on systems -dnl where it fails to compile. -dnl -dnl Revision 1.101 2007/01/12 15:20:17 fabiankeil -dnl Temporarily ignore external libpcrs to prevent -dnl problems that are fixed in Privoxy's own version. -dnl -dnl Revision 1.100 2007/01/07 07:38:10 joergs -dnl Disabled -pipe for AmigaOS4. -dnl -dnl Revision 1.99 2007/01/01 19:36:37 fabiankeil -dnl Integrate a modified version of Wil Mahan's -dnl zlib patch (PR #895531). -dnl -dnl Revision 1.98 2006/12/17 19:15:26 fabiankeil -dnl Added ./configure switch for FEATURE_GRACEFUL_TERMINATION. -dnl -dnl Revision 1.97 2006/11/21 18:32:46 hal9 -dnl Setting version to 3.0.7 UNRELEASED for lack of a better setting. -dnl -dnl Revision 1.96 2006/11/18 14:42:51 fabiankeil -dnl Mark as stable. -dnl -dnl Revision 1.95 2006/11/14 02:08:59 hal9 -dnl Setting version string to 3.0.6 UNRELEASED. This needs to be reset to 3.0.6 -dnl stable just before CVS is tagged for release. -dnl -dnl Revision 1.94 2006/11/13 19:05:50 fabiankeil -dnl Make pthread mutex locking more generic. Instead of -dnl checking for OSX and OpenBSD, check for FEATURE_PTHREAD -dnl and use mutex locking unless there is an _r function -dnl available. Better safe than sorry. -dnl -dnl Fixes "./configure --disable-pthread" and should result -dnl in less threading-related problems on pthread-using platforms, -dnl but it still doesn't fix BR#1122404. -dnl -dnl Revision 1.93 2006/09/22 01:26:20 hal9 -dnl Set version to 3.0.5 BETA for hopefully release this weekend. -dnl -dnl Revision 1.92 2006/08/17 17:09:49 fabiankeil -dnl Added check for timegm(). -dnl -dnl Revision 1.91 2006/08/13 22:01:51 fabiankeil -dnl Added checks for strptime() and random() -dnl -dnl Revision 1.90 2006/07/18 14:48:45 david__schmidt -dnl Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -dnl with what was really the latest development (the v_3_0_branch branch) -dnl -dnl Revision 1.68.2.20 2004/01/31 16:31:46 oes -dnl Resetting version info to 0.0.0 UNRELEASED -dnl -dnl Revision 1.68.2.19 2004/01/30 09:26:03 oes -dnl Added docbook paths for debian sarge; set status for release -dnl -dnl Revision 1.68.2.18 2003/12/08 15:10:29 oes -dnl Bugfix: --with-docbook now correctly accepts its path parameter. Thanks, Roland! -dnl -dnl Revision 1.68.2.17 2003/10/18 18:41:26 david__schmidt -dnl Update to remain buildable on OS/2 - remove the failures -dnl due to missing unixisms -dnl -dnl Revision 1.68.2.16 2003/03/26 16:05:14 oes -dnl Marked as 0.0.0 UNRELEASED -dnl -dnl Revision 1.68.2.15 2003/03/26 00:25:00 oes -dnl Bump version for 3.0.2 -dnl -dnl Revision 1.68.2.14 2003/03/25 13:27:12 hal9 -dnl Manually apply Docbook/FreeBSD patch #708081 from a.go at tiscali.nl. -dnl -dnl Revision 1.68.2.13 2003/03/18 19:38:57 oes -dnl Set version info for 3.0.1 release -dnl -dnl Revision 1.68.2.12 2003/03/07 03:41:04 david__schmidt -dnl Wrapping all *_r functions (the non-_r versions of them) with mutex semaphores for OSX. Hopefully this will take care of all of those pesky crash reports. -dnl -dnl Revision 1.68.2.11 2003/03/06 15:22:37 oes -dnl Fixed minor shell syntax bug -dnl -dnl Revision 1.68.2.10 2003/01/08 16:39:41 oes -dnl Changing default to exclude FEATURE_IMAGE_DETECT_MSIE because of problem reports with recent IEs -dnl -dnl Revision 1.68.2.9 2002/12/13 23:47:45 hal9 -dnl Add openbsd $specialflags per gunner at styx2002.no-ip.org -dnl -dnl Revision 1.68.2.8 2002/11/27 12:55:26 oes -dnl Fixed broken handling of pre-set CFLAGS -dnl -dnl Revision 1.68.2.7 2002/10/25 02:44:22 hal9 -dnl Port of make install, etc from main trunk. Needs testing! Add Slackware -dnl support, and other related changes. Update related docs. -dnl -dnl Revision 1.68.2.6 2002/09/25 15:35:15 oes -dnl Marking as non-release -dnl -dnl Revision 1.68.2.5 2002/08/25 23:37:00 hal9 -dnl Getting ready for 3.0 release. -dnl -dnl Revision 1.68.2.4 2002/08/10 11:21:57 oes -dnl - Set Version to 2.9.20 (beta) -dnl - Add two AC_DEFINEs that indicate if the pcre*.h headers -dnl are located in a pcre/ subdir to the include path. -dnl -dnl Revision 1.68.2.3 2002/08/06 11:29:36 oes -dnl Fixed detection/inclusion of pcre.h, which is in a pcre subdir on RH -dnl -dnl Revision 1.68.2.2 2002/07/30 19:36:09 hal9 -dnl Bump version to 2.9.17. -dnl -dnl Revision 1.68.2.1 2002/07/26 15:21:12 oes -dnl Bumped version number for 2.9.16 freeze -dnl -dnl Revision 1.68 2002/05/25 16:54:54 jongfoster -dnl Detect if the compiler supports -pthread. -dnl Hopefully this will fix bug 560442. (I don't have a HP PA-RISC -dnl machine to test this!) -dnl -dnl Revision 1.67 2002/05/03 14:33:59 oes -dnl Generate doc/soucre/ldp.dsl -dnl -dnl Revision 1.66 2002/05/03 00:41:56 oes -dnl Set version to 2.9.15 to comply with new versioning scheme -dnl -dnl Revision 1.65 2002/04/25 19:13:57 morcego -dnl Removed RPM release number declaration on configure.in -dnl Changed makefile to use given value for RPM_PACKAGEV when on uploading -dnl targets (will produce an error, explaining who to do it, if no value -dnl if provided). -dnl -dnl Revision 1.64 2002/04/22 16:32:31 morcego -dnl configure.in, *.spec: Bumping release to 2 (2.9.14-2) -dnl -rh.spec: uid and gid are now macros -dnl -suse.spec: Changing the header Copyright to License (Copyright is -dnl deprecable) -dnl -dnl Revision 1.63 2002/04/11 11:00:21 oes -dnl Applied Moritz' fix for socklen_t on Solaris -dnl -dnl Revision 1.62 2002/04/11 10:09:20 oes -dnl Version 2.9.14 -dnl -dnl Revision 1.61 2002/04/10 18:14:45 morcego -dnl - (privoxy-rh.spec only) Relisting template files on the %%files section -dnl - (configure.in, privoxy-rh.spec) Bumped package release to 5 -dnl -dnl Revision 1.60 2002/04/09 16:38:49 oes -dnl Added detection of missing config.h.in -dnl -dnl Revision 1.59 2002/04/06 20:23:55 jongfoster -dnl Removing unnessacery tests (C++, ranlib) -dnl -dnl Revision 1.58 2002/04/04 20:49:20 swa -dnl attempt to consolidate the -dnl different dokbook versions. -dnl -dnl Revision 1.57 2002/04/04 00:36:36 gliptak -dnl always use pcre for matching -dnl -dnl Revision 1.56 2002/04/03 22:28:03 gliptak -dnl Removed references to gnu_regex -dnl -dnl Revision 1.55 2002/04/03 03:54:38 gliptak -dnl Checking pcre version -dnl -dnl Revision 1.54 2002/04/01 00:54:24 gliptak -dnl More changes needed around regex support. -dnl -dnl Revision 1.53 2002/03/29 20:09:01 swa -dnl al's patch -dnl -dnl Revision 1.52 2002/03/29 19:51:40 gliptak -dnl Correcting compile problem with Debian -dnl -dnl Revision 1.51 2002/03/28 20:43:00 swa -dnl set make correctly -dnl -dnl Revision 1.50 2002/03/27 03:03:45 hal9 -dnl Add test for man2html -dnl -dnl Revision 1.49 2002/03/27 02:19:52 david__schmidt -dnl More Mac OSX support: -dnl - Get rid of extraneous, noisy -pthread warnings -dnl - Define unix so we get oes' unix-tagged changes -dnl -dnl Revision 1.48 2002/03/26 22:29:54 swa -dnl we have a new homepage! -dnl -dnl Revision 1.47 2002/03/26 16:41:00 hal9 -dnl Upped RPM Release to 3 (need to build new RH packages) -dnl -dnl Revision 1.46 2002/03/24 18:55:06 jongfoster -dnl Making Docbook work under Windows -dnl -dnl Revision 1.45 2002/03/24 14:19:55 swa -dnl set rpm package release in configure.in. nowhere else. -dnl -dnl Revision 1.44 2002/03/24 13:25:43 swa -dnl name change related issues -dnl -dnl Revision 1.43 2002/03/24 12:56:21 swa -dnl name change related issues. -dnl -dnl Revision 1.42 2002/03/22 18:11:37 jongfoster -dnl Bumping version number to 2.9.12 -dnl -dnl Revision 1.41 2002/03/19 19:30:04 morcego -dnl - Fixing stylesheet checking on configure. If it is found, no further checks -dnl should be done -dnl -dnl - configure will now check for db2html or docbook2html (should work now -dnl on SuSe without the docbktls package) -dnl -dnl Revision 1.40 2002/03/09 14:33:30 oes -dnl Fixing the (harmless) AC_CHECK_FILE warnings -dnl -dnl Revision 1.39 2002/03/08 16:46:13 oes -dnl Added --enable-no-gifs -dnl -dnl Revision 1.38 2002/03/08 14:13:50 morcego -dnl Fixing configure, to remove a command not found error. -dnl -dnl Revision 1.37 2002/03/08 12:58:21 oes -dnl Tiny bugfix in AC_ARG_WITH(debug) -dnl -dnl Revision 1.36 2002/03/06 23:50:36 morcego -dnl Will not test for a text browser if we are not using docbook. -dnl -dnl Revision 1.35 2002/03/06 21:55:52 morcego -dnl New configure option: --with-docbook=(yes|no|directory) -dnl Preliminary new platform detection code included. Will work with the -dnl old one for now. No use just trowing it away -dnl -dnl Revision 1.34 2002/03/06 20:57:00 morcego -dnl Fixing detection of stylesheets on SuSe. -dnl -dnl Revision 1.33 2002/03/05 17:31:11 morcego -dnl Search for docbook.dsl. Should solve portability problems for SuSe. -dnl -dnl Revision 1.32 2002/03/05 14:07:43 morcego -dnl configure now detects rpm topdir, and change GNUmakefile acordingly -dnl (based on sugestion by Sarantis Paskalis) -dnl -dnl Revision 1.31 2002/03/05 13:43:28 morcego -dnl Checking for text browser, so redhat-dok can work. -dnl -dnl Revision 1.30 2002/03/04 17:58:01 oes -dnl Deleted _DEBUG and PID_FILE_PATH -dnl -dnl Revision 1.29 2002/02/28 14:20:53 oes -dnl Fixed detection of gethost*_r functions on Solaris -dnl -dnl Revision 1.28 2002/02/27 15:02:38 oes -dnl Incremented version number -dnl -dnl Revision 1.27 2002/01/10 12:35:18 oes -dnl Added cross-compile defaults to the AC_CHECK_SIZEOF macros -dnl to silence autoconf warnings. Numbers are for Intel/Linux. -dnl Is there a better way? -dnl -dnl Revision 1.26 2002/01/09 14:29:49 oes -dnl - Added AC_CHECK_FUNC tests for the availability of -dnl gethostbyname_r, gethostbyaddr_r, gmtime_r and -dnl localtime_r, as well as AC_TRY_COMPILE tests to -dnl determine their signatures. -dnl -dnl - Fixed a bug with the init of CFLAGS that was -dnl reported by barsnick -dnl -dnl Revision 1.25 2002/01/04 15:27:18 oes -dnl Changed quoting of CODE_STATUS for use in make -dnl -dnl Revision 1.24 2001/12/30 14:07:31 steudten -dnl - Add signal handling (unix) -dnl - Add SIGHUP handler (unix) -dnl - Add creation of pidfile (unix) -dnl - Add action 'top' in rc file (RH) -dnl - Add entry 'SIGNALS' to manpage -dnl - Add exit message to logfile (unix) -dnl -dnl Revision 1.23 2001/12/09 20:24:42 david__schmidt -dnl Change from "alpha" to "beta" in configure.in -dnl -dnl Revision 1.22 2001/12/01 11:24:01 jongfoster -dnl Renaming Makefile.in to GNUmakefile.in so that non-GNU versions of -dnl make break in a more obvious way. -dnl -dnl Revision 1.21 2001/11/30 21:35:54 jongfoster -dnl Bumping version number to 2.9.10 -dnl -dnl Revision 1.20 2001/10/23 21:24:09 jongfoster -dnl Support for FEATURE_CGI_EDIT_ACTIONS -dnl -dnl Revision 1.19 2001/10/07 15:33:14 oes -dnl Removed FEATURE_DENY_GZIP -dnl Bumped up version number -dnl -dnl Revision 1.18 2001/09/13 13:10:24 steudten -dnl -dnl PreWork for Debug Interface. -dnl Add new option "--with-debug" to enable debugging (flags aso.) -dnl -dnl Revision 1.17 2001/09/12 23:44:55 david__schmidt -dnl Mac OSX (Darwin) support added. -dnl -dnl Revision 1.16 2001/09/12 22:55:45 joergs -dnl AmigaOS support added. -dnl -dnl Revision 1.15 2001/09/12 17:28:59 david__schmidt -dnl -dnl OS/2 port: update autoconf'd support for the platform. -dnl -dnl Revision 1.14 2001/07/30 22:12:11 jongfoster -dnl Fixing Solaris build (I hope) and tidying up #defines: -dnl - All feature #defines are now of the form FEATURE_xxx -dnl - Permanently turned off WIN_GUI_EDIT -dnl - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS -dnl -dnl Revision 1.13 2001/07/29 17:09:17 jongfoster -dnl Major changes to build system in order to fix these bugs: -dnl - pthreads under Linux was broken - changed -lpthread to -pthread -dnl - Compiling in MinGW32 mode under CygWin now correctly detects -dnl which shared libraries are available -dnl - Solaris support (?) (Not tested under Solaris yet) -dnl -dnl Revision 1.12 2001/07/25 19:16:27 oes -dnl Bumping version number to 2.9.8 -dnl -dnl Revision 1.11 2001/07/21 18:00:07 jongfoster -dnl Bumping version number to 2.9.7 -dnl -dnl Revision 1.10 2001/07/18 17:25:04 oes -dnl Fixed a typo -dnl -dnl Revision 1.9 2001/07/15 19:45:13 jongfoster -dnl Added support for linking with POSIX threads library -dnl -dnl Revision 1.8 2001/07/15 17:54:29 jongfoster -dnl Renaming #define STATIC to STATIC_PCRE -dnl Adding new #define FEATURE_PTHREAD that will be used to enable -dnl POSIX threads support. -dnl -dnl Revision 1.7 2001/07/13 13:58:05 oes -dnl Completely reorganized the selection scheme for -dnl pcre, pcreposix, pcrs and gnu_regex: -dnl -dnl The presence of shared pcre, pcreposix or pcrs -dnl libraried is now autodetected. Additionally, the -dnl user can enforce using the built-in static variants -dnl by specifying --disable-dynamic-(pcre|pcrs). -dnl Care is taken to avoid that pcre is dyn, while pcreposix -dnl is static, if both are used and that pcrs is static if -dnl pcrs is. -dnl -dnl The choice between pcre, gnu or no regex for actionsfile -dnl URL matching is now via -dnl --(enable|disable)-regex-matching[=(gnu|pcre|no)] with the -dnl default being pcre. -dnl -dnl Revision 1.6 2001/06/29 21:56:40 oes -dnl Version -> 2.9.5 -dnl -dnl Revision 1.5 2001/06/29 13:26:27 oes -dnl Introduced #define CODE_STATUS -dnl -dnl Revision 1.4 2001/05/29 09:50:24 jongfoster -dnl Unified blocklist/imagelist/permissionslist. -dnl File format is still under discussion, but the internal changes -dnl are (mostly) done. -dnl -dnl Also modified interceptor behaviour: -dnl - We now intercept all URLs beginning with one of the following -dnl prefixes (and *only* these prefixes): -dnl * http://i.j.b/ -dnl * http://ijbswa.sf.net/config/ -dnl * http://ijbswa.sourceforge.net/config/ -dnl - New interceptors "home page" - go to http://i.j.b/ to see it. -dnl - Internal changes so that intercepted and fast redirect pages -dnl are not replaced with an image. -dnl - Interceptors now have the option to send a binary page direct -dnl to the client. (i.e. ijb-send-banner uses this) -dnl - Implemented show-url-info interceptor. (Which is why I needed -dnl the above interceptors changes - a typical URL is -dnl "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". -dnl The previous mechanism would not have intercepted that, and -dnl if it had been intercepted then it then it would have replaced -dnl it with an image.) -dnl -dnl Revision 1.3 2001/05/22 18:46:04 oes -dnl -dnl - Enabled filtering banners by size rather than URL -dnl by adding patterns that replace all standard banner -dnl sizes with the "Junkbuster" gif to the re_filterfile -dnl -dnl - Enabled filtering WebBugs by providing a pattern -dnl which kills all 1x1 images -dnl -dnl - Added support for PCRE_UNGREEDY behaviour to pcrs, -dnl which is selected by the (nonstandard and therefore -dnl capital) letter 'U' in the option string. -dnl It causes the quantifiers to be ungreedy by default. -dnl Appending a ? turns back to greedy (!). -dnl -dnl - Added a new interceptor ijb-send-banner, which -dnl sends back the "Junkbuster" gif. Without imagelist or -dnl MSIE detection support, or if tinygif = 1, or the -dnl URL isn't recognized as an imageurl, a lame HTML -dnl explanation is sent instead. -dnl -dnl - Added new feature, which permits blocking remote -dnl script redirects and firing back a local redirect -dnl to the browser. -dnl The feature is conditionally compiled, i.e. it -dnl can be disabled with --disable-fast-redirects, -dnl plus it must be activated by a "fast-redirects" -dnl line in the config file, has its own log level -dnl and of course wants to be displayed by show-proxy-args -dnl Note: Boy, all the #ifdefs in 1001 locations and -dnl all the fumbling with configure.in and acconfig.h -dnl were *way* more work than the feature itself :-( -dnl -dnl - Because a generic redirect template was needed for -dnl this, tinygif = 3 now uses the same. -dnl -dnl - Moved GIFs, and other static HTTP response templates -dnl to project.h -dnl -dnl - Some minor fixes -dnl -dnl - Removed some >400 CRs again (Jon, you really worked -dnl a lot! ;-) -dnl -dnl Revision 1.2 2001/05/20 01:21:20 jongfoster -dnl Version 2.9.4 checkin. -dnl - Merged popupfile and cookiefile, and added control over PCRS -dnl filtering, in new "permissionsfile". -dnl - Implemented LOG_LEVEL_FATAL, so that if there is a configuration -dnl file error you now get a message box (in the Win32 GUI) rather -dnl than the program exiting with no explanation. -dnl - Made killpopup use the PCRS MIME-type checking and HTTP-header -dnl skipping. -dnl - Removed tabs from "config" -dnl - Moved duplicated url parsing code in "loaders.c" to a new funcition. -dnl - Bumped up version number. -dnl -dnl Revision 1.1.1.1 2001/05/15 13:58:50 oes -dnl Initial import of version 2.9.3 source tree -dnl -dnl - - -dnl ================================================================= -dnl AutoConf Initialization -dnl ================================================================= - -AC_REVISION($Revision: 1.126 $) -AC_INIT(jcc.c) - -if test ! -f config.h.in; then - echo "You need to run autoheader first. " - echo -n "Shall I do this for you now? (y/n) " - read answer - if test "$answer" != "y"; then - exit 1 - else - autoheader - fi -fi - -AC_CONFIG_HEADER([config.h]) -AC_CANONICAL_HOST - -dodk=auto -DKPREFIX=none -AC_ARG_WITH(docbook, dnl - --with-docbook=[[yes|no|directory]] - Enable docbook documentation creation - (default = yes, for gnu and linux),[dnl -case "$with_docbook" in -yes) dodk=yes;; -no) dodk=no;; -*) - dodk=yes - DKPREFIX=$withval - ;; -esac -]) -DB2HTML=false -AC_ARG_WITH(db2html, dnl - --with-db2html=<path/executable> - Set the location of the docbook to html converter - (default = search),[dnl -DB2HTML=$withval -]) - -dnl ================================================================= -dnl Application version number -dnl ================================================================= - -VERSION_MAJOR=3 -VERSION_MINOR=0 -VERSION_POINT=12 -CODE_STATUS="stable" - -dnl CODE_STATUS can be "alpha", "beta", or "stable", and will be -dnl used for CGI output. Set version to 0.0.0 and status to "UNRELEASED" -dnl whenever CVS in a stable branch differs from the last release. - -dnl ================================================================= -dnl Substitute the version numbers -dnl ================================================================= - -AC_SUBST(VERSION_MAJOR) -AC_SUBST(VERSION_MINOR) -AC_SUBST(VERSION_POINT) -AC_SUBST(CODE_STATUS) - -dnl -AC_DEFINE_UNQUOTED(VERSION_MAJOR,${VERSION_MAJOR}) -AC_DEFINE_UNQUOTED(VERSION_MINOR,${VERSION_MINOR}) -AC_DEFINE_UNQUOTED(VERSION_POINT,${VERSION_POINT}) -AC_DEFINE_UNQUOTED(VERSION,"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_POINT}") -AC_DEFINE_UNQUOTED(CODE_STATUS,"${CODE_STATUS}") - -dnl ================================================================= -dnl Checks for programs needed to build. -dnl ================================================================= - -dnl Keep AC_PROG_CC from setting its own defaults: -if test "X$CFLAGS" = "X"; then - CFLAGS=" " -fi - -AC_PROG_CC -AC_PROG_CPP -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_PROG_AWK - -AC_CHECK_PROG(GDB,gdb,yes,no) -AC_PATH_PROG(BGROUPS,groups,no,/bin:/usr/bin:/usr/local/bin) -AC_PATH_PROG(ID,id,no,/bin:/usr/bin:/usr/local/bin) -AC_SUBST(ID) -AC_SUBST(BGROUPS) - -dnl ================================================================= -dnl debug, gcc and gdb support -dnl ================================================================= - -AC_ARG_WITH(debug, - [ --with-debug Enable debug mode], - [ - if test "x$withval" != "xno" ; then - if test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - if test "$GDB"; then - CFLAGS="$CFLAGS -ggdb" - else - CFLAGS="$CFLAGS -g" - fi - CFLAGS="$CFLAGS -Wshadow -Wconversion" - else - CFLAGS="$CFLAGS -g" - fi - fi - fi - ], - [ - if test "X$CFLAGS" = "X "; then # if CFLAGS were unset (see above) - if test "$GCC" = yes; then - CFLAGS="-O2" - fi - fi - ] -) - -dnl ================================================================= -dnl Check for user and group validity -dnl ================================================================= - - -if test "$EMXOS2" = yes; then - echo "Skipping user and group validity stuff."; - -else - - $ID privoxy >/dev/null 2>/dev/null - if test $? -ne 0 ; then - AC_MSG_WARN(There is no user 'privoxy' on this system) - fi - AC_MSG_CHECKING([for user]) - AC_ARG_WITH(user, - [ --with-user=privoxy Set user under which privoxy will run], - [ - if test "x$withval" != "xyes"; then - if test $ID = no ; then - AC_MSG_ERROR(There is no 'id' program on this system) - else - AC_MSG_RESULT($with_user) - $ID $with_user 2>/dev/null >/dev/null - if test $? -eq 0 ; then - USER=$with_user; - else - AC_MSG_ERROR(There is no user '$with_user' on this system) - fi - fi - else - AC_MSG_ERROR(We need a user if you give me this parameter) - fi - ], - [ - if test $ID = no ; then - AC_MSG_ERROR(There is no 'id' programm on this system) - else - AC_MSG_RESULT(none specified) - USER=$with_user - fi - ] - ) - AC_SUBST(USER) - - AC_MSG_CHECKING([for group]) - AC_ARG_WITH(group, - [ --with-group=privoxy Set group for privoxy], - [ - if test "x$withval" != "xyes"; then - if test $BGROUPS = no ; then - AC_MSG_ERROR(There is no 'groups' program on this system) - else - AC_MSG_RESULT($with_group) - $BGROUPS $USER >/dev/null - if test $? -eq 0 ; then - # FIXME: this fails if valid group, but not first group - # listed. - if test "$with_group" != "`$BGROUPS $USER | sed 's/.*: //' 2>/dev/null |$AWK '{print $1}'`" ; then - AC_MSG_ERROR(The given value '$withval' does not match group entry) - else - GROUP=$with_group; - fi - else - AC_MSG_ERROR(There is no group entry for user '$USER') - fi - fi - else - AC_MSG_ERROR(We need a group if you give me this parameter) - fi - ], - [ - if test $BGROUPS = no ; then - AC_MSG_ERROR(There is no 'groups' programm on this system) - else - AC_MSG_RESULT(none specified) - GROUP=$with_group; - fi - ] - ) - AC_SUBST(GROUP) - -fi - -dnl ================================================================= -dnl additional gcc flags -dnl ================================================================= -dnl -if test "$GCC"; then - if test "$host" != "powerpc-unknown-amigaos"; then - CFLAGS="-pipe $CFLAGS" - fi -fi - - -dnl ================================================================= -dnl Build type -dnl ================================================================= -dnl -dnl Must do this first. -dnl -dnl Reason: This sets CFLAGS in order to switch the Cygwin compiler -dnl into Cygwin or MinGW32 modes. Depending on the mode selected, -dnl the compiler will use completely different sets of library -dnl and include files. -dnl -dnl ================================================================= - -AC_MINGW32 -AC_CYGWIN - -if test "$MINGW32" = "yes"; then - target_type=mingw -else - if test "$CYGWIN" = "yes"; then - target_type=cygwin - else - target_type=unix - fi -fi - -if test $dodk = auto; then - dodk=no - if test $target_type = unix; then - case "$host_os" in - linux* | gnu*) - dodk=yes - ;; - esac - fi -fi - -dnl Decide what to do based on target_type -dnl Note: PTHREAD_LIB is always set, even if pthread is disabled. -dnl This is because we don't know yet whether pthread is enabled. - -AC_ARG_ENABLE(mingw32, -[ --enable-mingw32 Use mingw32 for a Windows GUI], -[if test $enableval = yes; then - target_type=mingw -fi]) - -if test $target_type = mingw; then - WIN_ONLY= - SPECIAL_CFLAGS="-mwindows -mno-cygwin" - PTHREAD_LIB=-lpthreadGC - echo "Using mingw32 (Win32 GUI)" -else - WIN_ONLY=# - if test $target_type = cygwin; then - SPECIAL_CFLAGS="-mno-win32" - PTHREAD_LIB= - echo "Using Cygnus (Win32 command line)" - else - SPECIAL_CFLAGS= -dnl PTHREAD_LIB=-lpthread - fi -fi -AC_SUBST(WIN_ONLY) - -dnl Checking which text html browser we have avaliable -if test $dodk != no; then - AC_CHECK_PROGS(WDUMP,w3m lynx links,false) - if test "$WDUMP" = false; then - AC_MSG_WARN(You need some kind of text browser to build documentation (w3m, lynx and links are supported)) - fi - if test $DB2HTML = false; then - dnl We need to clean the variable, otherwise AC_CHECK_PROGS - dnl will fail - DB2HTML="" - AC_CHECK_PROGS(DB2HTML,db2html docbook2html,false) - fi -fi -AC_SUBST(WDUMP) -AC_SUBST(DB2HTML) - -dnl If we use rpm, we need to check where %_topdir is -AC_CHECK_PROGS(RPMBIN,rpm,false) -if test $RPMBIN != false; then - RPM_BASE=`rpm --eval "%{_topdir}"` - if test "$RPM_BASE" = ""; then - RPM_BASE=/usr/src/redhat - fi -fi -AC_SUBST(RPM_BASE) - -dnl Check for jade, so we can build the documentation -AC_CHECK_PROGS(JADEBIN,jade openjade,false) -AC_SUBST(JADEBIN) - -dnl Check for man2html for docs. -AC_CHECK_PROGS(MAN2HTML,man2html,false) -AC_SUBST(MAN2HTML) - -dnl Set doc status flag for conditional content inclusions -DOC_STATUS=p-not-stable -if test $CODE_STATUS = stable; then - DOC_STATUS="p-stable" -fi -AC_SUBST(DOC_STATUS) - -dnl Checking for the docbook.dsl stylesheet file -dnl It is still not portable (directory slash) -JADECAT="" -if test $dodk = yes; then - if test $DKPREFIX = none; then - for i in /usr/share/sgml/docbook/dsssl-stylesheets \ - /usr/share/sgml/docbkdsl /usr/share/sgml/docbook-dsssl \ - /usr/local/share/sgml/docbook/dsssl/modular \ - /usr/share/sgml/docbook/stylesheet/dsssl/modular/ \ - ; do -dnl echo -n does not fly with /bin/sh. -dnl echo -n "checking for $i/html/docbook.dsl..." - AC_MSG_CHECKING([for $i]) - if test -f $i/html/docbook.dsl; then - echo "yes" - DKPREFIX=$i - break - else - echo "no" - fi - done -# where are the catalogs? - for i in /usr/share/sgml/CATALOG.docbk30 \ - /usr/share/sgml/CATALOG.docbk31 \ - /usr/share/sgml/CATALOG.docbk31 \ - /usr/local/share/sgml/docbook/3.0/docbook.cat \ - /usr/local/share/sgml/docbook/3.1/docbook.cat \ - /usr/share/sgml/docbook/dtd/3.1/docbook.cat \ - ; do -dnl echo -n "checking for $i..." - AC_MSG_CHECKING([for $i]) - if test -f $i; then - echo "yes" - JADECAT="$JADECAT -c $i" - else - echo "no" - fi - done - fi -fi -AC_SUBST(JADECAT) -AC_SUBST(DKPREFIX) - -dnl Save old CFLAGS so we can restore them later, then add SPECIAL_CFLAGS -old_CFLAGS_nospecial=$CFLAGS -CFLAGS="$CFLAGS $SPECIAL_CFLAGS" - -# Hack to force AutoConf to use the CFLAGS we just set -dnl Warning: This may break with a future version of Autoconf -dnl Tested with autoconf 2.13 -ac_cpp='$CPP $CPPFLAGS $SPECIAL_CFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' - - -dnl ================================================================= -dnl Thread support -dnl ================================================================= - -AC_CHECK_HEADER(pthread.h, [have_pthread=yes], [have_pthread=no]) - -AC_ARG_ENABLE(pthread, -[ --disable-pthread Don't use POSIX threads (pthreads)], -[if test $enableval = no; then - # Disable pthreads - if test $have_pthread = yes; then - AC_MSG_WARN([pthreads seem to be available but you are using --disable-pthread.]) - AC_MSG_WARN([This is almost always a mistake and can render Privoxy unacceptable slow.]) - fi - have_pthread=no -fi]) - -if test $have_pthread = yes; then - PTHREAD_ONLY= - AC_DEFINE(FEATURE_PTHREAD) - echo Using POSIX threads - if test "$GCC" = "yes"; then - # Set a GCC specific switch: - if test "$target_type" = "unix"; then - ac_jgf_save_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -pthread" - AC_TRY_LINK([#include <pthread.h>], - [void *p = pthread_create;], - [ - # This compiler switch makes GCC on Linux thread-safe - # However, it's not supported on most other OS. - PTHREAD_LIB= - SPECIAL_CFLAGS="-pthread" - ]) - CFLAGS=$ac_jgf_save_CFLAGS - fi - fi -else - PTHREAD_ONLY=# - echo Using native threads -fi - -AC_SUBST(PTHREAD_ONLY) - -dnl ================================================================= -dnl Support for thread-safe versions of gethostbyaddr, gethostbyname, -dnl gmtime and localtime -dnl ================================================================= - -dnl Next line needed to find the gethost*_r functions on Solaris -AC_CHECK_LIB(nsl, gethostbyname) - -AC_CHECK_FUNC(gethostbyaddr_r, [ - AC_MSG_CHECKING([signature of gethostbyaddr_r]) - AC_TRY_COMPILE([ -# include <netdb.h> - ], [ - struct hostent *h, *hp; - char *a, *b; - int l, bl, t, e; - (void) gethostbyaddr_r(a, l, t, h, b, bl, &hp, &e) - ], [ - AC_DEFINE(HAVE_GETHOSTBYADDR_R_8_ARGS) - AC_MSG_RESULT([8 args]) - ], [ - AC_TRY_COMPILE([ -# include <netdb.h> - ], [ - struct hostent *h; - char *a, *b; - int l, bl, t, e; - (void) gethostbyaddr_r(a, l, t, h, b, bl, &e) - ], [ - AC_DEFINE(HAVE_GETHOSTBYADDR_R_7_ARGS) - AC_MSG_RESULT([7 args]) - ], [ - AC_TRY_COMPILE([ -# include <netdb.h> - ], [ - struct hostent_data *d; - struct hostent *h; - char a, - int l, t; - (void) gethostbyaddr_r(a, l, t, h, d) - ], [ - AC_DEFINE(HAVE_GETHOSTBYADDR_R_5_ARGS) - AC_MSG_RESULT([5 args]) - ], [ - AC_MSG_RESULT(unrecognised) - ]) - ]) - ]) -], [ - AC_MSG_RESULT(no) -]) - -AC_CHECK_FUNC(gethostbyname_r, [ - AC_MSG_CHECKING([signature of gethostbyname_r]) - AC_TRY_COMPILE([ -# include <netdb.h> - ], [ - struct hostent *h, *r; - char *n, *b; - int bl, e; - (void) gethostbyname_r(n, h, b, bl, &r, &e) - ], [ - AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARGS) - AC_MSG_RESULT([6 args]) - ], [ - AC_TRY_COMPILE([ -# include <netdb.h> - ], [ - struct hostent *h; - char *n, *b; - int bl, e; - (void) gethostbyname_r(n, h, b, bl, &e) - ], [ - AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARGS) - AC_MSG_RESULT([5 args]) - ], [ - AC_TRY_COMPILE([ -# include <netdb.h> - ], [ - struct hostent_data *d; - struct hostent *h; - char *n, - (void) gethostbyname_r(n, h, d) - ], [ - AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARGS) - AC_MSG_RESULT([3 args]) - ], [ - AC_MSG_RESULT(unrecognised) - ]) - ]) - ]) -], [ - AC_MSG_RESULT(no) -]) - -AC_CHECK_FUNC(gmtime_r, [ - AC_MSG_CHECKING([signature of gmtime_r]) - AC_TRY_COMPILE([ -# include <time.h> - ], [ - struct time *t; - struct tm *tm; - (void) gmtime_r(t, tm) - ], [ - AC_MSG_RESULT(ok) - AC_DEFINE(HAVE_GMTIME_R) - ], [ - AC_MSG_RESULT(unrecognised) - ]) -], [ - AC_MSG_RESULT(no) -]) - -AC_CHECK_FUNC(localtime_r, [ - AC_MSG_CHECKING([signature of localtime_r]) - AC_TRY_COMPILE([ -# include <time.h> - ], [ - struct time *t; - struct tm *tm; - (void) localtime_r(t, tm) - ], [ - AC_MSG_RESULT(ok) - AC_DEFINE(HAVE_LOCALTIME_R) - ], [ - AC_MSG_RESULT(unrecognised) - ]) -], [ - AC_MSG_RESULT(no) -]) - -dnl ================================================================= -dnl Solaris specific -dnl FIXME: Not tested on Solaris yet... -dnl ISFIXED: Have tested it on Solaris, but there are other ways to -dnl make these checks generic, e.g.: -dnl AC_CHECK_FUNC(getsockopt, , AC_CHECK_LIB(socket, getsockopt)) -dnl (Moritz Barsnick moritz@barsnick.net) -dnl ================================================================= - - -SOCKET_LIB= - -case "$host" in -*-solaris*) SOCKET_LIB="-lsocket -lnsl" - AC_DEFINE(__EXTENSIONS__) - if test "$GCC" = "yes"; then - # Set a GCC specific switch: - # This compiler switch makes Solaris thread-safe - PTHREAD_LIB= - SPECIAL_CFLAGS="-pthreads" - else - # What do we do without GCC? Guess this: - SPECIAL_CFLAGS="-D_REENTRANT" - fi -;; -esac - -AC_SUBST(SOCKET_LIB) - -dnl ================================================================= -dnl Solaris problem, and others perhaps (socklen_t is undefined) -dnl ================================================================= - -AC_MSG_CHECKING([for socklen_t]) -AC_EGREP_HEADER(socklen_t, sys/socket.h, AC_MSG_RESULT([yes]), - AC_MSG_RESULT([no]) - AC_DEFINE(socklen_t,int, - [ Define to 'int' if <sys/socket.h> doesn't have it. ])) - - -dnl ================================================================= -dnl OS/2 specific -dnl ================================================================= - -case "$host" in -*-os2-emx*) SOCKET_LIB=-lsocket -;; -esac - -AC_SUBST(SOCKET_LIB) - -dnl ================================================================= -dnl Mac OSX specific -dnl ================================================================= - -case "$host" in -*-apple-darwin*) SPECIAL_CFLAGS="-Dunix" -;; -esac - -dnl ================================================================= -dnl OpenBSD specific -dnl ================================================================= - -case "$host" in -*-openbsd*) SPECIAL_CFLAGS="$SPECIAL_CFLAGS -Dunix" -;; -esac - -dnl ================================================================= -dnl AmigaOS specific -dnl ================================================================= - -AMIGAOS_ONLY=# - -case "$host" in -*-amigaos) AMIGAOS_ONLY= -;; -esac - -AC_SUBST(AMIGAOS_ONLY) - -dnl ================================================================= -dnl Check for standard compiler stuff -dnl ================================================================= - -AC_EXEEXT -AC_OBJEXT -AC_HEADER_STDC -AC_HEADER_DIRENT -AC_C_CONST -AC_TYPE_SIZE_T -AC_TYPE_PID_T -AC_HEADER_TIME -AC_STRUCT_TM -AC_CHECK_SIZEOF(int, 4) -AC_CHECK_SIZEOF(char *, 4) -AC_CHECK_SIZEOF(long, 4) -AC_CHECK_SIZEOF(long long, 8) -AC_CHECK_SIZEOF(size_t, 4) - -dnl Checks for header files. -dnl AC_HEADER_SYS_WAIT -dnl AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/time.h unistd.h) -AC_CHECK_HEADERS([OS.h arpa/inet.h errno.h fcntl.h limits.h locale.h netdb.h netinet/in.h stddef.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h sys/timeb.h sys/wait.h unistd.h]) - -dnl Checks for library functions. -dnl AC_TYPE_SIGNAL -dnl AC_CHECK_FUNC(strstr) -dnl bcopy and memmove are for PCRE -AC_CHECK_FUNCS([strerror bcopy memmove]) -AC_PROG_GCC_TRADITIONAL -dnl uncommenting does not work for swa. suse linux -dnl AC_FUNC_MALLOC -AC_FUNC_SETPGRP -AC_TYPE_SIGNAL -dnl uncommenting does not work for swa. suse linux -dnl AC_FUNC_STAT -AC_CHECK_FUNCS([access atexit getcwd gethostbyaddr gethostbyaddr_r gethostbyname gethostbyname_r gettimeofday inet_ntoa localtime_r memchr memmove memset poll putenv random regcomp select setlocale snprintf socket strchr strdup strerror strftime strlcat strlcpy strptime strstr strtoul timegm tzset]) - - -dnl ================================================================= -dnl Checks for libraries. -dnl ================================================================= -dnl Note: Some systems may have the library but not the system header -dnl file, so we must check for both. -dnl Also check for correct version -AC_CHECK_LIB(pcre, pcre_compile, [ - AC_CHECK_HEADER(pcre.h, [ - AC_EGREP_HEADER(pcre_fullinfo, pcre.h, [have_pcre=yes], [AC_MSG_WARN([[pcre old version installed]]); have_pcre=no]) - ], [ - AC_CHECK_HEADER(pcre/pcre.h, [ - AC_EGREP_HEADER(pcre_fullinfo, pcre/pcre.h, [have_pcre=yes]; [AC_DEFINE(PCRE_H_IN_SUBDIR)], [AC_MSG_WARN([[pcre old version installed]]); have_pcre=no]) - ], [have_pcre=no]) - ]) -], [have_pcre=no]) - -AC_CHECK_LIB(pcreposix, regcomp, [ - AC_CHECK_HEADER(pcreposix.h, [ - AC_EGREP_HEADER(pcreposix_regerror, pcreposix.h, [AC_MSG_WARN([[pcreposix old version installed]]); have_pcreposix=no], [have_pcreposix=yes]) - ], [ - AC_CHECK_HEADER(pcre/pcreposix.h, [ - AC_EGREP_HEADER(pcreposix_regerror, pcre/pcreposix.h, [AC_MSG_WARN([[pcreposix old version installed]]); have_pcreposix=no], [have_pcreposix=yes]; [AC_DEFINE(PCREPOSIX_H_IN_SUBDIR)]) - ], [have_pcreposix=no]) - ]) -], [have_pcreposix=no], -lpcre) - -dnl ================================================================ -dnl libpcrs is temporarily disabled. -dnl -dnl Privoxy's own pcrs version fixes some problems that -dnl are present in libpcrs 0.3, the last pcrs release we -dnl know of, and as libpcrs seems to be currently unmaintained -dnl we can't send these fixes upstream. -dnl ================================================================ -dnl -dnl AC_CHECK_LIB(pcrs, pcrs_compile, [AC_CHECK_HEADER(pcrs.h, [have_pcrs=yes], [have_pcrs=no])], [have_pcrs=no], -lpcre) - -dnl ================================================================= -dnl Always defined -dnl ================================================================= - -AC_DEFINE(__MT__) - -dnl ================================================================= -dnl Features -dnl ================================================================= - -AC_ARG_ENABLE(toggle, -[ --disable-toggle Don't support temporary disable], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_TOGGLE) -fi],AC_DEFINE(FEATURE_TOGGLE)) - -AC_ARG_ENABLE(force, -[ --disable-force Don't allow single-page disable], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_FORCE_LOAD) -fi],AC_DEFINE(FEATURE_FORCE_LOAD)) - -AC_ARG_ENABLE(fast-redirects, -[ --disable-fast-redirects Don't support fast redirects], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_FAST_REDIRECTS) -fi], AC_DEFINE(FEATURE_FAST_REDIRECTS)) - -AC_ARG_ENABLE(stats, -[ --disable-stats Don't keep statistics], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_STATISTICS) -fi],AC_DEFINE(FEATURE_STATISTICS)) - -AC_ARG_ENABLE(ie-images, -[ --enable-ie-images Enable a quick but not always reliable auto-detect whether requests from - MS Internet Explorer are for an image or not.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_IMAGE_DETECT_MSIE) -fi],) - -AC_ARG_ENABLE(image-blocking, -[ --disable-image-blocking Don't try to figure out whether a request is - for an image or HTML - assume HTML.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_IMAGE_BLOCKING) -fi], -AC_DEFINE(FEATURE_IMAGE_BLOCKING)) - -AC_ARG_ENABLE(acl-files, -[ --disable-acl-files Prevents the use of ACL files to control access to - Privoxy by IP address.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_ACL) -fi], -AC_DEFINE(FEATURE_ACL)) - -AC_ARG_ENABLE(trust-files, -[ --disable-trust-files Prevents the use of trust files.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_TRUST) -fi], -AC_DEFINE(FEATURE_TRUST)) - -AC_ARG_ENABLE(editor, -[ --disable-editor Prevents the use of the web-based actions file - editor and web-based temporary disable setting.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_CGI_EDIT_ACTIONS) -fi], -AC_DEFINE(FEATURE_CGI_EDIT_ACTIONS)) - -AC_ARG_ENABLE(no-gifs, -[ --enable-no-gifs Use politically correct PNG format instead of GIF - for built-in images. May not work with all browsers.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_NO_GIFS) -fi]) - -AC_ARG_ENABLE(graceful-termination, -[ --enable-graceful-termination Allow to shutdown Privoxy through the webinterface.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_GRACEFUL_TERMINATION) -fi]) - -AC_ARG_ENABLE(extended-host-patterns, -[ --enable-extended-host-patterns Allow extended regular expressions in host patterns.], -[if test $enableval = yes; then - AC_DEFINE(FEATURE_EXTENDED_HOST_PATTERNS) -fi]) - -dnl pcre/pcrs is needed for CGI anyway, so -dnl the choice is only between static and -dnl dynamic: - -AC_ARG_ENABLE(dynamic-pcre, -[ --disable-dynamic-pcre Use the built-in, static pcre, even if libpcre is available], -[ if test $enableval = "no"; then have_pcre=no; fi ]) - -dnl ================================================= -dnl libpcrs is temporarily disabled, -dnl see comment above for the reason. -dnl ================================================= -dnl AC_ARG_ENABLE(dynamic-pcrs, -dnl [ --disable-dynamic-pcrs Use the built-in, static pcrs, even if libpcrs is available], -dnl [ if test $enableval = "no"; then have_pcrs=no; fi ]) - - -dnl ==================================================== -dnl This check is incomplete. For mingw32 zlib is found -dnl by configure, but not necessarily by the compiler. -dnl ==================================================== -AC_ARG_ENABLE(zlib, -[ --disable-zlib Don't use zlib to decompress data before filtering.], -[enableval2=$enableval], -[enableval2=yes]) -if test $enableval2 = yes; then - AC_CHECK_LIB(z, zlibVersion, [have_zlib="yes"], [have_zlib="no"]) - if test $have_zlib = "yes"; then - LIBS="$LIBS -lz" - AC_DEFINE(FEATURE_ZLIB,1,[Define to 1 to use compression through the zlib library.]) - else - AC_MSG_WARN([No zlib found. - Privoxy will not be able to filter compressed content. - This may become a fatal error in the future.]) - fi -fi - - -# If we have libpcre and either we also have pcreposix or -# we don't need pcreposix, then link pcre dynamically; else -# build it and link statically -# -if test $have_pcre = "yes"; then - echo "using libpcre" - pcre_dyn=yes - STATIC_PCRE_ONLY=# - LIBS="$LIBS -lpcre -lpcreposix" -else - AC_MSG_WARN([You are using the static PCRE code which is scheduled for removal, for details see: - https://sourceforge.net/mailarchive/message.php?msg_id=20080511195555.2dc6cf...]) - pcre_dyn=no - AC_DEFINE(STATIC_PCRE) - STATIC_PCRE_ONLY= -fi - -if test $have_pthread = "yes" -o $target_type = "mingw"; then - echo Enabling keep-alive support for outgoing connections. - AC_DEFINE(FEATURE_CONNECTION_KEEP_ALIVE) -fi - -dnl ================================================= -dnl libpcrs is temporarily disabled, -dnl see comment above for the reason. -dnl ================================================= -dnl # If we have libpcrs and pcre is linked dynamically -dnl # then also link pcrs dynamically, else build and link -dnl # pcrs statically -dnl -dnl if test $have_pcrs = "yes" -a $pcre_dyn = "yes"; then -dnl echo "using libpcrs" -dnl STATIC_PCRS_ONLY=# -dnl LIBS="$LIBS -lpcrs" -dnl else -dnl echo "using built-in static pcrs" - AC_DEFINE(STATIC_PCRS) - STATIC_PCRS_ONLY= -dnl fi - -AC_SUBST(STATIC_PCRE_ONLY) -AC_SUBST(STATIC_PCRS_ONLY) - -dnl ================================================================= -dnl Final cleanup and output -dnl ================================================================= - -dnl Remove the SPECIAL_CFLAGS stuff from CFLAGS, and add it seperately -dnl in the Makefile -CFLAGS=$old_CFLAGS_nospecial -AC_SUBST(SPECIAL_CFLAGS) - -AC_SUBST(PTHREAD_LIB) - -AC_OUTPUT(GNUmakefile doc/source/ldp.dsl) diff --git a/external/privoxy/cygwin.h b/external/privoxy/cygwin.h deleted file mode 100644 index 526f8d0..0000000 --- a/external/privoxy/cygwin.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef CYGWIN_H_INCLUDED -#define CYGWIN_H_INCLUDED -#define CYGWIN_H_VERSION "$Id: cygwin.h,v 1.6 2006/07/18 14:48:45 david__schmidt Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/cygwin.h,v $ - * - * Purpose : The windows.h file seems to be a *tad* different, so I - * will bridge the gaps here. Perhaps I should convert the - * latest SDK too? Shudder, I think not. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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: cygwin.h,v $ - * Revision 1.6 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.4 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.3 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.2 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.1.1.1 2001/05/15 13:58:51 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - -/* Conditionally include this whole file. */ -#ifdef __MINGW32__ - -/* Hmmm, seems to be overlooked. */ -#define _RICHEDIT_VER 0x0300 - -/* - * Named slightly different ... but not in Cygwin v1.3.1 ... - * - * #define LVITEM LV_ITEM - * #define LVCOLUMN LV_COLUMN - */ - -#endif /* def __MINGW32__ */ -#endif /* ndef CYGWIN_H_INCLUDED */ - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/deanimate.c b/external/privoxy/deanimate.c deleted file mode 100644 index 01fc97c..0000000 --- a/external/privoxy/deanimate.c +++ /dev/null @@ -1,554 +0,0 @@ -const char deanimate_rcs[] = "$Id: deanimate.c,v 1.19 2008/05/21 15:29:35 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/deanimate.c,v $ - * - * Purpose : Declares functions to manipulate binary images on the - * fly. High-level functions include: - * - Deanimation of GIF images - * - * Functions declared include: gif_deanimate, buf_free, - * buf_copy, buf_getbyte, gif_skip_data_block - * and gif_extract_image - * - * Copyright : Written by and Copyright (C) 2001 - 2004, 2006 by the - * SourceForge Privoxy team. http://www.privoxy.org/ - * - * Based on the GIF file format specification (see - * http://tronche.com/computer-graphics/gif/gif89a.html) - * and ideas from the Image::DeAnim Perl module by - * Ken MacFarlane, ksm+cpan@universal.dca.net - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: deanimate.c,v $ - * Revision 1.19 2008/05/21 15:29:35 fabiankeil - * Fix gcc43 warnings. - * - * Revision 1.18 2008/03/28 15:13:38 fabiankeil - * Remove inspect-jpegs action. - * - * Revision 1.17 2007/08/05 13:42:22 fabiankeil - * #1763173 from Stefan Huehner: declare some more functions static. - * - * Revision 1.16 2007/07/14 08:01:58 fabiankeil - * s@failiure@failure@ - * - * Revision 1.15 2007/01/03 14:39:19 fabiankeil - * Fix a gcc43 warning and mark the binbuffer - * as immutable for buf_getbyte(). - * - * Revision 1.14 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.12.2.1 2004/10/03 12:53:32 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.12 2002/05/12 21:36:29 jongfoster - * Correcting function comments - * - * Revision 1.11 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.10 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.9 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.8 2002/03/09 19:42:47 jongfoster - * Fixing more warnings - * - * Revision 1.7 2002/03/08 17:46:04 jongfoster - * Fixing int/size_t warnings - * - * Revision 1.6 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.5 2001/09/10 10:16:06 oes - * Silenced compiler warnings - * - * Revision 1.4 2001/07/18 12:28:49 oes - * - Added feature for extracting the first frame - * to gif_deanimate - * - Separated image buffer extension into buf_extend - * - Extended gif deanimation to GIF87a (untested!) - * - Cosmetics - * - * Revision 1.3 2001/07/15 13:57:50 jongfoster - * Adding #includes string.h and miscutil.h - * - * Revision 1.2 2001/07/13 13:46:20 oes - * Introduced GIF deanimation feature - * - * - **********************************************************************/ - - -#include "config.h" - -#include <string.h> -#include <fcntl.h> - -#include "errlog.h" -#include "project.h" -#include "deanimate.h" -#include "miscutil.h" - -const char deanimate_h_rcs[] = DEANIMATE_H_VERSION; - -/********************************************************************* - * - * Function : buf_free - * - * Description : Safely frees a struct binbuffer - * - * Parameters : - * 1 : buf = Pointer to the binbuffer to be freed - * - * Returns : N/A - * - *********************************************************************/ -void buf_free(struct binbuffer *buf) -{ - if (buf == NULL) return; - - if (buf->buffer != NULL) - { - free(buf->buffer); - } - - free(buf); - -} - - -/********************************************************************* - * - * Function : buf_extend - * - * Description : Ensure that a given binbuffer can hold a given amount - * of bytes, by reallocating its buffer if necessary. - * Allocate new mem in chunks of 1024 bytes, so we don't - * have to realloc() too often. - * - * Parameters : - * 1 : buf = Pointer to the binbuffer - * 2 : length = Desired minimum size - * - * - * Returns : 0 on success, 1 on failure. - * - *********************************************************************/ -static int buf_extend(struct binbuffer *buf, size_t length) -{ - char *newbuf; - - if (buf->offset + length > buf->size) - { - buf->size = ((buf->size + length + (size_t)1023) & ~(size_t)1023); - newbuf = (char *)realloc(buf->buffer, buf->size); - - if (newbuf == NULL) - { - freez(buf->buffer); - return 1; - } - else - { - buf->buffer = newbuf; - return 0; - } - } - return 0; - -} - - -/********************************************************************* - * - * Function : buf_copy - * - * Description : Safely copies a given amount of bytes from one - * struct binbuffer to another, advancing the - * offsets appropriately. - * - * Parameters : - * 1 : src = Pointer to the source binbuffer - * 2 : dst = Pointer to the destination binbuffer - * 3 : length = Number of bytes to be copied - * - * Returns : 0 on success, 1 on failure. - * - *********************************************************************/ -static int buf_copy(struct binbuffer *src, struct binbuffer *dst, size_t length) -{ - - /* - * Sanity check: Can't copy more data than we have - */ - if (src->offset + length > src->size) - { - return 1; - } - - /* - * Ensure that dst can hold the new data - */ - if (buf_extend(dst, length)) - { - return 1; - } - - /* - * Now that it's safe, memcpy() the desired amount of - * data from src to dst and adjust the offsets - */ - memcpy(dst->buffer + dst->offset, src->buffer + src->offset, length); - src->offset += length; - dst->offset += length; - - return 0; - -} - - -/********************************************************************* - * - * Function : buf_getbyte - * - * Description : Safely gets a byte from a given binbuffer at a - * given offset - * - * Parameters : - * 1 : src = Pointer to the source binbuffer - * 2 : offset = Offset to the desired byte - * - * Returns : The byte on success, or 0 on failure - * - *********************************************************************/ -static unsigned char buf_getbyte(const struct binbuffer *src, size_t offset) -{ - if (src->offset + offset < src->size) - { - return (unsigned char)*(src->buffer + src->offset + offset); - } - else - { - return '\0'; - } - -} - - -/********************************************************************* - * - * Function : gif_skip_data_block - * - * Description : Safely advances the offset of a given struct binbuffer - * that contains a GIF image and whose offset is - * positioned at the start of a data block, behind - * that block. - * - * Parameters : - * 1 : buf = Pointer to the binbuffer - * - * Returns : 0 on success, or 1 on failure - * - *********************************************************************/ -static int gif_skip_data_block(struct binbuffer *buf) -{ - unsigned char c; - - /* - * Data blocks are sequences of chunks, which are headed - * by a one-byte length field, with the last chunk having - * zero length. - */ - while((c = buf_getbyte(buf, 0)) != '\0') - { - buf->offset += (size_t)c + 1; - if (buf->offset >= buf->size - 1) - { - return 1; - } - } - buf->offset++; - - return 0; - -} - - -/********************************************************************* - * - * Function : gif_extract_image - * - * Description : Safely extracts an image data block from a given - * struct binbuffer that contains a GIF image and whose - * offset is positioned at the start of a data block - * into a given destination binbuffer. - * - * Parameters : - * 1 : src = Pointer to the source binbuffer - * 2 : dst = Pointer to the destination binbuffer - * - * Returns : 0 on success, or 1 on failure - * - *********************************************************************/ -static int gif_extract_image(struct binbuffer *src, struct binbuffer *dst) -{ - unsigned char c; - - /* - * Remember the colormap flag and copy the image head - */ - c = buf_getbyte(src, 9); - if (buf_copy(src, dst, 10)) - { - return 1; - } - - /* - * If the image has a local colormap, copy it. - */ - if (c & 0x80) - { - int map_length = 3 * (1 << ((c & 0x07) + 1)); - if (map_length <= 0) - { - log_error(LOG_LEVEL_DEANIMATE, - "colormap length = %d (%c)?", map_length, c); - return 1; - } - if (buf_copy(src, dst, (size_t)map_length)) - { - return 1; - } - } - if (buf_copy(src, dst, 1)) return 1; - - /* - * Copy the image chunk by chunk. - */ - while((c = buf_getbyte(src, 0)) != '\0') - { - if (buf_copy(src, dst, 1 + (size_t) c)) return 1; - } - if (buf_copy(src, dst, 1)) return 1; - - /* - * Trim and rewind the dst buffer - */ - if (NULL == (dst->buffer = (char *)realloc(dst->buffer, dst->offset))) return 1; - dst->size = dst->offset; - dst->offset = 0; - - return(0); - -} - -/********************************************************************* - * - * Function : gif_deanimate - * - * Description : Deanimate a given GIF image, i.e. given a GIF with - * an (optional) image block and an arbitrary number - * of image extension blocks, produce an output GIF with - * only one image block that contains the last image - * (extenstion) block of the original. - * Also strip Comments, Application extenstions, etc. - * - * Parameters : - * 1 : src = Pointer to the source binbuffer - * 2 : dst = Pointer to the destination binbuffer - * 3 : get_first_image = Flag: If set, get the first image - * If unset (default), get the last - * - * Returns : 0 on success, or 1 on failure - * - *********************************************************************/ -int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_image) -{ - unsigned char c; - struct binbuffer *image; - - if (NULL == src || NULL == dst) - { - return 1; - } - - c = buf_getbyte(src, 10); - - /* - * Check & copy GIF header - */ - if (strncmp(src->buffer, "GIF89a", 6) && strncmp(src->buffer, "GIF87a", 6)) - { - return 1; - } - else - { - if (buf_copy(src, dst, 13)) - { - return 1; - } - } - - /* - * Look for global colormap and copy if found. - */ - if(c & 0x80) - { - int map_length = 3 * (1 << ((c & 0x07) + 1)); - if (map_length <= 0) - { - log_error(LOG_LEVEL_DEANIMATE, - "colormap length = %d (%c)?", map_length, c); - return 1; - } - if (buf_copy(src, dst, (size_t)map_length)) - { - return 1; - } - } - - /* - * Reserve a buffer for the current image block - */ - if (NULL == (image = (struct binbuffer *)zalloc(sizeof(*image)))) - { - return 1; - } - - /* - * Parse the GIF block by block and copy the relevant - * parts to dst - */ - while(src->offset < src->size) - { - switch(buf_getbyte(src, 0)) - { - /* - * End-of-GIF Marker: Append current image and return - */ - case 0x3b: - goto write; - - /* - * Image block: Extract to current image buffer. - */ - case 0x2c: - image->offset = 0; - if (gif_extract_image(src, image)) goto failed; - if (get_first_image) goto write; - continue; - - /* - * Extension block: Look at next byte and decide - */ - case 0x21: - switch (buf_getbyte(src, 1)) - { - /* - * Image extension: Copy extension header and image - * to the current image buffer - */ - case 0xf9: - image->offset = 0; - if (buf_copy(src, image, 8) || buf_getbyte(src, 0) != 0x2c) goto failed; - if (gif_extract_image(src, image)) goto failed; - if (get_first_image) goto write; - continue; - - /* - * Application extension: Skip - */ - case 0xff: - if ((src->offset += 14) >= src->size || gif_skip_data_block(src)) goto failed; - continue; - - /* - * Comment extension: Skip - */ - case 0xfe: - if ((src->offset += 2) >= src->size || gif_skip_data_block(src)) goto failed; - continue; - - /* - * Plain text extension: Skip - */ - case 0x01: - if ((src->offset += 15) >= src->size || gif_skip_data_block(src)) goto failed; - continue; - - /* - * Ooops, what type of extension is that? - */ - default: - goto failed; - - } - - /* - * Ooops, what type of block is that? - */ - default: - goto failed; - - } - } /* -END- while src */ - - /* - * Either we got here by goto, or because the GIF is - * bogus and EOF was reached before an end-of-gif marker - * was found. - */ - -failed: - buf_free(image); - return 1; - - /* - * Append the current image to dst and return - */ - -write: - if (buf_copy(image, dst, image->size)) goto failed; - if (buf_extend(dst, 1)) goto failed; - *(dst->buffer + dst->offset++) = 0x3b; - buf_free(image); - return 0; - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/deanimate.h b/external/privoxy/deanimate.h deleted file mode 100644 index 53af6f1..0000000 --- a/external/privoxy/deanimate.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef DEANIMATE_H_INCLUDED -#define DEANIMATE_H_INCLUDED -#define DEANIMATE_H_VERSION "$Id: deanimate.h,v 1.12 2008/03/28 15:13:39 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/deanimate.h,v $ - * - * Purpose : Declares functions to manipulate binary images on the - * fly. High-level functions include: - * - Deanimation of GIF images - * - * Functions declared include: gif_deanimate and buf_free. - * - * - * Copyright : Written by and Copyright (C) 2001 - 2004 by the the - * SourceForge Privoxy team. http://www.privoxy.org/ - * - * Based on ideas from the Image::DeAnim Perl module by - * Ken MacFarlane, ksm+cpan@universal.dca.net - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: deanimate.h,v $ - * Revision 1.12 2008/03/28 15:13:39 fabiankeil - * Remove inspect-jpegs action. - * - * Revision 1.11 2007/01/12 15:41:00 fabiankeil - * Remove some white space at EOL. - * - * Revision 1.10 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.8.2.1 2004/10/03 12:53:32 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.8 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2002/03/08 17:46:04 jongfoster - * Fixing int/size_t warnings - * - * Revision 1.5 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.4 2001/07/29 18:50:04 jongfoster - * Fixing "extern C" block, and renaming #define _DEANIMATE_H - * - * Revision 1.3 2001/07/18 12:29:05 oes - * Updated prototype for gif_deanimate - * - * Revision 1.2 2001/07/13 13:46:20 oes - * Introduced GIF deanimation feature - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * A struct that holds a buffer, a read/write offset, - * and the buffer's capacity. - */ -struct binbuffer -{ - char *buffer; - size_t offset; - size_t size; -}; - -/* - * Function prototypes - */ -extern int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_image); -extern void buf_free(struct binbuffer *buf); - -/* - * Revision control strings from this header and associated .c file - */ -extern const char deanimate_rcs[]; -extern const char deanimate_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef DEANIMATE_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/default.action.master b/external/privoxy/default.action.master deleted file mode 100644 index 81c4138..0000000 --- a/external/privoxy/default.action.master +++ /dev/null @@ -1,2162 +0,0 @@ -#MASTER# COMMENT: -#MASTER# COMMENT: Anyone adding specific rules to this file, -#MASTER# COMMENT: wherever possible please include a *full* URL -#MASTER# COMMENT: which can be used to verify the problem, and if -#MASTER# COMMENT: the problem may not always be fully obvious, a -#MASTER# COMMENT: brief explanation. Please also add tests for -#MASTER# COMMENT: Privoxy-Regression-Test so we can automatically -#MASTER# COMMENT: verify that your rules are effective. Thanks. -#MASTER# COMMENT: -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/default.action.master,v $ -# -# $Id: default.action.master,v 1.170 2009/03/04 15:05:00 ler762 Exp $ -# -# Requires : This version requires Privoxy v3.0.11 or later due to -# syntax changes. -# -# Purpose : Default actions file, see -# http://www.privoxy.org/user-manual/actions-file.html. -# This file is subject to periodic updating. It is -# not supposed to be edited by the user. Local exceptions -# and enhancements are better placed in user.action, -# the match-all section has been moved to match-all.action. -# -# Copyright : Written by and Copyright (C) 2001-2009 the -# Privoxy team. http://www.privoxy.org/ -# -# Note: Updated versions of this file will be made available from time -# to time. Check http://sourceforge.net/project/showfiles.php?group_id=11118 -# for updates and/or subscribe to the announce mailing list -# (http://lists.sourceforge.net/lists/listinfo/ijbswa-announce) if you -# wish to receive an email notice whenever updates are released. -# -# 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 feedback for this actions file only through the -# SF actions file feedback tracker: -# http://sourceforge.net/tracker/?group_id=11118&atid=460288 -# * Submit bugs only through 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 possible please try the latest CVS sources. -# * Submit feature requests only through our feature request forum: -# http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=brow... -# -# 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. -# -# The current development version of this file is located: -# http://ijbswa.cvs.sourceforge.net/*checkout*/ijbswa/current/default.action.m... -# -############################################################################# -# Syntax -############################################################################# -# -# A much better explanation can be found in the user manual which is -# part of the distribution and can be found at http://www.privoxy.org/user-manual -# -# 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 this URL is incrementally updated. You can trace -# this process by visiting http://config.privoxy.org/show-url-info -# -# There are 4 types of lines in this file: comments (like this line), -# actions, aliases and patterns, all of which are explained below. -# -############################################################################# -# Pattern Syntax -############################################################################# -# -# 1. On Domains and Paths -# ----------------------- -# -# Generally, a pattern has the form <domain>/<path>, where both the <domain> -# and <path> part are optional. The pattern matching syntax is different for -# each. If you only specify a domain part, the "/" can be left out, but it is -# required for the path part. -# -# www.example.com -# is a domain-only pattern and will match any request to www.example.com -# -# www.example.com/ -# means exactly the same (but is slightly less efficient) -# -# www.example.com/index.html -# matches only the 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". -# -# 2. Domain Syntax -# ---------------- -# -# 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: -# -# www.example.com -# matches only www.example.com -# -# .example.com -# matches any domain that ENDS in .example.com -# -# www. -# matches any domain that STARTS with www. -# -# .example. -# matches any domain that CONTAINS example -# -# -# Additionally, there are wildcards that you can use in the domain names -# themselves. They work pretty similar to shell wildcards: "*" stands for -# zero or more arbitrary characters, "?" stands for one, 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 -# -# .?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 -# -# You get the idea? -# -# 2. Path Syntax -# -------------- -# -# Paths are specified as full regular expressions, and are more flexible than -# the domain syntax above. A comprehensive discussion of regular expressions -# wouldn't fit here. -# -# Perl compatible regular expressions are used. See the pcre/docs/ direcory or -# man perlre (also available at http://perldoc.perl.org/perlre.html) for -# details. The appendix to our User Manual also has some detail. -# -# 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: -# -# www.example.com/(?-i)PaTtErN.* -# will match only documents whose path starts with PaTtErN in exactly this -# capitalization. -# -# Partially case-sensitive 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 -############################################################################# -# -# There are 3 kinds of actions: -# -# Boolean (e.g. "handle-as-image"): -# +name # enable -# -name # disable -# -# Parameterized (e.g. "hide-user-agent"): -# +name{param} # enable and set parameter to "param" -# -name # disable -# -# Multi-value (e.g. "add-header", "filter"): -# +name{param} # enable and add parameter "param" -# -name{param} # remove the parameter "param" -# -name # disable totally -# -# The default (if you don't specify anything in this file) is not to take -# any actions - i.e completely disabled, so Privoxy will just be a -# normal, non-blocking, non-anonymizing proxy. You must specifically -# enable the privacy and blocking features you need (although the -# provided default actions file will do that for you). -# -# Later actions always override earlier ones. For multi-valued actions, -# the actions are applied in the order they are specified. -# -############################################################################# -# Valid actions are: -############################################################################# -# -# +add-header{Name: value} -# Adds the specified HTTP header, which is not checked for validity. -# You may specify this many times to specify many headers. -# -# +block{reason} -# Block this URL. Instead of forwarding the request, Privoxy will -# send a "block" page containing the specified reason. -# -# +change-x-forwarded-for{add} -# +change-x-forwarded-for{block} -# Adds or blocks the "X-Forwarded-For:" HTTP header in client -# requests. -# -# +client-header-filter{name} -# All client headers to which this action applies are filtered on-the-fly -# through the specified regular expression based substitutions. -# -# Client-header filters predefined in the supplied default.filter include: -# -# hide-tor-exit-notation: Removes the Tor exit node notation in Host and Referer headers. -# privoxy-control: Removes X-Privoxy-Control headers. -# -# +client-header-tagger{string} -# Tag requests based on their headers. Client headers to which this -# action applies are filtered on-the-fly through the specified regular -# expression based substitutions, the result is used as a tag. -# Client-header taggers are the first actions that are executed and their -# tags can be used to control every other action. -# -# Client-header taggers predefined in the supplied default.filter include: -# -# image-requests: Tags detected image requests as "IMAGE-REQUEST". -# css-requests: Tags detected CSS requests as "CSS-REQUEST". -# client-ip-address: Tags the request with the client's IP address. -# http-method: Tags the request with its HTTP method. -# allow-post: Tags POST requests as "ALLOWED-POST". -# complete-url: Tags the request with the whole request URL. -# user-agent: Tags the request with the complete User-Agent header. -# privoxy-control: Creates tags with the content of X-Privoxy-Control headers. -# -# +content-type-overwrite -# Replaces the "Content-Type:" HTTP server header, so that unwanted -# download menus will not pop up, or changes the browser's rendering mode. -# -# +crunch-client-header{string} -# Deletes every header sent by the client that contains the string the -# user supplied as parameter. -# -# +crunch-if-none-match -# Deletes the "If-None-Match:" HTTP client header. -# -# +crunch-server-header{string} -# Deletes every header sent by the server that contains the string the -# user supplied as a parameter. -# -# +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-http-version -# 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 currently can't handle yet. -# -# +fast-redirects{check-decoded-url} -# +fast-redirects{simple-check} -# 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 asks the server for one redirect -# after the other. Plus, it feeds the advertisers. -# -# The +fast-redirects{check-decoded-url} 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 intermediate sites. NOTE: Syntax change as of v.3.0.4. -# -# +filter{name} -# All files of text-based type, most notably HTML and JavaScript, to which -# this action applies, can be filtered on-the-fly through the specified -# regular expression based substitutions. (Note: plain text documents are -# exempted from filtering, because web servers often use the text/plain -# MIME type for all files whose type they don't know.) By default, -# filtering works only on the raw document content itself (that which can -# be seen with View Source), not the headers. Repeat for multiple filters. -# Use with caution: filters can be very intrusive. -# -# Filters predefined in the supplied default.filter include: -# -# js-annoyances: Get rid of particularly annoying JavaScript abuse. -# js-events: Kill all JS event bindings and timers (Radically destructive! Only for extra nasty sites). -# html-annoyances: Get rid of particularly annoying HTML abuse. -# content-cookies: Kill cookies that come in the HTML or JS content. -# refresh-tags: Kill automatic refresh tags (for dial-on-demand setups). -# unsolicited-popups: Disable only unsolicited pop-up windows. -# all-popups: Kill all popups in JavaScript and HTML. -# img-reorder: Reorder attributes in <img> tags to make the banners-by-* filters more effective. -# banners-by-size: Kill banners by size. -# banners-by-link: Kill banners by their links to known clicktrackers. -# webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking). -# tiny-textforms: Extend those tiny textareas up to 40x80 and kill the hard wrap. -# jumping-windows: Prevent windows from resizing and moving themselves. -# frameset-borders: Give frames a border and make them resizable. -# demoronizer: Fix MS's non-standard use of standard charsets. -# shockwave-flash: Kill embedded Shockwave Flash objects. -# quicktime-kioskmode: Make Quicktime movies saveable. -# fun: Text replacements for subversive browsing fun! -# crude-parental: Crude parental filtering. Note that this filter doesn't work reliably. -# ie-exploits: Disable some known Internet Explorer bug exploits. -# site-specifics: Cure for site-specific problems. Don't apply generally! -# no-ping: Removes non-standard ping attributes in <a> and <area> tags. -# google: CSS-based block for Google text ads. Also removes a width limitation and the toolbar advertisement. -# yahoo: CSS-based block for Yahoo text ads. Also removes a width limitation. -# msn: CSS-based block for MSN text ads. Also removes tracking URLs and a width limitation. -# blogspot: Cleans up some Blogspot blogs. Read the fine print before using this. -# -# +force-text-mode -# Declares a document as plain text, even if the "Content-Type:" isn't detected -# as such. -# -# +forward-override{forward .} -# +forward-override{forward 127.0.0.1:8123} -# +forward-override{forward-socks4a 127.0.0.1:9050 .} -# +forward-override{forward-socks4a 127.0.0.1:9050 proxy.example.org:8000} -# +forward-override{forward-socks5 127.0.0.1:9050 .} -# +forward-override{forward-socks5 127.0.0.1:9050 proxy.example.org:8000} -# This action overrules the forward directives in the configuration file. -# -# +handle-as-empty-document -# This action alone doesn't do anything noticeable. It just marks URLs. If -# the block action also applies, the presence or absence of this mark -# decides whether an HTML "blocked" page, or an empty document will be sent -# to the client as a substitute for the blocked content. -# -# +handle-as-image -# 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 +set-image-blocker{} for the control over what is actually sent. -# -# +hide-accept-language{lang} -# +hide-accept-language{block} -# Deletes or replaces the "Accept-Language:" HTTP header in client -# requests. -# -# +hide-content-disposition{block} -# +hide-content-disposition{string} -# Deletes or replaces the "Content-Disposition:" HTTP header set by some -# servers. This can be used to prevent download menus for content you -# prefer to view inside the browser, for example. -# -# +hide-from-header{block} -# +hide-from-header{spam@sittingduck.xqq} -# If the browser sends a "From:" header containing your e-mail address, -# either completely removes the header ("block"), or change it to the -# specified e-mail address. -# -# +hide-if-modified-since{block} -# +hide-if-modified-since{-60} -# Deletes the "If-Modified-Since:" HTTP client header or modifies its -# value, preventing another way to track users. -# -# +hide-referer{block} -# +hide-referer{forge} -# +hide-referer{http://nowhere.com%7D -# 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. -# -# +hide-referrer{...} -# Alternative spelling of +hide-referer. 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 spelt "referer"). -# -# +hide-user-agent{browser-type} -# Change the "User-Agent:" header so web servers can't tell your -# browser type. (Breaks many web sites). Specify the user-agent -# value you want - e.g., to pretend to be using Netscape on Linux: -# +hide-user-agent{Mozilla (X11; I; Linux 2.0.32 i586)} -# Or to identify yourself explicitly as a Privoxy user: -# +hide-user-agent{Privoxy/1.0} -# (Don't change the version number from 1.0 - after all, why tell them?) -# -# +limit-connect{portlist} -# -# By default, i.e. if no limit-connect action applies, Privoxy -# allows HTTP CONNECT requests to all ports. Use limit-connect -# if fine-grained control is desired for some or all destinations. -# 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 server. This means -# CONNECT-enabled proxies can be used as TCP relays very easily. Privoxy -# relays HTTPS traffic without seeing the decoded content. Websites can -# leverage this limitation to circumvent Privoxy's filters. By specifying -# an invalid port range you can disable HTTPS entirely. -# -# +limit-connect{443} # Only port 443 is OK. -# +limit-connect{80,443} # Ports 80 and 443 are OK. -# +limit-connect{-3, 7, 20-100, 500-} # Ports less than 3, 7, 20 to 100 and above 500 are OK. -# +limit-connect{-} # All ports are OK -# +limit-connect{,} # No HTTPS/SSL traffic is allowed -# -# +overwrite-last-modified{block} -# +overwrite-last-modified{reset-to-request-time} -# +overwrite-last-modified{randomize} -# Removing the "Last-Modified:" header is useful for filter testing, where -# you want to force a real reload instead of getting status code "304", -# which would cause the browser to reuse the old version of the page. -# -# The "randomize" option overwrites the value of the "Last-Modified:" -# header with a randomly chosen time between the original value and the -# current time. In theory the server could send each document with a -# different "Last-Modified:" header to track visits without using cookies. -# "Randomize" makes it impossible and the browser can still revalidate -# cached documents. -# -# "reset-to-request-time" overwrites the value of the "Last-Modified:" -# header with the current time. You could use this option together with -# hide-if-modified-since to further customize your random range. -# -# +prevent-compression -# Prevent the website from compressing the data. Some websites do -# that, which is a problem for Privoxy when built without zlib support, -# since +filter and +gif-deanimate will not work on compressed data. -# Will slow down connections to those websites, though. -# -# +server-header-filter{name} -# All server headers to which this action applies are filtered on-the-fly -# through the specified regular expression based substitutions. -# -# Server-header filters predefined in the supplied default.filter include: -# -# x-httpd-php-to-html: Changes the Content-Type header from x-httpd-php to html. -# html-to-xml: Changes the Content-Type header from html to xml. -# xml-to-html: Changes the Content-Type header from xml to html. -# less-download-windows: Prevent annoying download windows for content types the browser can handle itself. -# privoxy-control: Removes X-Privoxy-Control headers. -# -# +server-header-tagger{content-type} -# Server headers to which this action applies are filtered on-the-fly -# through the specified regular expression based substitutions, the result -# is used as a tag. Server-header taggers are executed before all other -# header actions that modify server headers. Their tags can be used to -# control all of the other server-header actions, the content filters and -# the crunch actions (redirect and block). -# -# Server-header taggers predefined in the supplied default.filter include: -# -# content-type: Tags the request with the content type declared by the server. -# privoxy-control: Creates tags with the content of X-Privoxy-Control headers. -# -# +session-cookies-only -# 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. -# -# +set-image-blocker{blank} -# +set-image-blocker{pattern} -# +set-image-blocker{<URL>} with <url> being any valid image URL -# Decides what to do with URLs that end up tagged with {+block +handle-as-image}. -# There are 4 options: -# * "-set-image-blocker" will send a HTML "blocked" page, usually -# resulting in a "broken image" icon. -# * "+set-image-blocker{blank}" will send a 1x1 transparent image -# * "+set-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. -# * "+set-image-blocker{<URL>}" will send a HTTP temporary redirect -# to the specified image URL. -# -# -# +crunch-outgoing-cookies -# Prevent the website from reading cookies -# -# +crunch-incoming-cookies -# Prevent the website from setting cookies -# -# +redirect{<URL>} -# +redirect{<pcrs command>} -# Convinces the browser that the requested document has been moved to -# another location and the browser should get it from the specified -# URL. -# -############################################################################# - -############################################################################# -# Settings -- Don't change. -############################################################################# -{{settings}} -############################################################################# -#MASTER# COMMENT: The minimum Privoxy version: -for-privoxy-version=3.0.11 - -############################################################################# -# Aliases -############################################################################# -{{alias}} -############################################################################# -# -# You can define a short form for a list of permissions - e.g., instead -# of "-crunch-incoming-cookies -crunch-outgoing-cookies -filter -fast-redirects", -# you can just write "shop". This is called an alias. -# -# 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. -# -# Aliases beginning with '+' or '-' may be used for system action names -# in future releases - so try to avoid alias names like this. (e.g. -# "+crunch-all-cookies" below is not a good name) -# -# Aliases must be defined before they are used. -# - -# These aliases just save typing later: -# -+crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies --crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies - allow-all-cookies = -crunch-all-cookies -session-cookies-only - allow-popups = -filter{all-popups} -filter{unsolicited-popups} -+block-as-image = +block{Blocked image request.} +handle-as-image --block-as-image = -block - -# These aliases define combinations of actions -# that are useful for certain types of sites: -# -fragile = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -prevent-compression -shop = -crunch-all-cookies allow-popups - -# Your favourite blend of filters: -# -myfilters = +filter{html-annoyances} +filter{js-annoyances} +filter{all-popups}\ - +filter{webbugs} +filter{banners-by-size} - -# Allow ads for selected useful free sites: -# -allow-ads = -block -filter{banners-by-size} -filter{banners-by-link} - -################ -# -# Cautious settings -- safe for all sites, but offer little privacy protection -# -{ \ -+change-x-forwarded-for{block} \ -+hide-from-header{block} \ -+set-image-blocker{pattern} \ -} -standard.Cautious - -################ -# -# Medium settings -- safe for most sites, with reasonable protection/damage tradeoff -# -{ \ -+change-x-forwarded-for{block} \ -+deanimate-gifs{last} \ -+filter{refresh-tags} \ -+filter{img-reorder} \ -+filter{banners-by-size} \ -+filter{webbugs} \ -+filter{jumping-windows} \ -+filter{ie-exploits} \ -+hide-from-header{block} \ -+hide-referrer{conditional-block} \ -+session-cookies-only \ -+set-image-blocker{pattern} \ -} -standard.Medium - -################ -# -# Advanced settings -- reasonable privacy protection but -# require some exceptions for trusted sites, most likely -# because of cookies or SSL. Also testing ground for -# new options. -# -# CAUTION: These settings can still be subverted by a -# misconfigured client that executes code from untrusted -# sources. -# -{ \ -+change-x-forwarded-for{block} \ -+client-header-tagger{css-requests} \ -+client-header-tagger{image-requests} \ -+crunch-if-none-match \ -+crunch-outgoing-cookies \ -+crunch-incoming-cookies \ -+deanimate-gifs{last} \ -+fast-redirects{check-decoded-url} \ -+filter{html-annoyances} \ -+filter{content-cookies} \ -+filter{refresh-tags} \ -+filter{img-reorder} \ -+filter{banners-by-size} \ -+filter{banners-by-link} \ -+filter{webbugs} \ -+filter{jumping-windows} \ -+filter{frameset-borders} \ -+filter{quicktime-kioskmode} \ -+hide-if-modified-since{-60} \ -+hide-from-header{block} \ -+hide-referrer{conditional-block} \ -+limit-connect{,} \ -+overwrite-last-modified{randomize} \ -+set-image-blocker{pattern} \ -} -standard.Advanced - -############################################################################# -# These extensions belong to images: -############################################################################# -{+handle-as-image -filter} -############################################################################# -/.*.(gif|jpe?g|png|bmp|ico)($|?) - -############################################################################# -# These don't: -############################################################################# -{-handle-as-image} -/.*.(js|php|css|.?html?) - -############################################################################# -# Generic block patterns by host: -############################################################################# -{+block{Host matches generic block pattern.}} -ad*. -.*ads. -#MASTER# REMARKS: removed .ad. 2007-12-18 HB -#MASTER# REMARKS: Modifications per Actionsfile feedback item #1807613 -.ad.?. -.ad.[a-ik-z][a-oq-z]. -.ad.jp.*. -.ad.???*. -# Blocked URL = http://alternativos.iw-advertising.com/ -.*advert*. -*banner*. -count*. -*counter. -#MASTER# PROBLEM URL: http://www.newegg.com -promotions. -#MASTER# BLOCK-REFERRER: http://tech.cybernetnews.com/ -# Blocked URL = http://metrics.performancing.com/ -metrics. - -############################################################################# -# Generic unblockers by host: -############################################################################# -{-block} -adsl. -ad[udmw]*. -adbl*. -adam*. -adapt*. -adob*. -adrenaline. -adtp*. -adv[oia]*. -adventure*. -.*road*. -.olympiad*. -.*load*. -.*[epu]ad*. -county*. -countr*. - -############################################################################# -# Generic block patterns by path: -############################################################################# -{+block{Path matches generic block pattern.}} -/(.*/)?ad(?|/|s|v|_?(image|se?rv|box)|cycle|rotate|mentor|click|f[ra]m|script|stream|fetch|log|space) -# Blocked URL = http://www.example.org/adimage -# Blocked URL = http://www.example.org/adspace -/phpads(new)?/ -/(.*/)?(ad|all|nn|db|promo(tion)?)?[-_]?banner -/(.*/)?(publicite|werbung|rekla(me|am)|annonse|maino(kset|nta|s)?/) -/.*(count|track|compteur|(?<!relo)adframe|adse?rve?|banner)(er|run)?(?|.(pl|cgi|exe|dll|asp|php|cpt)) -/(.*/)?clicktrack -/(.*/)?(full)?pop[-_]?(up|over|under|open(er)?)?s?(/|.) -/(.*/)?((flash)?pop|live(cnt|count(er)?)).*.(js|php|cgi) - -############################################################################# -# Generic unblockers by path: -############################################################################# -{-block} -# Sticky Actions = -block -/.*ad(sl|v(i[cs]|o|an|ertencia|ent|.*search|erse)) # advice/advisories/advan*/advertencia (spanish) adverse -/.*(lo|thre|he|d|gr|l|ro|re|squ|class(ified)?)ads -/.*account -support./(.*/)?track - -############################################################################# -# Exceptions for academia and non-profits -############################################################################# -.edu -.ac.*/ -.uni-*.de -.tu-*.de -.gov -.hs-*.de -.fh-*.de -#MASTER# REMARKS: Try to avoid harmless names in non-commercial organizations. Added 10/24/06 -# URL = http://www.gnu.org/graphics/gnu-head-banner.png -.org/.*(image|banner) - -############################################################################# -# Catch-all for false-positives that are just TOO obvious to let go -############################################################################# -{+block{Catch-all block for false-positives.}} -#MASTER# REMARKS: Going for adsrv, adserve, adserver*. -.ads[erv][rv]*. -# Blocked URL = http://ads.facebook.com/ads/spreadshirt/banner120x600.jpg -.ads. -/(.*/)?ad(se?rv|click|stream|image|log|farm|script) -# Blocked URL = http://www.torrentportal.com/topad.html -#MASTER# REMARKS: Action tracker 1637648 and a bit of imagination. Added 2007-01-20. -#MASTER# REMARKS: Added "text" 20070730 as per http://www.pcworld.com/textad?Keywords=System Resources Tune-Up.&type=pcworld_downloads_search&count=3&ord=906010128&serveUrl=http%3A%2F%2Fwww.pcworld.com%2Fdownloads%2Ffile%2Ffid%2C7661-order%2C1-page%2C1-c%2Csystemresourcestuneup%2Fdescription.html Adam Piggott -/.*(top|bottom|left|right|text)_?ad - -############################################################################# -# Site-specific block patterns; -############################################################################# -{+block{Domain parking site}} -#MASTER# BLOCK-REFERRER: http://www.inetcat.org -# Blocked URL = http://www.sedoparking.com/www.inetcat.org -.sedoparking.com/ -# Blocked URL = http://landing.trafficz.com/index.php?domain=www.inetcat.org -landing.trafficz.com/ -# Blocked URL = http://www.searchnut.com/?domain=www.inetcat.org -.searchnut.com/?domain - -{+block{Site-specific block pattern matches.}} -#MASTER# BLOCK-REFERRER: http://www.brooksbrothers.com/ 10/18/06 -#MASTER# BLOCK-REFERRER: http://www.autodesk.com/ -# Blocked URL = http://www.hitbox.com/foobar -.hitbox.com -#MASTER# BLOCK-REFERRER: http://www.the-gadgeteer.com/palmos.html 10/18/06 -# Blocked URL = http://www..the-gadgeteer.com/cgi-bin/getimage.cgi/ -.the-gadgeteer.com/cgi-bin/getimage.cgi/ -#MASTER# BLOCK-REFERRER: http://dest.travelocity.com/DestGuides/geo_frontdoor/0,,TRAVELOCITY,00.html?... -# Blocked URL = http://dest.travelocity.com/website/destinations/images/partner_frommers.gif -# Blocked URL = http://dest.travelocity.com/website/destinations/images/travelex_logo.gif -dest.travelocity.com/website/destinations/images/partner_frommers.gif -dest.travelocity.com/website/destinations/images/travelex_logo.gif -#MASTER# BLOCK-REFERRER: http://us.imdb.com/Title?0110912 10/18/06 -#MASTER# BLOCK-REFERRER: http://www.imdb.com/help/boards/markup -#MASTER# REMARKS: 2nd is for emoticons exception -i.imdb.com/Photos/CMSIcons/(?!buttons|emoticons) -rcm.amazon.com -#MASTER# BLOCK-REFERRER: http://www.nytimes.com/ 10/18/06 -# Blocked URL = http://www.nytimes.com/adx/foo -.nytimes.com/adx/ -#MASTER# BLOCK-REFERRER: http://www.sharereactor.com/ 10/19/06 -#MASTER# BLOCK-REFERRER: http://www.popupad.net/ -#www.popupad.net/ats/ -.adtrak.net -.elitemediagroup.net -.popuptraffic.com -#MASTER# BLOCK-REFERRER: http://www.famousbabes.com/gabrielleR/grpics1.htm 10/19/06 -#MASTER# BLOCK-REFERRER: http://www.hit-now.com/ -.hit-now.com -#MASTER# BLOCK-REFERRER: http://www.pgpi.org/ 10/18/06 -[a-v]*.valueclick.com -#MASTER# BLOCK-REFERRER: http://astalavista.box.sk/ -#MASTER# REMARKS: Yea, all these at one site! 10/19/06 -.cpays.com -.oxado.com -.adult*finder.com -#MASTER# DONT-VERIFY: Opera's list of banners to load (XML) -/scripts/cms/xcms.asp -#MASTER# REMARKS: Actionsfile tracker 1559740 09/16/06 See http://www.vibrantmedia.com/whatisIntelliTXT.asp -#MASTER# BLOCK-REFERRER: http://www.hartware.de/news_40795.html -/.*intellitxt/ -.intellitxt.com -#MASTER# REMARKS: per Actions File tracker: #1597893 11/17/06, similar to intellitxt -.kontera.com -#MASTER# REMARKS: 2007-08-17 HB, similar to intellitxt -#MASTER# BLOCK-REFERRER: http://www.webhostingtalk.com/archive/index.php/t-533369.html -.tribalfusion.com/ctxt -#MASTER# REMARKS: Video advertizer, owned by doubleclick.net. -#MASTER# BLOCK-REFERRER: http://www.ign.com/ 09/17/06 -.klipmart.com -#MASTER# BLOCK-REFERRER: http://gamespot.com 09/26/06 -#MASTER# REMARKS: adlog.com.com and ads.com.com -ad*.com.com -#MASTER# REMARKS: used in redirects: dw.com.com 12/18/06 -#MASTER# BLOCK-REFERRER: http://verizon.net 09/29/06 -sales.liveperson.net -#MASTER# BLOCK-REFERRER: www.avclub.com/ 10/14/06 -.iad.liveperson.net -#MASTER# BLOCK-REFERRER: http://homedepot.com 09/29/06 -#MASTER# BLOCK-REFERRER: http://weather.com 11/03/06 -.coremetrics.com/ -#MASTER# BLOCK-REFERRER: http://wired.com 09/29/06 -.realmedia.com/data/ -#MASTER# REMARKS: webbugs, ads and user tracking js in many places. -#MASTER# BLOCK-REFERRER: http://washingtonpost.com & http://tomshardware.com 09/29/06 -.revsci.net -#MASTER# BLOCK-REFERRER: http://www.time.com/time/business/article/0,8599,1073341,00.html 09/29/06 -.clickability.com -/.*clickability(.com)?/ -#MASTER# BLOCK-REFERRER: http://washingtonpost.com 09/29/06 -stats.*.ihost.com -#MASTER# BLOCK-REFERRER: http://msnbc.com and many others 09/29/06 -.2o7.net -#MASTER# BLOCK-REFERRER: http://microsoft.com 09/29/06 -.webtrends.com -#MASTER# BLOCK-REFERRER: http://tomshardware.com 09/29/06 -.tacoda. -#MASTER# BLOCK-REFERRER: http://www.torrentazos.com 10/04/06 -ad.theadhost.com -#MASTER# BLOCK-REFERRER: http://www.stuff.co.nz 10/06/06 -.adbureau.net -#MASTER# BLOCK-REFERRER: http://drudgereport.com 10/06/06 -.adgardener.com -#MASTER# BLOCK-REFERRER: http://www.connected-media.com/riven/hints.htm 10/14/06 -#MASTER# REMARKS: ads.kw.revenue.net/? etc -.revenue.net -#MASTER# BLOCK-REFERRER: http://www.geocities.com/the_sockman1/index.html 10/15/06 -#MASTER# REMARKS: ..and any other page on geocities. Source of the obnoxious Geocities drop-in menu. -.geocities.com/js_source -#MASTER# BLOCK-REFERRER: http://www.google.com 09/28/06 -.dartsearch.net -#MASTER# BLOCK-REFERRER: http://wunderground.com 11/02/06 -.zedo.com -#MASTER# BLOCK-REFERRER: http://realtor.org 11/03/06 -.trk.sodoit.com/ -#MASTER# BLOCK-REFERRER: http://www.freenews.fr 11/23/06 Actionsfile feedback item #1597034 -.espace.netavenir.com -#MASTER# BLOCK-REFERRER: http://www.powerdvd.com/ 12/28/06 -.hitfarm.com -#MASTER# BLOCK-REFERRER: http://www.uk-businessdirectory.co.uk/ -#MASTER# REMARKS: Action tracker 1616457. Added 2007-01-20. -.topnemo.com/engine -.top100categories.com/engine -#MASTER# REMARKS: Actionsfile feedback item #1647852 2007-01-30 -#MASTER# REMARKS: Domain squatting onload pop-ups -#MASTER# BLOCK-REFERRER: http://www.memtest.com/ -/(t|search).php?uid=ws[a-z0-9]+.[a-z0-9]+ -#MASTER# BLOCK-REFERRER: via Yahoo groups -#MASTER# REMARKS: Actionsfile tracker 1645513 2007-01-26 -.adinterax.com/(?!(.*).(js|gif|jpg)) -#MASTER# BLOCK-REFERRER: http://www.weilpod.com -#MASTER# REMARKS: Actionsfile feedback item #1710951 2007-05-02 -img.bluehost.com -#MASTER# BLOCK-REFERRER: http://www.linuxinsider.com/story/57759.html -#MASTER# REMARKS: Actionsfile feedback item #1736213 at 2007-06-12 -linuxinsider.com/images/sda/ -#MASTER# REMARKS: 20070711 Adam Piggott Actionsfile feedback #1700692 -#MASTER# REMARKS: Tracking JavaScript -#MASTER# BLOCK-REFERRER: http://www.hants.gov.uk/record-office/ -[a-z].clickdensity.com -#MASTER# REMARKS: Obnoxious "widget" adverts -#MASTER# BLOCK-REFERRER: http://www.quickonlinetips.com/archives/2007/08/nokia-offers-free-bl-5c-batt... -.widgetbucks.com -#MASTER# BLOCK-REFERRER: http://www.dailymail.co.uk/pages/live/articles/news/news.html?in_article_id=... -# Blocked URL = http://img.dailymail.co.uk/i/promo_boxes/groTime_promo.jpg -# Blocked URL = http://img.dailymail.co.uk/i/promo_boxes/idealhome_promo.gif -img.dailymail.co.uk/i/promo_boxes/ -#MASTER# REMARKS: Flash ad, Actionsfile feedback item #2003465 2008-07-01 -# Blocked URL = http://cache.opt.fimserve.com/contents/325/84/84325/LIN728x90.swf?%20%20%20%... -.fimserve.com -#MASTER# REMARKS: Actionsfile feedback item #2004311 2008-07-01, are they all images? -# Blocked URL = http://static.lycos-europe.net/lea/se/pricerunner/040608_728x90_payback_digi... -static.lycos-europe.net -#MASTER# REMARKS: Actionsfile feedback item #2005285 -#MASTER# BLOCK-REFERRER: http://hitta.se -# Blocked URL = http://82.99.18.195/media.1/112/9460/146016/150x175_Hitta_FV_Feb08.gif -82.99.18.195 -#MASTER# REMARKS: Actionsfile feedback item #1888197 2008-02-06 -#MASTER# REMARKS: Have a "go there anyway" link for clk.atdmt.com -#MASTER# BLOCK-REFERRER: http://www.networkworld.com/resourcelibrary/?tid=4&type=special%20report -# Blocked URL = http://clk.atdmt.com/ -.atdmt.com/ - -#---------------------------------------------------------------------------- -# Misc Web-bugs, JS and just plain Junk. Images here aren't normal images. -#---------------------------------------------------------------------------- -{+block{Might be a web-bug.} +handle-as-empty-document -handle-as-image} -#MASTER# REMARKS: signature for user tracking nytimes, cnn.com,latimes.com and many others. 10/06/06 -/b/ss/.+ -#MASTER# BLOCK-REFERRER: http://www.thesun.co.uk/article/0,,11071-10784,00.html -#MASTER# REMARKS: widespread hitbox signature 10/06/06 -/HG?hc= -#MASTER# BLOCK-REFERRER: http://macaddict.com 10/06/06 -.visistat.com -#MASTER# REMARKS: See http://www.google.com/analytics/ for user tracking. -#MASTER# REMARKS: There is a ssl.google-analytics as well. -.google-analytics./ -#MASTER# BLOCK-REFERRER: http://versiontracker.com and many others. 10/20/06 -/(.*/)?__utm.gif? -#MASTER# REMARKS: Below Moved here from -handle-as-image 10/16/06 ########## -#MASTER# BLOCK-REFERRER: http://forums2.gardenweb.com/forums/orchids/ 09/25/06 -#MASTER# REMARKS: Mostly JS and plain text stuff -.overture. -#MASTER# PROBLEM-URL: http://www.linuxtoday.com/ -#MASTER# REMARKS: /adi has HTML snipplets for use in IFRAMEs 10/15/06 -.doubleclick.net/adi -.doubleclick.net/(.*/)?adj/ -#MASTER# PROBLEM-URL: http://maps.yahoo.com/ -#MASTER# REMARKS: /AVE/iview has HTML snipplets for use in IFRAMEs 10/15/06 -view.atdmt.com/(.*/)?iview/ -#MASTER# REMARKS: Above Moved here from -handle-as-image 10/16/06 ########## -#MASTER# REMARKS: Generic, re: tracking.foxnews.com/HG? 10/01/06 -tracking. -#MASTER# BLOCK-REFERRER: http://netcraft.com and many others 10/22/06 -/(.*/)?adjs.php? -#MASTER# BLOCK-REFERRER: http://washingpost.com and others 10/25/06 -/.*.gif?D=DM -#MASTER# BLOCK-REFERRER: http://www.washingtonpost.com/ -#stats.surfaid.ihost.com/(crc/)?images/(bounce/)?uc.GIF -#MASTER# BLOCK-REFERRER: http://www.ibm.com 10/09/06 -#MASTER# REMARKS: Similar hostname and paths appear in multiple locations. -# Blocked URL = http://stats.surfaid.ihost.com/crc/images/bounce/uc.GIF -# Blocked URL = http://stats.surfaid.ihost.com/rc/images/bounce/uc.GIF -stats./c?rc/.*/uc.gif -#MASTER# BLOCK-REFERRER: http://priceline.com 10/20/06 -#MASTER# REMARKS: User tracking, webbug stuff -/(.*/)?dcs.gif?&?dcs -#MASTER# BLOCK-REFERRER: http://www.msnbc.com 10/07/06 -#MASTER# REMARKS: And MANY others. Webbug stuff. -/(.*/)?c(lear)?.gif?. -#MASTER# BLOCK-REFERRER: http://www.investorguide.com 10/08/06 -#MASTER# BLOCK-REFERRER: http://foodnetwork.com, http://gardenweb.com 10/20/06 -#MASTER# REMARK: webbug type gif used in MANY places. -#MASTER# REMARK: Too many false positives -#/(.*/)?(clear|(trans_?1x|blank)?1).gif -#MASTER# REMARK: Let's try this way. -/(.*/)?(clear|blank|(trans_?|1x)?1).gif?. -#MASTER# BLOCK-REFERRER: http://groups.yahoo.com/group/epdf/ 10/08/06 -.bc.yahoo.com/b?P= -#MASTER# BLOCK-REFERRER: http://www.motherboard.cz 10/30/06 -x*.alexa.com -#MASTER# BLOCK-REFERRER: http://actorstheatre.org 11/02/06 -stats./.*.gif? -#MASTER# BLOCK-REFERRER: http://mplayernetwork.com 11/07/06 -#MASTER# BLOCK-REFERRER: http://eetimes.com 09/26/06 -/event.ng/ -#MASTER# BLOCK-REFERRER: http://www.homedepot.com/ 11/08/06 -#MASTER# BLOCK-REFERRER: http://www.williams-sonoma.com/ 11/08/06 -/cm?[tc] -#MASTER# BLOCK-REFERRER: http://www.snapfiles.com/feedback/ 12/13/06 SF tracker -.snapfiles.net/rotation/.*.asp -#MASTER# BLOCK-REFERRER: not provided. SF tracker #1616034 12/16/06 -#MASTER# COMMENT: JS pop-ups -spa.snap.com/ -#MASTER# BLOCK-REFERRER: http://www.gamefaqs.com/computer/doswin/game/914819.html 12/18/06 -#MASTER# COMMENT: user tracking, and run-away assorted 'junk' -#MASTER# BLOCK-REFERRER: http://formwood.com 2007-11-12 -.insitemetrics.com/ -#MASTER# COMMENT: user tracking, and assorted 'junk' -#MASTER# BLOCK-REFERRER: http://blogblog.com 2007-11-12 -.extreme-dm.com/ -#MASTER# COMMENT: user tracking, and assorted 'junk' -#MASTER# BLOCK-REFERRER: http://www.schillmania.com 2007-11-12 -stats.reinvigorate.net/ -#MASTER# COMMENT: user tracking, and assorted 'junk' -#MASTER# BLOCK-REFERRER: http://wordpress.com 2007-11-12 -.getclicky.com/ -#MASTER# COMMENT: user tracking, and assorted 'junk' -#MASTER# BLOCK-REFERRER: http://infoworld.com 2007-11-12 -.quantserve.com -# Blocked URL = http://media.adrevolver.com/adrevolver/trace?sip=123&cpy=123 -media.adrevolver.com/ - -#---------------------------------------------------------------------------- -# JavaScripts and Texts for ad and popup generation -#---------------------------------------------------------------------------- -#MASTER# BLOCK-REFERRER: http://www.chip.de/artikel/c_artikelunterseite_10423683.html -# Blocked URL = http://pagead.googlesyndication.example.com/foo/bar/baz.js -pagead*.googlesyndication./.*.js -#MASTER# REMARKS: broadening scope from a.tfag.de/js.ng/ 10/23/06 -# Blocked URL = http://a.tfag.de/js.ng/ -/js.ng/ -#MASTER# BLOCK-REFERRER: http://www.britannica.com/ 10/23/06 -/popunder -#MASTER# BLOCK-REFERRER: http://www.pcmag.com/ 11/22/06 per SF Tracker # 1601148 -/js/slider.js -#MASTER# BLOCK-REFERRER: http://www.earthcore.com/ feedback item #1605385 12/14/06 -/t.php?cat=.*&kw=.*&sc= -#MASTER# BLOCK-REFERRER: http://floodle.net 2007-01-21 SF tracker -scripts.chitika.net/.*.js -#MASTER# REMARKS: Actionsfile tracker #1674363 2007-03-05, text ads -#MASTER# BLOCK-REFERRER: http://www.securityfocus.com/archive/1/461489/30/0/threaded -jlinks.industrybrains.com/ -#MASTER# BLOCK-REFERRER: via Yahoo groups -#MASTER# REMARKS: Actionsfile tracker 1645513 2007-01-26 -.adinterax.com/.*.js -#MASTER# BLOCK-REFERRER: http://dictionary.reference.com/search?q=privacy&db=* -#MASTER# REMARKS: Actionsfile tracker 1650798 2007-02-02 -.googleadservices.com/gampad/.*.js -#MASTER# BLOCK-REFERRER: http://www.linuxworld.com/news/2007/061307-brian-aker-interview.html -#MASTER# REMARKS: Actionsfile feedback item #1736794 2007-06-13 -js.adsonar. -#MASTER# BLOCK-REFERRER: http://news.zdnet.co.uk/software/0,1000000121,39209666,00.htm -#MASTER# REMARKS: Actionsfile feedback item #1736879 2007-06-13, sponsored links. 2007-08-02, more hosts using this scheme, broadening scope. -#bwp.zdnet. -bwp. -# Blocked URL = http://us.mc123.mail.yahoo.com/mc/stampNonJs -.yahoo.com/mc/stampNonJs -# Blocked URL = http://richmedia.yimg.com/js/123/personnals_banners/PER_happy_sara1_4_425x60... -/.*/ad.js? -# Blocked URL = http://ad.yieldmanager.com/st?ad_type=iframe&ad_size=728x90&site=123... -/.*?ad_(type|size)= - -############################################################################# -# Generic block-as-image patterns: -############################################################################# -{+block-as-image} -# XXX: Should use "+block{Blocked image request.}", but Privoxy-Regression-Test -# isn't smart enough to split that properly. -# Sticky Actions = +block +handle-as-image -#MASTER# BLOCK-REFERRER: http://experts-exchange.com/os2gen/ -/.*ad_?image.(php|cgi) -#MASTER# BLOCK-REFERRER: http://flashhentai.com/Tgp/28-09-2002/index4.html -#MASTER# BLOCK-REFERRER: http://www.thughosting.com/www/ixix/a912/912s2.html -#MASTER# BLOCK-REFERRER: http://www.fantasiegirl.com/cumshots/3/spunkpatrolgirl302.htm -#MASTER# BLOCK-REFERRER: http://www.asianuncut.com/asian2/sep5628.html -#MASTER# BLOCK-REFERRER: http://www.tatgirls.com/gals/redhot-2/kitty-carl/lb10.html -#MASTER# BLOCK-REFERRER: http://www.cream-porn.com/1/hard/29/02.html -/.*recips?/ -#MASTER# BLOCK-REFERRER: http://www.paroles.net/texte/10818 -/bandeaux/ -#MASTER# COMMENT: SF tracker 09/15/06 -/.*client_?ad.(php|cgi) -#MASTER# COMMENT: SF tracker 09/15/06 -/.*AIM_UAC.adp -#MASTER# BLOCK-REFERRER: http://www.wunderground.com/ 2007-01-20 -#MASTER# COMMENT: banner at top of page http://server2.as5000.com/AS5000/adserver/click?ID=ADST-00015&C=0&T=... -/(.*/)?adserver/image -#MASTER# COMMENT: Also from wunderground.com: http://icons-aa.wunderground.com/ads/images/TripAdvisor-Blinky.gif 2007-01-20 -# Blocked URL = http://icons-aa.wunderground.com/ads/images/TripAdvisor-Blinky.gif -# URL = http://icons-aa.wunderground.com/ads/images/TripAdvisor-Blinky.gif -/(.*/)?ads/images/ - -############################################################################# -# Site-specific block-as-image patterns: -############################################################################# -#---------------------------------------------------------------------------- -# Banner farms: -#---------------------------------------------------------------------------- -#MASTER# BLOCK-REFERRER: http://www.cnn.com/ -#MASTER# BLOCK-REFERRER: http://www.aol.com/ -#MASTER# COMMENT: There are at least ar.atwola and pr.atwola. 10/01/06 -# Blocked URL = http://ar.atwola.com/ -# Blocked URL = http://pr.atwola.com/ -?r.atwola.com -#MASTER# BLOCK-REFERRER: http://www.altavista.com/ -#MASTER# BLOCK-REFERRER: http://www.tecchannel.de/ -#MASTER# BLOCK-REFERRER: http://www.whowhere.lycos.com/ -#MASTER# REMARKS: Do NOT block /adj or /adi here since these are typically JS -.[a-vx-z]*.doubleclick.net/(?!(.*/)?ad[ji]) -#MASTER# BLOCK-REFERRER: http://www.joecartoon.com/ 10/17/06 -.*servedby.advertising.com -#MASTER# BLOCK-REFERRER: http://www.yahoo.com/ -#.a.yimg.com/(?:(?!/i/).)*$ -#.a[0-9].yimg.com/(?:(?!/i/).)*$ -#.yimg.com/(.*/)?a/ -#.yimg.com/.*/(flash|java)/promotions -#.yimg.com/a/.*/flash/ -#MASTER# REMARKS: The above replaced with below. Actions file tracker #1645616 2007-01-27 -.yimg.com/.*.yimg.com/a/ -bs*.gsanet.com -bs*.einets.com -.qkimg.net -#MASTER# BLOCK-REFERRER: http://salon.com/ 10/19/06 -#MASTER# BLOCK-REFERRER: http://maps.yahoo.com/ -#MASTER# REMARKS: Banner farms; just exclude their corp. info -#MASTER# REMARKS: and have a "go there anyway" link for clk.atdmt.com -#MASTER# REMARKS: (Actionsfile feedback item #1888197) -[abd-vx-z]*.atdmt.com/ -#MASTER# BLOCK-REFERRER: http://www.exactaudiocopy.de/ 09/11/06 -#MASTER# BLOCK-REFERRER: http://stanford.facebook.com/home.php -# URL = http://www.fastclick.net/ -.fastclick.net -#MASTER# BLOCK-REFERRER: http://www.math.com/school/subject2/lessons/S2U3L6DP.html 09/11/06 -.casalemedia.com -#MASTER# BLOCK-REFERRER: http://www.macnn.com/ 10/09/06 -kermit.macnn.com/ -#MASTER# BLOCK-REFERRER: http://www.globalseeker.com/freesamples/ 10/09/06 -quinst.com/images -valuepage.com/images -#MASTER# BLOCK-REFERRER: http://www.imdb.com/ -ia.imdb.com/.*.swf -#MASTER# BLOCK-REFERRER: http://www.dietngo.com/ 10/09/06 -.reactivpub. -#MASTER# BLOCK-REFERRER: http://freemail.web.de/ 10/17/06 -#MASTER# BLOCK-REFERRER: http://www.nytimes.com/2003/11/19/politics/19DEAN.html?ex=1069822800&en=... -.as*.falkag. -#MASTER# BLOCK-REFERRER: http://www.macnn.com/news/18944 10/17/06 -a.tribalfusion.com/ -#MASTER# BLOCK-REFERRER: http://reviews.infosyncworld.com/palmos/featured/index.html?start=1&offs... 10/19/06 -.adserver.com/ -#MASTER# BLOCK-REFERRER: http://computers.cnet.com/hardware/0-1027-404-20857400.html?tag=rev -#MASTER# REMARKS: Pointdexter -.ru4.com/ -#MASTER# BLOCK-REFERRER: http://www.boursorama.com/infos/actualites/detail_actu_marches.phtml?news=15... -www.smartadserver.com/ -#MASTER# BLOCK-REFERRER: http://www.chez.tiscali.fr/ 10/07/06 -admedia. -#MASTER# REMARKS: Bannerfarm used by Morpheus file sharing software -jmcms.cydoor.com/ -#MASTER# BLOCK-REFERRER: http://www.tech-report.com/etc/2003q2/3dmurk03/index.x?pg=7 -#MASTER# REMARKS: Netshelter.com farm -#MASTER# REMARKS: Not found but leaving 10/07/06 -.adtrix.com -#MASTER# BLOCK-REFERRER: http://discussion.brighthand.com/forumdisplay.php?s=fee44a5b2a6fc2e9e79d6472... 10/19/06 -*[0-9].tribalfusion.com/ -#MASTER# REMARKS: Actions file tracker 1547656 09/02/06 -#MASTER# REMARKS: Update pattern: Actionsfile feedback item #1698822, was opened at 2007-04-11 to catch https://secure.img-cdn.mediaplex.com/0.... -# Blocked URL = https://secure.img-cdn.mediaplex.com/0/7454/43775/YA3149_17566_728x90_FCR_07... -.img*.mediaplex.com -#MASTER# BLOCK-REFERRER: http://www.tomshardware.com/ 09/28/06 -#MASTER# REMARKS: There is adfarm and altfarm.mediaplex -#MASTER# REMARKS: 20070711 Actionsfile feedback #1749013 /ad/fm/ appended, as click-throughs were being blocked. Could only find adverts being served from /ad/fm/ -a*farm.mediaplex.com/ad/fm/ -#MASTER# REMARKS: Support request 1312362 09/08/06 -#MASTER# DUPLICATED: adserver.itsfogo.com -#MASTER# REMARKS: Actionsfile feedback 09/11/06 http://matrix.mediavantage.de/mx.one?p=210&pa=1060&pb=1906&pd=10... -# URL = http://matrix.mediavantage.de/mx.one?p=210&pa=1060&pb=1906&pd=10... -#MASTER# BLOCK-REFERRER: http://www.heise.de/newsticker/meldung/61067 -matrix.mediavantage. -#MASTER# REMARKS Ad generator, SF user tracker 09/11/06 -.cibleclick.com -#MASTER# REMARKS: Ad generator 09/11/06 http://c1.netshelter.net/campaigns/ITTTech/itttech09_728x90.gif -#MASTER# BLOCK-REFERRER: http://www.osnews.com/ 09/11/06 -.netracker.net -#MASTER# REMARKS: ad generator domain per SF tracker 09/11/06 -.interclick.com -#MASTER# REMARKS: Ad generator http://c4.maxserving.com/iserver/site=5314/area=ad728x90/aamfmt=normal/aamsz... -#MASTER# BLOCK-REFERRER: http://www.imdb.com/name/nm0000168/bio 09/12/06 -# URL = http://c4.maxserving.com/iserver/site=5314/area=ad728x90/aamfmt=normal/aamsz... -.maxserving.com -#MASTER# REMARKS: Ad generator http://partner.gonamic.de/Affiliate/ViewCounter/index.cfm?trackingID=368232&... -#MASTER# BLOCK-REFERRER: http://torrent.to/torrent/ 09/12/06 -# URL = http://partner.gonamic.de/Affiliate/ViewCounter/index.cfm?trackingID=368232&... -.gonamic.de -# URL = http://img.webads.nl/ -.webads. -#MASTER# REMARKS: Ad generator http://media.adlegend.com/centrport/20060/511290/GM_emplyee_300x250.gif -# URL = http://media.adlegend.com/centrport/20060/511290/GM_emplyee_300x250.gif -#MASTER# BLOCK-REFERRER: http://news.yahoo.com/news?tmpl=story&cid=534&e=1&u=/ap/20050613... -.adlegend.com -#MASTER# REMARKS: Ad generator 09/12/06 http://dist.belnk.com//4/placement/1738/alt_offer/static.jpg -# URL = http://dist.belnk.com//4/placement/1738/alt_offer/static.jpg -#MASTER# BLOCK-REFERRER: http://groups.yahoo.com/group/louisianaandmardigra/messages/1?viscount=100 -.belnk.com -.euros4click. -#MASTER# BLOCK-REFERRER: http://www.planet3dnow.de/cgi-bin/newspub/viewnews.cgi?id=1129904195 -ads-*.quarterserver. -#MASTER# BLOCK-REFERRER: http://adrian.adrian.org/ 10/07/06 -searchportal.information.com/ -#MASTER# BLOCK-REFERRER: http://www.nbc4.com/news/2672416/detail.html 10/17/06 -images.ibsys.com/ -#MASTER# BLOCK-REFERRER: http://www.rentalhouses.com/search_results.php?searchnew=1&citys_city=&a... 11/05/06 -.lduhtrp.net/image -#MASTER# BLOCK-REFERRER: http://floodle.net 2007-01-21 SF tracker -scripts.chitika.net/.*.(gif|png|jpg) -#MASTER# REMARKS: Actionsfile feedback item #1648478 2007-01-30 -.projectwonderful.com/gen.php -#MASTER# BLOCK-REFERRER: http://www.multimap.com/ (sporadic) -#MASTER# REMARKS: Actionsfile feedback item #1665682 2007-02-21 -.akamai.net/.*.adtech.de/.*.(gif|png) -#MASTER# BLOCK-REFERRER: via Yahoo groups -#MASTER# REMARKS: Actionsfile tracker 1645513 2007-01-26 -.adinterax.com/.*.(gif|jpg) -#MASTER# BLOCK-REFERRER: http://www.wotzon.com/profilepage.html?comp_id=1002310&CatID=2 -#MASTER# REMARKS: Ad generator per Actionsfile feedback item #1749870 2007-07-08 -# URL = http://img.directtrack.com -img.directtrack.com -#MASTER# BLOCK-REFERRER: http://www.thinkbroadband.com/news/3621-complaint-about-orange-broadband-adv... -# URL = http://eas.apm.emediate.eu/media.5/1/1228/19193/ACT1215_120x600_v3.gif -.emediate.eu/ -# URL = http://feedads.googleadservices.com/~a/dPlpGU767u4D4kVO8EGuUlnf1Q0/i -# URL = http://feedads.googleadservices.com/~at/EpX-FnAXxwdaBSq-GRze37-rG0M/i -.googleadservices.com/~ -#MASTER# REMARKS: Block yahoo email & ygroups banner ad -# URL = http://ts.richmedia.yahoo.com/...hummingbird.jpg?adxq=NNN -.richmedia.yahoo.com/.*.(gif|jpe?g)?ad -# Blocked URL = http://this.content.served.by.adshuffle.com/p/a=/view.pxl -.served.by.adshuffle.com/ -# Blocked URL = http://newsletter.adsonar.com/nwrss/imgs/nwr_123.PNG?placementId=123&pli... -.adsonar.com/.*/imgs/ -# Blocked URL = http://rtb.pclick.yahoo.com/images/nojs.gif?p=3 -.pclick.yahoo.com/images/ -# Blocked URL = http://rover.ebay.com/ar/1/2/3?mpt=123&adtype=1&size=728x90 -/.*&adtype= - -#---------------------------------------------------------------------------- -# Cross-site user tracking -#---------------------------------------------------------------------------- -#MASTER# REMARKS: +block-as-image here -#MASTER# BLOCK-REFERRER: http://os2.ru/ 10/07/06 -.*.*.spylog.com/ -#MASTER# BLOCK-REFERRER: http://www.dhtmlplanet.com/ 10/07/06 -statse.webtrendslive.com -#MASTER# BLOCK-REFERRER: http://www.versiontracker.com/ -#MASTER# REMARKS: 1) Used on many sites 2) URLs don't _end_ in .gif, hence +imageblock -spinbox.versiontracker.com/.*.(gif|jpg) -#MASTER# BLOCK-REFERRER: http://mycroft.mozdev.org/ 10/07/06 -stat.onestat.com -#MASTER# BLOCK-REFERRER: http://www.meparecebien.com/noticias/discograficas/sinnamon-records/sinnamon... -#MASTER# REMARKS: Actionsfile feedback item #1644583 2007-03-05 -imp*.tradedoubler.com -#MASTER# BLOCK-REFERRER: http://www.sharepoint.boo.pl/ -#MASTER# REMARKS: Not found, but left 10/07/06 -stat.webmedia. -#MASTER# BLOCK-REFERRER: http://www.asp-php.net/index.php 10/07/06 -log*.xiti.com/ -log*.hit-parade.com/ -#MASTER# BLOCK-REFERRER: http://www.msnbc.com/news/884810.asp?0si=-&cp1=1 -# URL = http://www.xml.eshop.msn.com/tracksponsorimpression.asp -www.xml.eshop.msn.com/tracksponsorimpression.asp -#MASTER# BLOCK-REFERRER: http://www.planetgamecube.com/ 10/07/06 -.imrworldwide.com -#MASTER# REMARKS: Actionsfile feedback 1555719 09/10/06, and Debian Bug report -#MASTER# BLOCK-REFERRER: http://www.nrc.nl/ 09/12/06 -.clicktracks.com -#MASTER# REMARK: Actionsfile tracker 1159072 09/12/06 -.etracker. -#MASTER# REMARK: Actionsfile tracker 1243494 09/12/06 -#MASTER# BLOCK-REFERRER: http://www.spanked-slaves.com/movies14/bdsm14c.html -.x-traceur.com -#MASTER# BLOCK-REFERRER: http://www.aintitcool.com/ 10/05/06 -content.ipro.com -#MASTER# BLOCK-REFERRER: http://www.weatherbug.com/default.asp 10/05/06 -.247realmedia.com -#MASTER# BLOCK-REFERRER: http://www.samachar.com/ 10/05/06 -.sify.com -#MASTER# BLOCK-REFERRER: http://www.nbc4.com/news/2672416/detail.html 10/06/06 -.searchignite.com -#MASTER# BLOCK-REFERRER: http://www.sdtimes.com/ 10/07/06 -.statcounter.com -#MASTER# BLOCK-REFERRER: http://www.dn.se/ 10/07/06 -.research-int.se/data -#MASTER# BLOCK-REFERRER: http://www.chez.aliceadsl.fr/ 10/07/06 -.cybermonitor.com -#MASTER# BLOCK-REFERRER: http://disney.go.com -#MASTER# BLOCK-REFERRER: http://abcnews.com 10/15/06 -log.go.com/log -#MASTER# BLOCK-REFERRER: http://www.care2.com 10/18/06 -stats.indextools.com -#MASTER# BLOCK-REFERRER: http://www.techcrunch.com/ 12/16/06 #1616497 3 urls. -tra*.measuremap.com -.eurekster.com/sidebar -tra*.mybloglog.com -#MASTER# BLOCK-REFERRER: http://www.polymervision.com/ -#MASTER# REMARKS: Actionsfile feedback item #1629370 01/16/07 -.guesttrace. -#MASTER# BLOCK-REFERRER: http://dictionary.com -#MASTER# REMARKS: Actionsfile feedback item #165078 2007-02-05 -insightxe./data/ -#MASTER# BLOCK-REFERRER: http://www.unitedairlines.com -#MASTER# REMARKS: Actionsfile feedback item #1650797 2007-02-05 -.insightfirst.com -#MASTER# BLOCK-REFERRER: http://rss.slashdot.org/Slashdot/slashdot -# Blocked URL = http://rss.slashdot.org/~a/Slashdot/slashdot?i=ofbWqX -# URL = http://rss.slashdot.org/~a/Slashdot/slashdot?i=ofbWqX -rss.slashdot.org/~a/Slashdot/slashdot? -# Blocked URL = http://rss.slashdot.org/~r/Slashdot/slashdot/~4/102113044 -# URL = http://rss.slashdot.org/~r/Slashdot/slashdot/~4/102113044 -rss.slashdot.org/~r/Slashdot/slashdot/~4/ -#MASTER# BLOCK-REFERRER: http://www.isys.ucl.ac.be/bchi/research/Kwaresmi.htm -#MASTER# REMAKRKS: Actionsfile feedback item #1849627 2007-12-12 -[a-z][0-9].nedstatbasic.net/ -#MASTER# BLOCK-REFERER: http://feeds.feedburner.com/dilbertdailystrip/ -# Blocked URL = http://feeds.feedburner.com/~r/DilbertDailyStrip/~4/274512747 -#MASTER# BLOCK-REFERER: http://feeds.feedburner.com/PCLoadLetter -# Blocked URL = http://feeds.feedburner.com/~r/PCLoadLetter/~4/270448381 -#MASTER# REMAKRKS: This seem to be a common pattern for web bugs in feedburner feeds. -feeds.feedburner.com/~r/.*/~4/ -# Blocked URL = http://feedproxy.google.com/~r/DilbertDailyStrip/~4/y_kXD1z1HO0 -feedproxy.google.com/~r/.*/~4/ -# Blocked URL = http://feeds.feedburner.com/~a/DilbertDailyStrip?a=Ebzxel -#MASTER# REMAKRKS: This looks like a pattern as well, maybe we should block feeds.feedburner.com/~a/ here. -feeds.feedburner.com/~a/DilbertDailyStrip? -#MASTER# BLOCK-REFERER: http://www.buch.de/ -# URL = http://track.webtrekk.de/471497967328727/wt.pl?p=177,de.buch.show.home,1,102... -track.webtrekk.de/ - -#---------------------------------------------------------------------------- -# Specific counters (see above for generic patterns) -#---------------------------------------------------------------------------- -#MASTER# BLOCK-REFERRER: http://www.distrowatch.com/table.php?distribution=linex 10/19/06 -#MASTER# BLOCK-REFERRER: http://floodle.net 2007-01-21 tracker #1641102 -s*.sitemeter.com/(meter|js/counter.js) -#MASTER# BLOCK-REFERRER: http://personales.mundivia.es/lbouza/ 10/19/06 -# URL = http://fastcounter.bcentral.com/ -fastcounter.bcentral.com/ -#MASTER# BLOCK-REFERRER: http://osnews.com/ 10/19/06 -# URL = http://bilbo.counted.com/ -bilbo.counted.com/ - -#---------------------------------------------------------------------------- -# On-site ads and other single sources: -#---------------------------------------------------------------------------- -#MASTER# BLOCK-REFERRER: http://www.travelocity.com/Vacations/0,,TRAVELOCITY%7C%7CY,00.html?HPTRACK=m... -#MASTER# BLOCK-REFERRER: http://dest.travelocity.com/DestGuides/geo_frontdoor/0,,TRAVELOCITY,00.html?... 10/07/06 -.travelocity./Sponsor_gifs/ -#MASTER# REMARKS: Referenced from HTML-Emails (not checked 10/08/06) -# URL = http://foo.weather.com/creatives/ -# URL = http://bar.weather.com/web/services/email/ -.weather.com/creatives/ -.weather.com/web/services/email/ -#MASTER# BLOCK-REFERRER: http://gamespot.com/gamespot/filters/0,10850,6013548,00.html 10/08/06 -/.*/topslots/topslot -.contextweb.com/ -.offermatica.com/ -#MASTER# BLOCK-REFERRER: http://www.jpost.com/ 10/08/06 -.adbrite.com -#MASTER# BLOCK-REFERRER: http://www.jpost.com/servlet/Satellite?pagename=JPost/A/JPArticle/ShowFull&a... -.jpost.com/images/\d+/promos/ -#MASTER# BLOCK-REFERRER: http://www.infoempleo.com/ 10/08/06 -.infoempleo.com/(pop-up|images(/Nueva/|/motor)) -#MASTER# BLOCK-REFERRER: http://www.hardocp.com/ 10/08/06 -hera.hardocp.com/ -#MASTER# BLOCK-REFERRER: http://people.aol.com/ 10/08/06 -leadback.advertising. -#MASTER# BLOCK-REFERRER: http://astalavista.box.sk/ 10/08/06 -.yieldmanager.com/ -.displayadsmedia.com -# URL = http://astalavista.box.sk/adult.foo.jpg -astalavista.box.sk/adult.*.jpg -#MASTER# BLOCK-REFERRER: http://www.bol.com.br/ -smartad.*.*.* -#MASTER# BLOCK-REFERRER: http://www.dinside.no/ 10/08/06 -.dinside.no/annonsorer/ -#MASTER# BLOCK-REFERRER: http://www.heise.de/ 10/08/06 -#MASTER# BLOCK-REFERRER: http://www.spiegel.de/ -/RealMedia/ads/ -#MASTER# REMARKS: Variation 2007-11-12 -/RealMediaAds/ -#MASTER# BLOCK-REFERRER: http://www.powerdvd.com 12/28/06 per SF tracker -/top.php?d=.*.[a-z]{2,5} -#MASTER# REMARKS: Actionsfile feedback item #1764161 2007-07-31 -#MASTER# BLOCK-REFERRER: http://www.webster.com/dictionary/revering -.google.com/afsonline - -############################################################################# -# Site-specific unblockers: -############################################################################# -{-block} -# Sticky Actions = -block -#MASTER# UNBLOCK-REFERRER: http://www.faqs.org/ -.faqs.org/banner.html -#MASTER# UNBLOCK-REFERRER: http://bannerblind.mozdev.org/ -bannerblind.mozdev.org -#MASTER# UNBLOCK-REFERRER: http://advogato.org/ -advogato.org -#MASTER# UNBLOCK-REFERRER: http://www.handelsblatt.com/ -ad*.vhb.de -#MASTER# UNBLOCK-REFERRER: http://www.globalintersec.com/adv/sendtemp-2001021302.txt -.globalintersec.com/adv -#MASTER# UNBLOCK-REFERRER: http://www.wunderground.com/geo/BannerPromo/US/NY/New_York.html 10/08/06 -banners.wunderground.com/ -#MASTER# UNBLOCK-REFERRER: http://www.openoffice.org/ 10/09/06 -.openoffice.org/banners/ -#MASTER# UNBLOCK-REFERRER: http://www.amazon.com/exec/obidos/tg/browse/-/130/ref=gw_br_dvd/102-9730978-... 10/09/06 -#MASTER# REMARKS: Part of site decoration -.amazon.com/.*/banners/ -#MASTER# UNBLOCK-REFERRER: http://www.washingtonpost.com/wp-dyn/articles/A43890-2002Aug4.html -#MASTER# REMARKS: Javascripts whose absence messes the page -.washingtonpost.com/wp-srv/ -# URL = http://www.gnome.org/images/banner-gnomeis -.gnome.org -#MASTER# UNBLOCK-REFERRER: http://www.nycsubway.org/ 10/09/06 -.nycsubway.org/img/banner -#MASTER# UNBLOCK-REFERRER: http://www.forgotten-ny.com/ADS/manhattanads/moremahnattan.html -# URL = http://www.forgotten-ny.com/ADS/manhattanads/moremahnattan.html -.forgotten-ny.com/ADS/ -# URL = http://counter.li.org -counter.li.org -#MASTER# UNBLOCK-REFERRER: http://adrian.adrian.org/ 10/09/06 -# URL = http://adrian.adrian.org -adrian.adrian.org -#MASTER# UNBLOCK-REFERRER: http://adela.karlin.mff.cuni.cz/ 10/09/06 -# URL = http://adela.karlin.mff.cuni.cz -adela.karlin.mff.cuni.cz -#MASTER# UNBLOCK-REFERRER: http://www.swcp.com/rtoads/printmag/issue3/neg_data.html 10/09/06 -.swcp.com/rtoads/ -#MASTER# UNBLOCK-REFERRER: http://www.privoxy.org/actions/index.php -#MASTER# REMARKS: Don't block our own feedback process, even if the -#MASTER# REMARKS: parameters contain block patterns -# URL = http://www.privoxy.org/actions/index.php -.privoxy.org -#MASTER# UNBLOCK-REFERRER: http://sourceforge.net/help/tracker.php -sourceforge.net/.*tracker -#MASTER# UNBLOCK-REFERRER: http://www.brawnylads.com/ -# URL = http://www.brawnylads.com/ -.brawnylads.com -#MASTER# UNBLOCK-REFERRER: http://adzapper.sourceforge.net/ -# URL = http://adzapper.sourceforge.net/ -adzapper. -#MASTER# UNBLOCK-REFERRER: http://de.altavista.com/web/adv -# URL = http://de.altavista.com/web/adv -.altavista.com/web/adv -# URL = http://rads.mcafee.com/rads/scripts/RADS.dll?QueryProduct2 -rads.mcafee.com/ -# URL = http://linuxfromscratch.org/cgi-bin/lfscounter.cgi -linuxfromscratch.org/ -#MASTER# UNBLOCK-REFERRER: http://dv411.com/advc50.html -# URL = http://dv411.com/advc50.html -dv411.com/.*advc50 -# URL = http://www.freeswan.org/freeswan_trees/freeswan-1.98b/doc/adv_config.html -.freeswan.org/ -# URL = http://www.arm.com/support/ads_faq?OpenDocument&ExpandSection=11 -www.arm.com/.*ads -# URL = http://www.anybrowser.org/campaign/ -www.anybrowser.org/ -# URL = http://www.tads.org/ -www.tads.org/ -# URL = http://www.mbe.com/redir/packtrack.asp -.mbe.com/redir/packtrack.asp -.iship.com/trackit/ -# URL = http://www.esis.com.au/AdvSerialCards/Firewire.htm -.esis.com.au/AdvSerialCards -#MASTER# UNBLOCK-REFERRER: http://www.familysearch.org/ 10/11/06 -.familysearch.org/.*banner -#MASTER# UNBLOCK-REFERRER: http://coder.com/ 10/11/06 -coder.com/creations/banner/ -#MASTER# UNBLOCK-REFERRER: http://arnolds.dhs.org/static/adv_tools.html 10/11/06 -# URL = http://arnolds.dhs.org/static/adv_tools.html -arnolds.dhs.org/static/adv_tools.html -#MASTER# UNBLOCK-REFERRER: http://www.gpl.org/ -.gpl.org/ -#MASTER# UNBLOCK-REFERRER: http://europa.eu.int/yourvoice/ 10/11/06 -.europa.eu. -#MASTER# UNBLOCK-REFERRER: http://www.schooner.com/~loverso/no-ads/ 10/11/06 -# URL = http://www.schooner.com/~loverso/no-ads/ -.schooner.com/~loverso/no-ads/ -#MASTER# UNBLOCK-REFERRER: http://source.bungie.org/ 10/11/06 -source.bungie.org/ -# URL = http://adonthell.linuxgames.com/ -adonthell.linuxgames.com/ -#MASTER# UNBLOCK-REFERRER: http://news.bbc.co.uk/furniture/chinese/banner/bbccantonese_600.gif -#MASTER# REMARKS: Banner-free site(s). -.bbc.co.uk/ -# URL = http://adc.netlabs.org/ -adc.netlabs.org/ -#MASTER# UNBLOCK-REFERRER: http://www.tela.bc.ca/tads/authoring/multimedia-tads-docs/latin2.htm 10/11/06 -# URL = http://www.tela.bc.ca/tads/authoring/multimedia-tads-docs/latin2.htm -.tela.bc.ca/tads/ -# URL = http://adbusters.org/information/ -adbusters.org/ -# URL = http://www.eads.com/ -# URL = http://www.eads.net/ -# URL = http://www.eads.de/ -.eads.*/ -# URL = http://brew.qualcomm.com/brew/en/developer/resources/ad/documentation.html -.qualcomm.com/brew/en/developer/resources/ad/ -# URL = http://upgrade.bitdefender.com/update71/avx/Plugins/adsntfs.xmd.gzip -/update\d\d/.*adsnt.* -#MASTER# UNBLOCK-REFERRER: http://msdn.microsoft.com/ 09/11/06 -.microsoft.com/.*masthead -#MASTER# UNBLOCK-REFERRER: http://indymedia.org adfree site 09/11/06 -.indymedia.org -# URL = http://www.seanbaby.com/stupid/comicads05.shtml -.seanbaby.com -# URL = http://www.cels.org/db/keep-track.pl?cat:1 -.cels.org/.*track -#MASTER# UNBLOCK-REFERRER: http://www.nic.ad.jp/ See http://jprs.co.jp/en/jpdomain.html 09/11/06 -#MASTER# REMARKS: 2007-10-04, increase scope per Actionsfile feedback item #1807613 -#.nic.ad.jp -#MASTER# REMARKS removed .ad.jp per Actionsfile feedback item #1807613 -#MASTER# UNBLOCK-REFERRER: http://www.flickr.com/photo_zoom.gne?id=32594118&size=l 09/11/06 -#MASTER# REMARKS: creativecommons.org worthwhile organization 09/11/06 -/(.*/)?somerights20.gif -.creativecommons.org -# URL = http://www.ups.com/WebTracking/track?loc=en_US -.ups.com/.*/track -#MASTER# UNBLOCK-REFERRER: http://adju.st 09/12/06 -.adju. -#MASTER# REMARKS: Ad-free art site 09/12/06 -.rubberslug.com -.freebsd.org -.fsf.org -.gnu.org -#MASTER# REMARKS: SF tracker 09/15/06, and #1750779 2007-07-09 -#MASTER# REMARKS: New home? http://adiumx.cachefly.net/Adium_1.0.5.dmg -adium*.*. -#MASTER# UNBLOCK-REFERRER: http://google.com 10/01/06 -#MASTER# REMARKS: This allows many (but not all) Google "Sponsored Links" to function. -#MASTER# REMARKS: Presumably if someone clicks these they want to go there. -.googleadservices./pagead/adclick -#MASTER# UNBLOCK-REFERRER: http://www.garaget.org -#MASTER# REMARKS: These are "ads" from individuals selling cars per tracker. 10/06/06 -.garaget.org/annonser/ -#MASTER# UNBLOCK-REFERRER: http://www.macworld.com/ 10/07/06 -#MASTER# REMARKS: Without the unblock, the page layout is horribly broken 10/08/06 -edge.macworld.com -#MASTER# UNBLOCK-REFERRER: http:// www.discovery.de 10/19/06 -#MASTER# REMARKS: These are promos relevant to the page content. -.discovery./.*/topads/ -#MASTER# UNBLOCK-REFERRER: http://dawn.com -#MASTER# REMARKS: SF Actionsfile tracker 10/19/06. These images are not ads. -.dawn.com/.*/(9690dina|aurora_award). -#MASTER# UNBLOCK-REFERRER: http://google.com/reader/ -#MASTER# REMARKS: Initial page does not load, per Support request 10/27/06 -.google.com/reader/ -#MASTER# REMARKS: Actionsfile Tracker 1587079 10/30/06 -.parcel2go.com/track -#MASTER# REMARKS: Actionsfile Tracker #1612950 12/11/06 -.amazon.com/gp/gift-central/.*recip/ -#MASTER# UNBLOCK-REFERRER: http://yahoo.com 2007-01-27 -#MASTER# REMARKS: Actionsfile Tracker #1645501, this is a UI page element. -.yimg.com/.*/themes/ad/ -#MASTER# UNBLOCK-REFERRER: http://mozilla.hongo.wide.ad.jp/pub/mozilla.org//thunderbird/releases/ -#MASTER# REMARKS: Actionsfile feedback item #1672918 2007-03-03 -# URL = http://mozilla.hongo.wide.ad.jp/pub/mozilla.org//thunderbird/releases/ -.ad.*/pub/mozilla.org/ -# URL = http://lads.myspace.com/mini/mini.swf?b=NDgwNzU1ODE=&o=NjQwNzIzMA==&... -#MASTER# UNBLOCK-REFERRER: http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendi... -#MASTER# UNBLOCK-REFERRER: http://lads.myspace.com/videos/vplayer.swf -#MASTER# REMARKS: MySpace videos caught by .*ads. The above profile.myspace.com link grabs the vplayer.swf file (which does not work when directly fetched) -# URL = http://lads.myspace.com/videos/vplayer.swf -lads.myspace.com -#MASTER# REMARKS: 20070402 Adam Piggott first-party tracking. 20070411 Moved from generic unblockers by path to site-specific unblockers. -#MASTER# UNBLOCK-REFERRER: http://www.shockwave.com/servlet/DownloadEcommTracker?sku=fizzball-pc&pr... -# URL = http://www.shockwave.com/servlet/DownloadEcommTracker?sku=fizzball-pc&pr... -.shockwave.com/servlet/DownloadEcommTracker -#MASTER# REMARKS: 20070411 Adam Piggott fish4.co.uk is a popular UK advertising site for cars, properties and jobs and uses ad/advert all over the place, understandably. -# URL = http://www.fish4.co.uk/iad/lettings/advert?adId=12389712&src=nestoria -.fish4.co.uk/.*ad -#MASTER# REMARKS: Actionsfile feedback item #1700037 2007-04-13 HB -# URL = http://www.mp3.com.au/popup/popup.asp?id=110433 -.mp3.com.au/.*popup -#MASTER# REMARKS Actionsfile feedback #1700915 2007-04-15 -# URL = http://www.svd.se/ego/339/http://www.e24.se/dynamiskt/reklam_media/did_15092... -# URL = http://www.e24.se/dynamiskt/reklam_media/did_15092793.asp -/(.*/)?dynamiskt/reklam_media/did_ -#MASTER# REMARKS 20070710 Actionsfile feedback #1751020 -switch.atdmt.com/action/ -# URL = http://www.parcelforce.com/portal/pw/track?catId=7500082 -.parcelforce.com/.*track -#MASTER# UNBLOCK-REFERRER: redirect from http://go.microsoft.com/fwlink?linkid=51093 -#MASTER# REMARKS: Actionsfile feedback item #1757121 2007-07-19 -.microsoft.com/.*/adschema/ -# URL = http://upload.wikimedia.org/wikipedia/en/a/ad/Picturecarnegie.jpg -.wikimedia.org/ -# URL = http://en.wikipedia.org/wiki/Advertisement -.wikipedia.org/ -#MASTER# REMARKS Actionsfile feedback item #2299717 2008-11-16 -# URL = http://en.wiktionary.org/wiki/advertisement -.wiktionary.org/ -# URL = http://curl.haxx.se/docs/adv_20070710.html -.haxx.se/docs/adv_ -# URL = http://www.google.com/adsense/ -www.google.com/adsense/ -# URL = http://www.encyclopediadramatica.com/Advertisement -# URL = http://images.encyclopediadramatica.com/images/b/b5/Advertising-Dierentuin.j... -.encyclopediadramatica.com/ -#MASTER# UNBLOCK-REFERRER: http://lifehacker.com 2008-04-18 HB -# URL = tags.gawker.com/assets/minify.php?files=/assets/base.v6/css/global.css,/assets/base.v6/css/header.css,/assets/base.v6/css/sidebar.css,/assets/base.v6/css/content.css,/assets/base.v6/css/images.css,/assets/base.v6/css/ads.css,/assets/base.v6/css/community.css,/assets/base.v6/css/comments.css,/assets/base.v6/css/messages.css,/assets/base.v6/css/ui.css -tags.gawker.com/.*css$ -# URL = http://cgi.tnt.co.uk/TrackNTrace/quicktrack.asp -.tnt.co.uk/TrackNTrace/ -#MASTER# UNBLOCK-REFERRER: http://www.supermediastore.com/trackorder.html -# URL = http://secure.howtoburndvd.net/ups/track.php -/ups/track.php -#MASTER# REMARKS: Actionsfile feedback item #1886140 2008-02-04 -#MASTER# UNBLOCK-REFERRER: http://idonthateyouall.imeem.com/video/8zH0_f9i/kiley_rilo_pull_me_in_tighte... -# URL = http://ad.doubleclick.net/crossdomain.xml -ad.doubleclick.net/crossdomain.xml -#MASTER# REMARKS: Actionsfile feedback item #2021509 2008-07-18 -#MASTER# REMARKS: Allow realplayer site help popup windows -#MASTER# UNBLOCK-REFERRER: http://real.custhelp.com/cgi-bin/real.cfg/php/enduser/std_adp.php?p_faqid=45... -# URL = http://real.custhelp.com/cgi-bin/real.cfg/php/enduser/popup_adp.php -real.custhelp.com/cgi-bin/real.cfg/php/enduser/popup_adp.php -# URL = http://fritz.fonwlan.box/cgi-bin/webcm?getpage=../html/de/help/popup.html&am... -fritz.fonwlan.box/ -# URL = http://fritz.box/cgi-bin/webcm?getpage=../html/de/help/popup.html&var:la... -fritz.box/ -#MASTER# REMARKS: Actionsfile feedback item #2043327 2008-08-08 -# URL = http://kb.adobe.com/selfservice/viewContent.do?externalId=kb402747&slice... -.adobe.com -# URL = http://qa.debian.org/popcon.php -qa.debian.org/popcon.php -#MASTER# REMARKS: Support Requests item #2432535 2008-12-16 -# URL = http://www.mta.info/bandt/traffic/advmain.htm -.mta.info/.*advmain.htm$ -#MASTER# REMARKS: We also use this as a light character class test, therefore the additional URL directives. -# URL = http://www.proaurum.de/bannerA2/image/pro_master_r3_01_04.gif -# URL = http://www.proaurum.de/bannerA1/image/limitorder2.gif -# URL = http://www.proaurum.de/bannerA3/image/pro_master_r5_banken_01_01+.gif -# URL = http://www.proaurum.de/bannerB2/image/pro_banner_mitte.gif -# URL = http://www.proaurum.de/bannerB1_/image/pro_banner_links.gif -# URL = http://www.proaurum.de/bannerC1/image/partner1.png -.proaurum.de/banner[ABC]\d_?/ -# URL = http://www.goldmoney.com/en/images/home/banner_r4_c1.gif -.goldmoney.com/ -#MASTER# REMARKS: Actionsfile feedback item #2017126 2008-07-13 -#MASTER# REMARKS: The dutch newspaper site of Algemeen Dagblad (http://www.ad.nl) is blocked -# URL = http://www.ad.nl/ -.ad.nl/ -#MASTER# REMARKS: yahoo groups self-promotion - and the page is uglier without it -# URL = http://us.i1.yimg.com/us.yimg.com/i/yg/img/ads/bestofygroups.jpg -.yimg.com/.*/ads/bestofygroups.jpg$ -#MASTER# REMARKS: NYT home page is messed up because .css files are blocked -#MASTER# UNBLOCK-REFERRER: http://www.nytimes.com/ -# URL = http://graphics8.nytimes.com/css/0.1/screen/common/ads.css -# URL = http://graphics8.nytimes.com/css/0.1/screen/homepage/ads.css -.nytimes.com/.*/ads.css$ - - -############################################################################# -# Site-specific special rules: -############################################################################# - -#---------------------------------------------------------------------------- -# These sites are very complex (read: keen on your identity) and require -# minimal interference. -#---------------------------------------------------------------------------- -{fragile} -.office.microsoft.com -.windowsupdate.microsoft.com -#MASTER# PROBLEM URL: http://metrics.apple.com 10/11/06 -# too broad: .apple.com -www.apple.com -store.apple.com -images.apple.com -#MASTER# REMARKS: Actions Tracker 1293057 09/02/06 -.update.microsoft.com -#MASTER# REMARKS: Various reports 09/16/06. This site also requires pop-ups. -mail.google. - -#---------------------------------------------------------------------------- -# Semi-fragile, allow for blocks. -#---------------------------------------------------------------------------- -{ -crunch-all-cookies -filter -fast-redirects -hide-referer -prevent-compression } -#MASTER# REMARKS: Problem URL: adserver.yahoo.com 10/01/06 -#MASTER# REMARKS: This is much too broad for my taste. It forces me to add -#MASTER# REMARKS: a special yahoo section in my user.action file, just to -#MASTER# REMARKS: confirm my defaults in default.action. fk 2007-01-19 -.yahoo.com - -#---------------------------------------------------------------------------- -# Shopping and banking sites - allow cookies and pop-ups -#---------------------------------------------------------------------------- -#MASTER# REMARKS: This section not checked 10/11/06 HB -{shop} -.quietpc.com -.worldpay.com # for quietpc.com -.jungle.com -.dabs.com -.overclockers.co.uk -.db24.de -.ebay. -.mobile.de -www.fondationlejeu.com -www.techtv.com -.mywebgrocer.com - -#---------------------------------------------------------------------------- -# Subscription sites (with credible privacy policy) - allow permanent cookies -#---------------------------------------------------------------------------- -{-session-cookies-only} -#MASTER# PROBLEM-URL: http://www.nytimes.com/auth/login -.nytimes.com/ -#MASTER# PROBLEM-URL: http://www.volkskrant.nl/ -.volkskrant.nl/ - -#---------------------------------------------------------------------------- -# These sites require pop-ups, so don't use the unconditional filters. -#---------------------------------------------------------------------------- -{allow-popups} -#MASTER# PROBLEM-URL: http://www.aprilbarrows.com/discography.html -www.aprilbarrows.com/discography.html$ -#MASTER# PROBLEM-URL: http://www.nvidia.com/view.asp?PAGE=windows2000 -.nvidia.com -#MASTER# PROBLEM-URL: http://www15.chathouse.com/games/ -www*.chathouse.com/games/ -#MASTER# PROBLEM-URL: http://www.bild.de/ -.bild.t-online.de -#MASTER# PROBLEM-URL: http://www.netflix.com/ -.netflix.com -#MASTER# PROBLEM-URL: http://my.aol.com/ -my.aol.com -#MASTER# PROBLEM-URL: http://www.cnn.com/ -#MASTER# REMARKS: Re-enable "Story Tools" i.e. printing, emailing etc. -i.cnn.net/cnn/.*/clickability/button -#MASTER# PROBLEM-URL: http://www.rosettaproject.org:8080/live/search/contribute/swadesh/view?ethno... -.rosettaproject.org -#MASTER# PROBLEM-URL: http://www.quantum.com requires popups for downloads, etc. 09/11/06 -.quantum.com -#MASTER# PROBLEM-URL: http://www.liberation.fr 11/23/06 Actions tracker -.liberation.fr - -#---------------------------------------------------------------------------- -# Sometimes (i.e. often!) fast-redirects catches things by mistake -#---------------------------------------------------------------------------- -#MASTER# REMARKS: This section NOT checked 10/13/06 HB -{-fast-redirects} -# Sticky Actions = -fast-redirects -www.ukc.ac.uk/cgi-bin/wac.cgi? -#MASTER# PROBLEM-URL: http://www.google.com/search?q=foo -.google. -#MASTER# PROBLEM-URL: http://de.altavista.com/q?pg=q&q=foo&kl=XX&search.x=28&searc... -.altavista.com/(.*(like|url|link):|trans.*urltext=)http -#MASTER# PROBLEM-URL: http://www.speedfind.de/cgi-bin/search?q=foo&t=STANDARD -.speedfind.de -#MASTER# PROBLEM-URL: http://www.nytimes.com/ -.nytimes.com -#MASTER# REMARKS: Yahoo logout URL after first redirect. fk 2007-01-19 -#MASTER# REMARKS: Logout fails if we fast-redirect to the URL after "done=". -#MASTER# REMARKS: Reported in support request #1635354. -# URL = http://login.yahoo.com/config/login?logout=1&.done=http://mail.yahoo.com... -.yahoo.com/.*done=http -#MASTER# REMARKS: Reported in support request #1802365. -# URL = http://us.rd.yahoo.com/reg/login1/lisu/login/uk/ym/*http://edit.europe.yahoo... onfig/login?.tries=1&.src=ym&.md5=&.hash=&.js=1&.last=&...kP=Y&.done=http://mail .yahoo.com&.pd=ym_ver=0&c=&login=XXX&passwd=XXX&.persistent =&.hash=1&.md5=1 -.rd.yahoo.com/reg/login1/ -# URL = http://validator.w3.org/check -.w3.org -#MASTER# PROBLEM-URL: http://www.ask.com/ -.directhit.com -#MASTER# PROBLEM-URL: http://www.zagats.com/ -.zagats.com -#MASTER# PROBLEM-URL: http://www.passport.com/Consumer/default.asp?lc=1033 -#MASTER# PROBLEM-URL: http://www.msn.com/ -# URL = http://www.passport.com/Consumer/default.asp?lc=1033&msppchlg=1&mspp... -my.msn.com/passport/pp(consent|set).ashx?msnru= -www.passport.com/Consumer/default.asp?lc=[0-9]+&msppchlg=[01]&mspplogin= -login.passport.com/logout.(asp|srf)? -#MASTER# PROBLEM-URL: http://www.fileplanet.com -download.com.com/redir? -www.fileplanet.com/redir.asp? -#MASTER# PROBLEM-URL: http://cyber.law.harvard.edu/filtering/china/test/ -.edu -#MASTER# PROBLEM-URL: http://web.archive.org -# URL = http://web.archive.org/web/19970715180251/http://www.gmd.de/ -.archive.org -# URL = http://www.guenstiger.de/gt/link.asp?url=http://www.edv-supermarkt.de&so... -www.guenstiger.de -# URL = http://anon.free.anonymizer.com/http://www.privoxy.org/ -.anonymizer.com -# URL = http://www.mailtothefuture.com/public/logon?http://www.mailtothefuture.com/ -www.mailtothefuture.com -#MASTER# PROBLEM-URL: http://support.microsoft.com/default.aspx?scid=KB;en-us;q219110 -support.microsoft.com/ -# URL = http://www.alexa.com/data/details/traffic_details?q=blogspot&url=http://... -.alexa.com -# URL = http://www.translate.ru/url/tran_url.asp?lang=es&url=http%3A%2F%2Fos2pro... -www.translate.ru/url/ -# URL = http://schneegans.de/sv/?url=http%3A%2F%2Fwww.freebsd.org%2F&schema=%28D... -schneegans.de/ -# URL = http://config.privoxy.org/edit-actions-submit?f=user..&redirect_mode=htt... -config.privoxy.org/ -# URL = http://users.wsj.com/lmda/do/checkLogin?mg=evo-wsj&url=http%3A%2F%2Fonli... -.wsj.com/lmda/do/checkLogin -#MASTER# REMARKS: As we already have five other PROBLEM-URLs that contain '?url=', -#MASTER# REMARKS: it might make sense to allow '/.*?url=' in general -# URL = http://del.icio.us/url/check?url=http%3A%2F%2Fwww.privoxy.org -del.icio.us/ -# URL = http://calgary.ctv.ca/servlet/RTGAMArticleHTMLTemplate/B/20070615/goexpo?bra... -.ctv.ca/.*&site_cfcn=http:// -# URL = http://memberservices.informit.com/checkLogin.ashx?partner=8&r=http%3a%2... -.informit.com/.*&r=http%3a%2f%2f -# URL = http://access.adobe.com/access/getStatus.do?jobid=&srcPdfUrl=http://cups... -access.adobe.com/access/getStatus.do?jobid=&srcPdfUrl= -# URL = http://view.samurajdata.se/ps.php?url=http%3A%2F%2Fcups.cs.cmu.edu%2Fsoups%2... -view.samurajdata.se/ps.php?url= -# URL = http://www.blogger.com/navbar.g?targetBlogID=8919860543765866292&blogNam... -.blogger.com/navbar.g -# URL = http://editors.dmoz.org/editors/editurl.cgi?url=http%3a//www.example.de/&... -.dmoz.org/editors/editurl.cgi -# URL = http://offer.ebay.de/ws/eBayISAPI.dll?stockphotourl=http%3A%2F%2Fi16.ebayimg... -# URL = http://offer.ebay.de/ws/eBayISAPI.dll?maxbid=15%2C01&MfcISAPICommand=Mak... -.ebay.de/ws/eBayISAPI.dll? -#MASTER# REMARKS: While this is a redirect, the token isn't part of the URL redirected to. -# URL = http://www.amazon.com/gp/redirect.html/ref=cm_plog_item_link/105-3659773-084... -.amazon.com/gp/redirect.html/.*location.*&token -# URL = http://en.groundspring.org/EmailNow/pub.php?module=WebSignup&cmd=thankyo... -.groundspring.org/ -# URL = http://www1.landsend.de/pp/undefined/images/error.gif?onerr=true&ts=1227... -.landsend.de/ -# URL = http://www.youtube.com/swf/l.swf?swf=http%3A//s.ytimg.com/yt/swf/cps-vfl6894... -.youtube.com/swf/.*swf= - -#---------------------------------------------------------------------------- -# No filtering for sourcecode or other automatically parsed content -#---------------------------------------------------------------------------- -{-filter -prevent-compression} -# Sticky Actions = -filter -prevent-compression -# URL = http://ijbswa.cvs.sourceforge.net/ijbswa/current/ -.cvs. -/.*(cvs(view|web)|viewcvs) -#MASTER# REMARKS: The same for Subversion -# URL = http://svn.sourceforge.net/ -.svn. -.websvn. -/(.*/)?svn/ -#MASTER# REMARKS: Jeez, could you please stay with one of them? -# URL = http://liveupdate.symantec.com/ennlu.x86 -liveupdate.symantec.com -liveupdate.liveupdatesymantec.com -liveupdate.symantecliveupdate.com -# URL = http://www.bookmarklets.com/ -.bookmarklets.com -# URL = http://www.squarefree.com/bookmarklets/ -.squarefree.com/bookmarklets/ -#MASTER# REMARKS: Used by Mac OSX's automatic software update feature -swquery.apple.com -swscan.apple.com -#MASTER# REMARKS: These are various US DSL speed tests sites, where MIME is wrong -# URL = http://atl.speakeasy.net/300k -.speakeasy.net/\d+k -# URL = http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=185033 -.debian.org -#MASTER# DONT-VERIFY -#MASTER# REMARKS: Popular bug-tracking system - likely to contain code -bugzilla. -.tldp.org -#MASTER# REMARKS: mail should not be filtered 09/18/06 -webmail. -#MASTER# REMARKS: all the world is wikified 09/02/06. Generic wiki un-filterers. -.wiki*. -.*wiki. -/.*wiki/ -#MASTER# REMARKS Actionsfile feedback item #2299717 2008-11-16 -# URL = http://en.wiktionary.org/ -.wiktionary.org/ -#MASTER# REMARKS: protect some google projects from accidental JS/HTML tampering, etc -maps.google. -.google.com/(calendar|reader) -#MASTER# REMARKS: A lot of code and docs on these sites: -code. -developer. -.mozdev.org -.mozilla.org -.perl.org -.cpan.org -.webdeveloper.com -.ibm.com/developerworks -.apache.org/docs -.comptechdoc.org -.webmonkey.com -.webreference.com -docs.sun.com -java.sun.com -.thescripts.com -.php.net -.phpdeveloper.org -.oreillynet.com/pub -.devshed.com -.htmlgoodies.com -.javascript.com -javascript.internet.com -.w3schools.com -.devguru.com -javascriptkit.com -.xulplanet.com -.perl.com/language/newdocs -.freebsd.org -.watson.org -.netbsd.org -.openbsd.org -.dragonflybsd.org -.freedesktop.org -.gnu.org -.fedoraproject.org -.userscripts.org -#MASTER# REMARKS: Bug trackers like Flyspray and Mailinglist interfaces like Mailman: -/(.*/)?flyspray/ -/(.*/)?mail(man|archive|inglists?)/ -bugs. -#MASTER# REMARKS: Actionsfile tracker 1555909 09/17/06, various problems with cpu and logging in. -quoka.de - -#---------------------------------------------------------------------------- -# Innocent images in standard banner sizes found here: -#---------------------------------------------------------------------------- -{-filter{banners-by-size}} -# Sticky Actions = -filter{banners-by-size} -# URL = http://www.pricegrabber.com/search_getprod.php?masterid=580330&zip_code=... -.pricegrabber.com/search_getprod.php -#MASTER# REMARKS: URL-based filtering is enough here. 120x90 content images -# URL = http://www.cnn.com/WORLD/ -.cnn.com -#MASTER# REMARKS: 120x90 content images -# URL = http://gamespot.com/gamespot/filters/0,10850,6013054,00.html -.gamespot.com/gamespot -#MASTER# PROBLEM-URL: http://www.wral.com/ 10/14/06 -www.wral.com -#MASTER# PROBLEM-URL: http://www.cartoonnetwork.com/ 10/15/06 -.cartoonnetwork.com/ -# URL = http://www.anybrowser.org/campaign/ -.anybrowser.org -# URL = http://images.google.de/images?q=cookie+monster&svnum=10&hl=de&l... -images.google. -# URL = http://www.pbs.org/wgbh/pages/roadshow/series/highlights/2003/albuquerque/in... -.pbs.org/.*/roadshow/ -# URL = http://objects.povworld.org/cat/Food/ -objects.povworld.org/cat/ -# URL = http://www.xach.com/gimp/tutorials/tiles.html -www.xach.com/gimp/ -#MASTER# REMARKS: The destination map at the bottom of the page. -# URL = http://www.mapquest.com/directions/main.adp?go=1&do=nw&ct=NA&1y=... -.mapquest.com/directions/ -#MASTER# PROBLEM-URL: http://www.theonion.com/ 10/15/06 -#MASTER# REMARKS: A nasty "premercial" ad is required to enter this site. -.theonion.com/content/ -# URL = http://www.pattilupone.net/gallery.html -.pattilupone.net/gallery.html -# URL = http://www.ambrosiasw.com/games/evn/desktops.html -.ambrosiasw.com/ -# URL = http://oca.microsoft.com/en/Welcome.asp -.microsoft.com -# URL = http://javabog.dk/ijk/ -javabog.dk/ijk/ -#MASTER# REMARK: Per Debian bug report #319025 09/09/06 -.w3.org -# URL = http://www.encyclopediadramatica.com/New_Zealand_Fail_Guy -.encyclopediadramatica.com/ -# URL = http://www.ikea.com/us/en/catalog/products/00103102 -.ikea.com/ -# URL = http://www.froscon.de/en/projects.html -.froscon.de/ -# URL = http://www.fsfe.org/en/supporters -.fsfe.org/ -# URL = http://www.couchsurfing.com/mapsurf.html -.couchsurfing.com/ - -{-filter{banners-by-link}} -# Sticky Actions = -filter{banners-by-link} -# URL = http://www.encyclopediadramatica.com/Advertisement -.encyclopediadramatica.com/ - -#---------------------------------------------------------------------------- -# These don't work without the referrer information: -#---------------------------------------------------------------------------- -{-hide-referrer} -# Sticky Actions = -hide-referrer -#MASTER# REMARKS: This section NOT checked 10/18/06 HB -#MASTER# REMARKS: These are movie clips, linked from http://us.imdb.com -.totaleclips.com -#MASTER# REMARKS: Link to download page breaks -# URL = http://www.mandrakelinux.com/en/ftp.php3 -.mandrakelinux.com/en/ftp.php3 -#MASTER# REMARKS: Actions Tracker 1313157 -# URL = http://validator.w3.org/check?uri=referer -validator.w3.org/check?uri=referer -#MASTER# REMARKS: Fixes Debian Bug #250407 -# URL = http://www.petitiononline.com/mod_perl/signed.cgi -.petitiononline.com/mod_perl/signed.cgi -#MASTER# REMARKS: Tracker bug report 1107806 09/26/06 -.telia.se -#MASTER# REMARKS: XML validator that actually works. -# URL = schneegans.de/sv/?url=referer -schneegans.de/sv/?url=referer - -#---------------------------------------------------------------------------- -# These animated gifs are either useful or nice: -#---------------------------------------------------------------------------- -{-deanimate-gifs} -# Sticky Actions = -deanimate-gifs -#MASTER# REMARKS: Wanted animations on ecards -#MASTER# REMARKS: Leaving 10/18/06 though most animated seem flash now. -# URL = http://www.care2.com/ -.care2.com -.care-mail.com -#MASTER# PROBLEM-URL: http://weather.chicagotribune.com/radar/station.asp?ID=LOT19&type=loop -#MASTER# REMARKS: These are weather radar images. 10/18/06 -# URL = http://www.wunderground.com/radar/station.asp?ID=MPX19&type=loop&clu... -.wunderground.com -66.28.250.180/data/ -#MASTER# PROBLEM-URL: http://www.teamquest.com/html/gunther/laquiz.shtml -.teamquest.com/gifs/gunther/ -#MASTER# REMARKS: 09/12/06 Art site, and ad-free -.rubberslug.com -#MASTER# REMARKS: Actionsfile feedback item #2040467, allow animated gifs from wikipedia.org -.wikipedia.org/ - -#---------------------------------------------------------------------------- -# The "site-specifics" filter has special cures for problems found here: -#---------------------------------------------------------------------------- -#MASTER# REMARKS: This section NOT checked 10/15/06 HB. -{+filter{site-specifics}} -# Sticky Actions = +filter{site-specifics} -# URL = http://www.spiegel.de/static/js/flash-plugin.js -.spiegel.de/static/js/flash-plugin.js -# URL = http://www.quelle-bausparkasse.de/ -.quelle-bausparkasse.de/$ -# URL = http://de.groups.yahoo.com/group/die-spinner/interrupt?st=2&ln=die-spinn... -.groups.yahoo.com/group/ -# URL = http://www.nytimes.com/ -.nytimes.com/ - -#---------------------------------------------------------------------------- -# Content under these TLDs is most probably in character sets which the -# demoronizer filter would mess up -#---------------------------------------------------------------------------- -{-filter{demoronizer}} -.jp -.cn -.tw -.ru -.kr - -#---------------------------------------------------------------------------- -# Misc special rules: -#---------------------------------------------------------------------------- -{-filter{content-cookies} -filter{webbugs}} -# Sticky Actions = -filter{content-cookies} -filter{webbugs} -#MASTER# REMARKS: Needs content-cookies for cookie test on index page; needs webbugs for storing profile(!) -# URL = http://www.friendscout24.de/ -.friendscout24.de -#MASTER# REMARKS: Explains how content cookies work -# URL = http://www.webreference.com/js/column8/property.html -.webreference.com/js/column8/property.html - -{-filter{fun}} -# Sticky Actions = -filter{fun} -#MASTER# REMARKS: Don't change the filter code with itself ;-) -# URL = http://www.privoxy.org/user-manual/filter-file.html -/(.*/)?user-manual/filter-file.html - -#{+filter{img-reorder} +filter{banners-by-link}} -#MASTER# REMARKS: Temporarily decommissioning 10/15/06. Violates Cautious no filter policy. HB -#MASTER# PROBLEM-URL: http://www.dn.se/ -#MASTER# REMARKS: Can't catch by size or location -#www.dn.se - -{-filter{img-reorder}} -# Sticky Actions = -filter{img-reorder} -#MASTER# REMARKS: Google images don't show up with img-reorder on -#MASTER# REMARKS: Also images on finance.google.com 09/25/06 -# URL = http://images.google.com -.google. -#MASTER# PROBLEM-URL: http://wired.com 09/23/06 -# URL = http://wired.com -/.*wired(.com)?/ -.wired.com/ - -{-filter{js-annoyances}} -# Sticky Actions = -filter{js-annoyances} -#MASTER# REMARKS: No progress past main page without js-annoyances -# URL = http://www.nasa.gov -.nasa.gov -#MASTER# REMARKS: Exclude per Debian bug report #377843 -# URL = http://www2.cnrs.fr/presse/communique/900.htm -.cnrs.fr -#MASTER# REMARKS: Exclude per Debian bug report #377843 -# URL = http://blogs.msdn.com/wga/archive/2006/07/16/667063.aspx -blogs.msdn.com - -{-filter{unsolicited-popups}} -# Sticky Actions = -filter{unsolicited-popups} -#MASTER# REMARKS: Breaks Movable Type's admin interface (http://www.movabletype.org/) -/.*mt.cgi$ -#MASTER# REMARKS: Exclude per Debian bug report #377843 09/17/06 -# URL = http://www2.cnrs.fr/presse/communique/900.htm -.cnrs.fr -#MASTER# REMARKS: Exclude per Debian bug report #377843 09/17/06 -# URL = http://blogs.msdn.com/wga/archive/2006/07/16/667063.aspx -blogs.msdn.com - -{+fast-redirects{check-decoded-url} -block} -# Sticky Actions = +fast-redirects{check-decoded-url} -block -#MASTER# REMARKS: Yahoo search results. Added 2007-01-19 fk -#MASTER# REDIRECT-REFERRER: http://search.yahoo.com/search?p=privoxy -# URL = http://rds.yahoo.com/_ylt=A0geuryczbBF._YAEmxXNyoA;_ylu=X3oDMTB2b2gzdDdtBGNv... -rds.yahoo.com/ -#MASTER# COMMENTS: Verified 2007-01-19 fk -#MASTER# REDIRECT-REFERRER: http://www.gamefaqs.com/computer/doswin/game/914819.html -# URL = http://dw.com.com/redir?asid=0&astid=8&siteid=19&edid=107&de... -dw.com.com/ -#MASTER# REMARKS: Action tracker 1593393. Added 2007-01-20. -# URL = http://wzus.bloglines.com/r?t=a&d=us&s=bl&c=blen&ti=1&ai... -.bloglines.com/r? -www.skweezer.net/bloglines -# URL = http://media.fastclick.net/w/get.media?sid=4681&m=5&tp=6&url=htt... -.fastclick.net/w/get.media? - -{+block{Looks like an anti-leech trigger URL.}} -#MASTER# COMMENTS: This section not checked 10/17/06 HB. Still out there? -#MASTER# PROBLEM-URL: http://www.anti-leech.com/theft_example.html -#MASTER# REMARKS: Lame attempt at banning ad-blockers. Used by other websites as well. -/antitheft.php - -{ +prevent-compression } -.compusa.com/ - -{+filter{tiny-textforms}} -.sourceforge.net/tracker - -{+downgrade-http-version} -#MASTER# COMMENTS: This section not checked 10/17/06 HB -#MASTER# REMARKS: This is work-around for CUPS http configuration. -:631 - -#MASTER# REMARKS: If Privoxy is disabled, requests for config.privoxy.org/ -#MASTER# REMARKS: reach privoxy.org and are redirected to privoxy.org/config. -#MASTER# REMARKS: The instructions tell the user to reload the page with -#MASTER# REMARKS: Privoxy enabled to reach the configuration webinterface, -#MASTER# REMARKS: to make this work we have to intercept the request and revert -#MASTER# REMARKS: the redirection. -{+redirect{http://config.privoxy.org/%7D%7D -# Sticky Actions = +redirect{http://config.privoxy.org/%7D -# URL = http://www.privoxy.org/config -.privoxy.org/config - -#MASTER# REMARKS: Privoxy's "unsafe" CGI pages check the referrer -#MASTER# REMARKS: to make sure the user reached them intentionally. -#MASTER# REMARKS: Disabling hide-referrer so there's a referrer left to check. -#MASTER# REMARKS: Disabling fast-redirects because if CGI crunching gets -#MASTER# REMARKS: enabled it could be leveraged to fool the referrer check. -{-hide-referrer -fast-redirects} -# Sticky Actions = -hide-referrer -fast-redirects -# URL = http://p.p -# URL = http://config.privoxy.org -p.p/ -config.privoxy.org/ - -#MASTER# REMARKS: Yahoo logout URLs need special treatment, -#MASTER# REMARKS: the URL after "done=" is no fast-redirect. 2007-01-19 fk -#MASTER# REMARKS: Reported in support request #1635354. -{-fast-redirects +redirect{s@^.**(http://login%5C.yahoo%5C.com/.*)$@$1@i%7D%7D -# XXX: Privoxy-Regression-Test currently doesn't allow backslashes. -# Sticky Actions = -fast-redirects +redirect -# URL = http://us.ard.yahoo.com/SIG=AAAAAAAAA/M=NNNNNN.NNNNNNN.NNNNNNN.NNNNNNN/D=mai... -.yahoo./.*http://login.yahoo.com/config/login.*http:// - -#---------------------------------------------------------------------------- -# Sections that modify the action settings based on tags. -#---------------------------------------------------------------------------- - -############################################################################# -# Depends on +client-header-tagger{image-requests} -############################################################################# -{-handle-as-empty-document \ - +handle-as-image \ -} -TAG:^IMAGE-REQUEST$ - -############################################################################# -# Depends on +client-header-tagger{css-requests} -############################################################################# -{+handle-as-empty-document \ - -handle-as-image \ -} -TAG:^CSS-REQUEST$ - -#MASTER# set vi:nowrap diff --git a/external/privoxy/default.filter b/external/privoxy/default.filter deleted file mode 100644 index 3537c7b..0000000 --- a/external/privoxy/default.filter +++ /dev/null @@ -1,1289 +0,0 @@ -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/default.filter,v $ -# -# $Id: default.filter,v 1.71 2009/03/01 18:33:17 ler762 Exp $ -# -# Purpose : Rules to process the content of web pages -# -# Copyright : Written by and Copyright (C) 2001-2009 the -# Privoxy team. http://www.privoxy.org/ -# -# 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=brow... -# -# 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: -# -# Generally filters start with a line like "FILTER: name description". -# They are then referrable from the actionsfile with +filter{name} -# -# FILTER marks a filter as content filter, other filter -# types are CLIENT-HEADER-FILTER, CLIENT-HEADER-TAGGER, -# SERVER-HEADER-FILTER and SERVER-HEADER-TAGGER. -# -# Inside the filters, write one Perl-Style substitution (job) per line. -# Jobs that precede the first FILTER: line are ignored. -# -# For Details see the pcrs manpage contained in this distribution. -# (and the perlre, perlop and pcre manpages) -# -# Note that you are free to choose the delimiter as you see fit. -# -# Note2: In addition to the Perl options gimsx, the following nonstandard -# options are supported: -# -# 'U' turns the default to ungreedy matching. Add ? to quantifiers to -# switch back to greedy. -# -# 'T' (trivial) prevents parsing for backreferences in the substitute. -# Use if you want to include text like '$&' in your substitute without -# quoting. -# -# 'D' (Dynamic) allows the use of variables. Supported variables are: -# $host, $origin (the IP address the request came from), $path and $url. -# -# Note that '$' is a bad choice as delimiter for dynamic filters as you -# might end up with unintended variables if you use a variable name -# directly after the delimiter. Variables will be resolved without -# escaping anything, therefore you also have to be careful not to chose -# delimiters that appear in the replacement text. For example '<' should -# be save, while '?' will sooner or later cause conflicts with $url. -# -################################################################################# - - -################################################################################# -# -# js-annoyances: Get rid of particularly annoying JavaScript abuse. -# -################################################################################# -FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse. - -# Note: Most of these jobs would be safer if restricted to a -# <script> context as in: -# -# s/(<script.*)nasty-item(?=.*</script>)/$1replacement/sigU -# -# but that would make them match only the first occurrence of -# nasty-item in each <script>. We need nestable jobs! - -# Get rid of Javascript referrer tracking. -# Test page: http://www.javascript-page.com/referrer.html -# -s|(?:\w+.)+referrer|"Not Your Business!"|gisU - -# The status bar is for displaying link targets, not pointless blahblah -# -s@([\W]\s*)((?:this|window).(?:default)?status)\s*=\s*((['"]).*?\4)@$1$2 =\ - (typeof(this.href) != 'undefined')?($3 + ' URL: ' + this.href):($2)@ig - -s/(?:(?:this|window).(?:default)?status)\s*=\s*\w*\s*;//ig - -# Kill OnUnload popups. Yummy. -# Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html -# -s/(<body\s+[^>]*)onunload/$1never/siU -s|(<script.*)window.onunload(?=.*</script>)|$1never|sigU - -# If we allow window.open, we want normal window features: -# Test: http://www.htmlgoodies.com/beyond/notitle.html -# -s/(open\s*([^)]+resizable=)(["']?)(?:no|0)\2/$1$2yes$2/sigU -s/(open\s*([^)]+location=)(["']?)(?:no|0)\2/$1$2yes$2/sigU -s/(open\s*([^)]+status=)(["']?)(?:no|0)\2/$1$2yes$2/sigU -s/(open\s*([^)]+scroll(?:ing|bars)=)(["']?)(?:no|0)\2/$1$2auto$2/sigU -s/(open\s*([^)]+menubar=)(["']?)(?:no|0)\2/$1$2yes$2/sigU -s/(open\s*([^)]+toolbar=)(["']?)(?:no|0)\2/$1$2yes$2/sigU -s/(open\s*([^)]+directories=)(["']?)(?:no|0)\2/$1$2yes$2/sigU -s/(open\s*([^)]+fullscreen=)(["']?)(?:yes|1)\2/$1$2no$2/sigU -s/(open\s*([^)]+always(?:raised|lowered)=)(["']?)(?:yes|1)\2/$1$2no$2/sigU -s/(open\s*([^)]+z-?lock=)(["']?)(?:yes|1)\2/$1$2no$2/sigU -s/(open\s*([^)]+hotkeys=)(["']?)(?:yes|1)\2/$1$2no$2/sigU -s/(open\s*([^)]+titlebar=)(["']?)(?:no|0)\2/$1$2yes$2/sigU -s/(open\s*([^)]+always(?:raised|lowered)=)(["']?)(?:yes|1)\2/$1$2no$2/sigU - - -################################################################################# -# -# js-events: Kill all JS event bindings and timers (Radically destructive! Only for extra nasty sites). -# -################################################################################# -FILTER: js-events Kill all JS event bindings and timers (Radically destructive! Only for extra nasty sites). - -s/(on|event.)((mouse(over|out|down|up|move))|(un)?load|contextmenu|selectstart)/never/ig -# Not events, but abused on the same type of sites: -s/(alert|confirm)\s*(/concat(/ig -s/settimeout(/concat(/ig - -################################################################################# -# -# html-annoyances: Get rid of particularly annoying HTML abuse. -# -################################################################################# -FILTER: html-annoyances Get rid of particularly annoying HTML abuse. - -# New browser windows (if allowed -- see no-popups filter below) should be -# resizeable and have a location and status bar -# -s/(<a\s+href[^>]+resizable=)(['"]?)(?:no|0)\2/$1$2yes$2/igU -s/(<a\s+href[^>]+location=)(['"]?)(?:no|0)\2/$1$2yes$2/igU -s/(<a\s+href[^>]+status=)(['"]?)(?:no|0)\2/$1$2yes1$2/igU -s/(<a\s+href[^>]+scrolling=)(['"]?)(?:no|0)\2/$1$2auto$2/igU -s/(<a\s+href[^>]+menubar=)(['"]?)(?:no|0)\2/$1$2yes$2/igU - -# The <BLINK> and <MARQUEE> tags were crimes! -# -s-</?(blink|marquee).*>--sigU - - -################################################################################# -# -# content-cookies: Kill cookies that come in the HTML or JS content. -# -################################################################################# -FILTER: content-cookies Kill cookies that come in the HTML or JS content. - -# JS cookies, except those used by antiadbuster.com to detect us: -# -s|(\w+.)+cookie(?=[ \t\r\n]*=)(?!='aab)|ZappedCookie|ig - -# HTML cookies: -# -s|<meta\s+http-equiv=['"]?set-cookie.*>|<!-- ZappedCookie -->|igU - - -################################################################################# -# -# refresh-tags: Kill automatic refresh tags (for dial-on-demand setups). -# -################################################################################# -FILTER: refresh-tags Kill automatic refresh tags (for dial-on-demand setups). - -# Note: Only deactivates refreshes with more than 9 seconds delay to -# preserve monster-stupid but common redirections via meta tags. -# -s/<meta\s+http-equiv\s*=\s*(['"]?)refresh\1\s+content\s*=\s*(['"]?)\d{2,}\s*(;\s*url\s*=\s*([^>\2]*))?\2/<link rev="x-refresh" href="$4"/iU - - -################################################################################# -# -# unsolicited-popups: Disable unsolicited pop-up windows. -# -################################################################################# -FILTER: unsolicited-popups Disable only unsolicited pop-up windows. - -s+([^'"]\s*<head.*>)(?=\s*[^'"])+$1<script>function PrivoxyWindowOpen(){return(null);}</script>+isU -s@([^\w\s.]\s*)((?:map)?(window|this|parent).?)?open\s*(@$1PrivoxyWindowOpen(@ig -s+([^'"]\s*</html>)(?!\s*(\n|'|"))+$1<script>function PrivoxyWindowOpen(a, b, c){return(window.open(a, b, c));}</script>+iU - - -################################################################################## -# -# all-popups: Kill all popups in JavaScript and HTML. -# -################################################################################# -FILTER: all-popups Kill all popups in JavaScript and HTML. - -s@((\W\s*)(?:map)?(window|this|parent).?)open\s*\?(@$1concat(@ig # JavaScript -#s/\starget\s*=\s*(['"]?)_?(blank|new)\1?/ notarget/ig # HTML -s/\starget\s*=\s*(['"]?)_?(blank|new)\1?/ /ig # (X)HTML - -################################################################################## -# -# img-reorder: Reorder attributes in <img> tags to make the banners-by-* filters more effective. -# -################################################################################# -FILTER: img-reorder Reorder attributes in <img> tags to make the banners-by-* filters more effective. - -# In the first step src is moved to the start, then width is moved to the second -# place to guarantee an order of src, width, height. Also does some white-space -# normalization. -# -# This makes banners-by-size more effective and allows both banners-by-size -# and banners-by-link to preserve the original image URL in the title attribute. - -s|<img\s+?([^>]*)\ssrc\s*=\s*(['"])([^>\\2]+)\2|<img src=$2$3$2 $1|siUg -s|<img\s+?([^>]*)\ssrc\s*=\s*([^'">\\s]+)|<img src=$2 $1|sig -s|(<img[^>]+height)\s*=\s*|$1=|sig - -s|<img (src=(?:(['"])[^>\\2]*\2|[^'">\\s]+?))([^>]*)\s+width\s*=\s*((["']?)\d+?\5)(?=[\s>])|<img $1 width=$4$3|siUg - - -################################################################################# -# -# 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. -# -# Note2: Use img-reorder before this filter to ensure maximum matching success -# -################################################################################# -FILTER: banners-by-size Kill banners by size. - -# 88*31 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)88\4)[^>]*?(height=(['"]?)31\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 120*60, 120*90, 120*240, 120*600 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)120\4)[^>]*?(height=(['"]?)(?:600?|90|240)\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 125*125 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)125\4)[^>]*?(height=(['"]?)125\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 160*600 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)160\4)[^>]*?(height=(['"]?)600\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 180*150 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)180\4)[^>]*?(height=(['"]?)150\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 234*60, 468*60 (Most Banners!) -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)(?:234|468)\4)[^>]*?(height=(['"]?)60\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 240*400 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)240\4)[^>]*?(height=(['"]?)400\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 250*250, 300*250 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)(?:250|300)\4)[^>]*?(height=(['"]?)250\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig -# 336*280 -s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)336\4)[^>]*?(height=(['"]?)280\6)[^>]*?(?=/?>)@\ - <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig - -# Note: 200*50 was also proposed, but it probably causes too much collateral damage: -# -#s@<img\s+(?:src\s*=\s*(['"]?)([^>\\1\s]+)\1)?[^>]*?(width=(['"]?)200\4)[^>]*?(height=(['"]?)50\6)[^>]*?(?=/?>)@\ -# <img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed-$2-by-size" $3 $5@sig - - -################################################################################# -# -# banners-by-link: Kill banners by their links to known clicktrackers (Experimental). -# -################################################################################# -FILTER: banners-by-link Kill banners by their links to known clicktrackers. - -# Common case with width and height attributes: -# -s@<a\s+href\s*=\s*(['"]?)([^>\1\s]*?(?:\ - adclick # See www.dn.se \ -| advert # see dict.leo.org \ -| atwola.com/(?:link|redir) # see www.cnn.com \ -| doubleclick.net/jump/ # redirs for doublecklick.net ads \ -| counter # common \ -| (?<!&type=)tracker # (&type=tracker is used in sf's project statistics) \ -| adlog.pl # see sf.net \ -)[^>\1\s]*)\1[^>]*>\s*<img\s+(?:src\s*=\s*(['"]?)([^>\\3\s]+)\3)?[^>]*((?:width|height)\s*=\s*(['"]?)\d+?\6)[^>]*((?:width|height)\s*=\s*(['"]?)\d+?\8)[^>]*?(?=/?>)\ -@<img $5 $7 src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed $4 by link to $2"@sigx - -# Rare case w/o explicit dimensions: -# -s@<a\s+href\s*=\s*(['"]?)([^>\1\s]*?(?:ad(?:click|vert)|atwola.com/(?:link|redir)|doubleclick.net/jump/|(?<!&type=)tracker|counter|adlog.pl)[^>\1\s]*)\1[^>]*>\s*<img\s+(?:src\s*=\s*(['"]?)([^>\\3\s]+)\3)?[^>]*?(?=/?>)@<img src="http://config.privoxy.org/send-banner?type=auto" border="0" title="Killed $4 by link to $2"@sig - - -################################################################################ -# -# webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking). -# -################################################################################# -FILTER: webbugs Squish WebBugs (1x1 invisible GIFs used for user tracking). - -s@<img[^>]*\s(?:width|height)\s*=\s*['"]?[01](?=\D)[^>]*\s(?:width|height)\s*=\s*['"]?[01](?=\D)[^>]*?>@@siUg - - -################################################################################# -# -# tiny-textforms: Extend those tiny textareas up to 40x80 and kill the hard wrap. -# -################################################################################# -FILTER: tiny-textforms Extend those tiny textareas up to 40x80 and kill the hard wrap. - -s/(<textarea[^>]*?)(?:\s*(?:rows|cols)=(['"]?)\d+\2)+/$1 rows=$2\40$2 cols=$2\80$2/ig -s/(<textarea[^>]*?)wrap=(['"]?)hard\2/$1/ig - - -################################################################################# -# -# jumping-windows: Prevent windows from resizing and moving themselves. -# -################################################################################# -FILTER: jumping-windows Prevent windows from resizing and moving themselves. - -s/(?<=[\W])(?:window|this|self).(?:move|resize)(?:to|by)(/''.concat(/ig - -################################################################################# -# -# frameset-borders: Give frames a border, make them resizable and scrollable. -# -################################################################################# -FILTER: frameset-borders Give frames a border and make them resizable. - -s/(<frameset\s+[^>]*)framespacing=(['"]?)(no|0)\2/$1/igU -s/(<frameset\s+[^>]*)frameborder=(['"]?)(no|0)\2/$1/igU -s/(<frameset\s+[^>]*)border=(['"]?)(no|0)\2/$1/igU -s/(<frame\s+[^>]*)noresize/$1/igU -s/(<frame\s+[^>]*)frameborder=(['"]?)(no|0)\2/$1/igU -s/(<frame\s+[^>]*)scrolling=(['"]?)(no|0)\2/$1/igU - - - -################################################################################# -# -# demoronizer: Correct Microsoft's abuse of standardized character sets, which -# leave the browser to (mis)-interpret unknown characters, with -# sometimes bizarre results on non-MS platforms. -# -# credit: ripped from the demoroniser.pl script by: -# John Walker -- January 1998, http://www.fourmilab.ch/webtools/demoroniser -# -################################################################################# -FILTER: demoronizer Fix MS's non-standard use of standard charsets. - -s/(&#[0-2]\d\d)\s/$1; /g -# per Robert Lynch: http://slate.msn.com//?id=2067547, just a guess. -# Must come before x94 below. -s/\xE2\x80\x94/ -- /g -s/\x82/,/g -#s-\x83-<em>f</em>-g -s/\x84/,,/g -s/\x85/.../g -#s/\x88/^/g -#s-\x89- °/°°-g -s/\x8B/</g -s/\x8C/Oe/g -s/\x91/`/g -s/\x92/'/g -s/(\x93|\x94)/"/g -# Bullet type character. -s/\x95/·/g -s/\x96/-/g -s/\x97/--/g -#s-\x98-<sup>~</sup>-g -#s-\x99-<sup>TM</sup>-g -# per Robert Lynch. -s/\x9B/>/g # 155 - - -################################################################################# -# -# shockwave-flash: Kill embedded Shockwave Flash objects. -# Note: Better just block "/.*.swf$"! -# -################################################################################# -FILTER: shockwave-flash Kill embedded Shockwave Flash objects. - -s|<object [^>]*macromedia.*</object>|<!-- Squished Shockwave Object -->|sigU -s|<embed [^>]*(application/x-shockwave-flash|.swf).*>(.*</embed>)?|<!-- Squished Shockwave Flash Embed -->|sigU - - -################################################################################# -# -# quicktime-kioskmode: Make Quicktime movies saveable. -# -################################################################################# -FILTER: quicktime-kioskmode Make Quicktime movies saveable. - -s/(<embed\s+[^>]*)kioskmode\s*=\s*(["']?)true\2/$1/ig - - -################################################################################# -# -# fun: Text replacements for subversive browsing fun! -# -################################################################################# -FILTER: fun Text replacements for subversive browsing fun! - -# SCNR -# -s/microsoft(?!.[^\s])/MicroSuck/ig - -# Buzzword Bingo (example for extended regex syntax) -# -s* (?:industry|world)[ -]leading \ -| cutting[ -]edge \ -| customer[ -]focused \ -| market[ -]driven \ -| award[ -]winning # Comments are OK, too! \ -| high[ -]performance \ -| solutions[ -]based \ -| unmatched \ -| unparalleled \ -| unrivalled \ -*$0<sup><font color="red"><b>Bingo!</b></font></sup> \ -*igx - -# For Germans only -# -s/(M|m)edien(?![^<]*>)/$1ädchen/Ug - -################################################################################# -# -# crude-parental: Crude parental filtering. Use with a suitable blocklist. -# Pages are "blocked" based on keyword matching. -# -################################################################################# -FILTER: crude-parental Crude parental filtering. Note that this filter doesn't work reliably. - -# (Note: Middlesex, Sussex and Essex are counties in the UK, not rude words) -# (Note #2: Is 'sex' a rude word?!) - -s%^.*(?<!middle)(?<!sus)(?<!es)sex.*$%<html><head><title>Blocked</title></head><body>\ -<h3>Blocked by Privoxy's crude-parental filter due to possible adult content.</h3></body></html>%is - -s+^.*warez.*$+<html><head><title>No Warez</title></head><body><h3>You're not searching for illegal stuff, are you?</h3></body></html>+is - -# Remove by description -s/^.*\ -(?:(suck|lick|tongue|rub|fuck|fingering|finger|chicks?)\s*)?\ -(?:(her|your|my|hard|with|big|wet|tight|pink|hot|moist|young|teen)\s*)+\ -(dicks?|penis|cocks?|balls?|tits?|pussy|cunt|clit|ass|mouth).*$\ -/This page has been blocked by Privoxy's crude-parental content filter\ -/is - -#Remove by link text -s/^.*\ -(download|broadband|view|watch|free|get|extreem)?\s*\ -(sex|xxx|porn|cumshot|fuck(ing|s)?|anal|ass|asian|adult|Amateur|org(y|ies)|close ups?|hand?job|nail(ed)?)+\s*\ -(movies?|pics?|videos?|dvds?|dvd's|links?).*$\ -/This page has been blocked by Privoxy's crude-parental content filter\ -/is - -#Remove by age disclaimer -s/^.*\ -(models?|chicks?|girls?|women|persons)\s*\ -(who|are|were)+ (over|at least) (16|18|21) years (old|of age).*$\ -/This page has been blocked by Privoxy's crude-parental content filter\ -/is - -#Remove by regulations -s/^.*(Section 2257|18 U.?S.?C.? 2257).*$\ -/This page has been blocked by Privoxy's crude-parental content filter\ -/is - - -################################################################################# -# -# IE-Exploits: Disable some known Internet Explorer bug exploits. -# -################################################################################# -FILTER: ie-exploits Disable some known Internet Explorer bug exploits. - -# Note: This is basically a demo and waits for someone more interested in IE -# security (sic!) to take over. - -# Cross-site-scripting: -# -s%f("javascript:location.replace('mk:@MSITStore:C:')");%alert("This page looks like it tries to use a vulnerability described here:\n http://online.securityfocus.com/archive/1/298748/2002-11-02/2002-11-08/2%22%... - -# Address bar spoofing (http://www.secunia.com/advisories/10395/): -# -s/(<a[^>]*href[^>]*)(?:\x01|\x02|\x03|%0[012])@/$1MALICIOUS-LINK@/ig - -# Nimda: -# -s%<script language="JavaScript">(window.open|1;''.concat)("readme.eml", null, "resizable=no,top=6000,left=6000")</script>%<br><font size="7"> WARNING: This Server is infected with <a href="http://www.cert.org/advisories/CA-2001-26.html">Nimda</a>!</font>%g - - -################################################################################# -# -# -# site-specifics: Cure for site-specific problems. Don't apply generally! -# -# Note: The fixes contained here are so specific to the problems of the -# particular web sites they are designed for that they would be a -# waste of CPU cycles (or even destructive!) on 99.9% of the web -# sites where they don't apply. -# -################################################################################# -FILTER: site-specifics Cure for site-specific problems. Don't apply generally! - -# www.spiegel.de excludes X11 users from viewing Flash5 objects - shame. -# Apply to: www.spiegel.de/static/js/flash-plugin.js -# -s/indexOf("x11")/indexOf("x13")/ - -# www.quelle-bausparkasse.de uses a very stupid redirect mechanism that -# relies on a webbug being present. Can we tolerate that? No! -# Apply to: www.quelle-bausparkasse.de/$ -# -s/mylogfunc()//g - -# groups.yahoo.com has splash pages that one needs to click through in -# order to access the actual messages. Let the browser do that. Thanks -# to Paul Jobson for this one: -# -s|<a href="(.+?)">(?:Continue to message|Weiter zu Nachricht)</a>|<meta http-equiv="refresh" content="0; URL=$1">|ig - -# monster.com has two very similar gimmicks: -# -s|<input type="hidden" name="REDIRECT" value="(.+?)">|<meta http-equiv="refresh" content="0; URL=$1">|i - -s|<IMG SRC="http://media.monster.com/mm/usen/my/no_thanks_211x40.gif%22.+?%3E%7C<meta http-equiv="refresh" content="0; URL=http://my.monster.com/resume.asp">|i - -# nytimes.com triggers popups through the onload handler of dummy images -# to fool popup-blockers. -# -s|(<img [^>]*)onload|$1never|sig - -# Pre-check all the "Discard" buttons in GNU Mailman's web interface. -# (This saves a lot of mouse aiming practice when flushing spamtraps) -# -s|(<INPUT name="\d{2,4}" type="RADIO" value="0") CHECKED |$1|g -s|<INPUT name="\d{2,4}" type="RADIO" value="3" |$0 checked|g - -################################################################################# -# -# no-ping: Removes non-standard ping attributes in <a> and <area> tags. -# -################################################################################# -FILTER: no-ping Removes non-standard ping attributes in <a> and <area> tags. -s@(<a(?:rea)?[^>]*?)\sping=(['"]?)([^"'>]+)\2([>\s]?)@\ -<strong style="color:white; background-color:red;" title="Privoxy removed ping target '$3'">PING!</strong>\n$1$4@ig - -################################################################################# -# -# google: CSS-based block for Google text ads. Also removes -# a width limitation and the toolbar advertisement. -# -################################################################################# -FILTER: google CSS-based block for Google text ads. Also removes a width limitation and the toolbar advertisement. - -s@</head>@<style type="text/css">\n\ - /* Style sheet inserted by Privoxy's google filter. */\n\ - #fbc, #fbl, #ra, .rhh {visibility: hidden !important;}\n\ - #tpa1,#tpa2,#tpa3,#tpa4,#tpa5,#tpa5, #spl, .ch, #ads,\ - #toolbar, #google_ads_frame, #mbEnd {display: none !important;}\n\ - .main_body, .j {width: 100%}\n</style>\n$0@ -s@<div style="padding-top:11px;min-width:500px">@<div id="main_body">@ -s@(<table cellspacing=0 cellpadding=0 width=25% align=right bgcolor=#ffffff border=0\ -|</font></td></tr></tbody></table><table align="right" bgcolor="#ffffff"\ -|<table cellspacing=0 cellpadding=0 align=right bgcolor=#ffffff border=0\ -|<table style="clear:both" align=right width=25% cellspacing="0" cellpadding="0"\ - border="0" bgcolor="#ffffff")@$0 id="ads"@ -s@(<br clear=all><table)( border=0 cellpadding=9><tr><td)@$1 id="toolbar"$2@ - -################################################################################# -# -# yahoo: CSS-based block for Yahoo text ads. Also removes a width limitation. -# -################################################################################# -FILTER: yahoo CSS-based block for Yahoo text ads. Also removes a width limitation. - -s@</head>@\n<style type="text/css">\n\ - /* Style sheet inserted by Privoxy's yahoo filter. */\n\ - #symadbn, #ymadbn, .yschbox, .yschhd, .bbox, #yschsec, #sec,\ - #yschanswr, .yschftad, .yschspn, .yschspns, #ygrp-sponsored-links,\ - #nwad, #MWA2, #MSCM, #yregad, \ - #ks-ypn-ads, .ad, #east, #ygrp-vital {display: none !important;}\n\ - #yschpri, #yschweb, #pri, #web, #main {width: 100% !important; max-width: 100% !important;}\n\ - #yschqcon, #yschtg {width: auto !important; /* No useless horizontal scrollbar please */}\n\ - #composebox #compose_editorArea {width: 70% !important; /* reasonably sized reply textarea please */\n\ - </style>\n$0\n@ - -s@(<textarea\s+id="composeArea"[^>]*)width:545px;@$1width:70%;@isU - -################################################################################# -# -# msn: CSS-based block for MSN text ads. Also removes tracking URLs -# and a width limitation. -# -################################################################################# -FILTER: msn CSS-based block for MSN text ads. Also removes tracking URLs and a width limitation. - -s@</head>@<style type="text/css">\n\ - /* Style sheet inserted by Privoxy's msn filter. */\n\ - .msn_ads, #at, #ar, .mktmsg {display: none !important;}\n\ - #results, .flank, .results_area_flank, .results_area_stroke,\n\ - #results_area, .SearchSection, .not, .sc_rslth1\n\ -.content, #sw_foot, #bf, #sw_content, #sidebar, #pag\n\ - {width: 99% !important; min-width: 99% !important;\n\ - max-width: 100% !important; /* width:100% sometimes causes horizontal scrollbars */}\n\ - /* Remove "suggestions". They are next to worthless but partly overlap with the search results */\n\ - .suggestion, #nys_right, #nys {clear: both; display:none;}\n\ - #content {padding-right: 0;}\n\ - </style>\n$0@ -# Are these ids still in use? -s@(<div[^>]*) id=(["']?)ads_[^\2]*\2@$1 class="msn_ads"@Uig -s@(<div[^>]*) class=(["']?)sb_ads[^\2]*\2@$1 class="msn_ads"@Uig -s@(<a[^>]*href=")http://g.msn.com/.*%5C?(http://.*)(&&DI=.*)(%5C%22)@$1$2$4@Ug -s@(<a[^>]*)gping=".*"@$1 title="URL cleaned up by Privoxy's msn filter"@Ug - -################################################################################# -# -# blogspot: Cleans up some Blogspot blogs. Read the fine print before using this. -# -# This filter also intentionally removes some navigation stuff and -# sets the page width to 100%. As a result, some rounded "corners" would -# appear to early or not at all and as fixing this would require a browser -# that understands background-size (CSS3), they are removed instead. -# -# When applied to feeds, it removes comment titles that -# only contain the beginning of the actual comment. -# -################################################################################# -FILTER: blogspot Cleans up some Blogspot blogs. Read the fine print before using this. - -s@</head>@<style type="text/css">\n\ - /* Style sheet inserted by Privoxy's blogspot filter. */\n\ - #powered-by {display: none !important;}\n\ - #wrap4, #wrapper {margin-top: 0px }\n\ - #blogheader, #header {margin-top: 0.5em !important}\n\ - #content {width: 98% }\n\ - #main {width: 70% }\n\ - #sidebar {width: 29% }\n\ - .post-body {overflow: auto;}\n\ - .blogComments {width: 100%; overflow: auto;}\n</style>\n$0@ -s@<body.*(?:<div id="space-for-ie"></div>|(<div id="(?:content|wrap4|wrapper)))@<body>\ - <!-- Privoxy's blogspot filter ditched some garbage here -->$1@Us -s@(<div style="[^"]*width:)30em@$1 100%@ -s@background:url("http://www.blogblog.com/rounders%5B%5E%5C%22%5D*%5C%22%5C).*;@/*$0*/@Ug -s@(background:#[a-f\d]{3})( url("http://www.blogblog.com/rounders%5B%5E%5C%22%5D*%5C%22%5C).*;)@$1 ;/*$2*/@Ug -# Do the feed filtering magic as described above. -s@<title(?:\s+type='text')?>([^<]*)(?:...)?\s*</title>\s*\ -(<content(?:\s+type='(?:html|text)')?>\s*\1)@<title></title>$2@ig - -################################################################################# -# -# x-httpd-php-to-html: Changes the Content-Type header from -# x-httpd-php to html. "Content-Type: x-httpd-php" -# is set by clueless PHP users and causes many -# browsers do open a download menu instead of -# rendering the page. -# -################################################################################# -SERVER-HEADER-FILTER: x-httpd-php-to-html Changes the Content-Type header from x-httpd-php to html. - -s@^(Content-Type:)\s*application/x-httpd-php@$1 text/html@i - -################################################################################# -# -# html-to-xml: Changes the Content-Type header from html to xml. -# -################################################################################# -SERVER-HEADER-FILTER: html-to-xml Changes the Content-Type header from html to xml. - -s@^(Content-Type:)\s*text/html(;.*)?$@$1 application/xhtml+xml$2@i - -################################################################################# -# -# xml-to-html: Changes the Content-Type header from xml to html. -# -################################################################################# -SERVER-HEADER-FILTER: xml-to-html Changes the Content-Type header from xml to html. - -s@^(Content-Type:)\s*(?:application|text)/(?:xhtml+)?xml(;.*)?$@$1 text/html$2@i - -################################################################################# -# -# hide-tor-exit-notation: Remove the Tor exit node notation in Host and Referer headers. -# -# Note: If Privoxy and Tor are chained and Privoxy is configured to -# use socks4a, one can use http://www.example.org.foobar.exit/ -# to access the host www.example.org through Tor exit node foobar. -# -# As the HTTP client isn't aware of this notation, it treats the -# whole string "www.example.org.foobar.exit" as host and uses it -# for the "Host" and "Referer" headers. From the server's point of -# view the resulting headers are invalid and can cause problems. -# -# An invalid "Referer" header can trigger "hot-linking" protections, -# an invalid "Host" header will make it impossible for the server to -# find the right vhost (several domains hosted on the same IP address). -# -# This filter removes the "foo.exit" part in those headers -# to prevent the mentioned problems. Note that it only modifies -# the HTTP headers, it doesn't make it impossible for the server -# to detect your Tor exit node based on the IP address the request is -# coming from. -# -################################################################################# -CLIENT-HEADER-FILTER: hide-tor-exit-notation Removes the Tor exit node notation in Host and Referer headers. - -s@^((?:Referer|Host):\s*(?:https?://)?[^/]*).[^./]*?.exit@$1@i - -################################################################################# -# -# less-download-windows: Prevents annoying download windows for content types -# the browser can handle itself. -# -################################################################################# -SERVER-HEADER-FILTER: less-download-windows Prevent annoying download windows for content types the browser can handle itself. - -s@^Content-Disposition:.*filename=(["']?).*.(png|gif|jpe?g|diff?|d?patch|c|h|pl|shar)\1.*$@@i -s@^(Content-Type:)\s*(?:message/(?:news|rfc822)|text/x-.*|application/x-sh(?:\s|$))\s*@$1 text/plain@i - -################################################################################# -# -# image-requests: Tags detected image requests as "IMAGE-REQUEST". Whether -# or not the detection actually works depends on the browser. -# -################################################################################# -CLIENT-HEADER-TAGGER: image-requests Tags detected image requests as "IMAGE-REQUEST". - -s@^Accept:\s*image/.*@IMAGE-REQUEST@i - -################################################################################# -# -# css-requests: Tags detected CSS requests as "CSS-REQUEST". Whether -# or not the detection actually works depends on the browser. -# -################################################################################# -CLIENT-HEADER-TAGGER: css-requests Tags detected CSS requests as "CSS-REQUEST". - -s@^Accept:\s*text/css.*@CSS-REQUEST@i - -################################################################################# -# -# client-ip-address: Tags the request with the client's IP address. -# -################################################################################# -CLIENT-HEADER-TAGGER: client-ip-address Tags the request with the client's IP address. - -s@^\w*\s+.*\s+HTTP/\d.\d\s*@IP-ADDRESS: $origin@D - -################################################################################# -# -# http-method: Tags the request with its HTTP method. -# -################################################################################# -CLIENT-HEADER-TAGGER: http-method Tags the request with its HTTP method. - -s@^(\w*).*HTTP/\d.\d\s*$@$1@i - -################################################################################# -# -# allow-post: Tags POST requests as "ALLOWED-POST". -# -################################################################################# -CLIENT-HEADER-TAGGER: allow-post Tags POST requests as "ALLOWED-POST". - -s@^(?:POST)\s+.*\s+HTTP/\d.\d\s*@ALLOWED-POST@i - -################################################################################# -# -# complete-url: Tags the request with the whole request URL. -# -################################################################################# -CLIENT-HEADER-TAGGER: complete-url Tags the request with the whole request URL. - -s@^\w*\s+(.*)\s+HTTP/\d.\d\s*$@$1@i - -################################################################################# -# -# user-agent: Tags the request with the complete User-Agent header. -# -################################################################################# -CLIENT-HEADER-TAGGER: user-agent Tags the request with the complete User-Agent header. - -s@^User-Agent:.*@$0@i - -################################################################################# -# -# content-type: Tags the request with the content type declared by the server. -# -################################################################################# -SERVER-HEADER-TAGGER: content-type Tags the request with the content type declared by the server. - -s@^Content-Type:\s*([^;]+).*@$1@i - -################################################################################# -# -# privoxy-control: The taggers create tags with the content of X-Privoxy-Control -# headers, the filters remove said headers. -# -################################################################################# -CLIENT-HEADER-TAGGER: privoxy-control Creates tags with the content of X-Privoxy-Control headers. - -s@^X-Privoxy-Control:\s*@@i - -CLIENT-HEADER-FILTER: privoxy-control Removes X-Privoxy-Control headers. - -s@^X-Privoxy-Control:.*@@i - -SERVER-HEADER-TAGGER: privoxy-control Creates tags with the content of X-Privoxy-Control headers. - -s@^X-Privoxy-Control:\s*@@i - -SERVER-HEADER-FILTER: privoxy-control Removes X-Privoxy-Control headers. - -s@^X-Privoxy-Control:.*@@i - - -############################################################################## -# -# Revisions : -# $Log: default.filter,v $ -# Revision 1.71 2009/03/01 18:33:17 ler762 -# couple of changes to the yahoo filter -# -get a bigger email message reply textarea -# -block a few more ads -# -remove the now useless northbanner css change -# -# Revision 1.70 2009/02/21 13:01:51 fabiankeil -# Make blogspot's feed magic slightly more reliable. -# -# Revision 1.69 2009/02/12 15:40:11 ler762 -# more yahoo email ad blocking -# -# Revision 1.68 2008/09/19 13:26:04 fabiankeil -# s@tounge@tongue@. Anonymously reported in #1648657. -# -# Revision 1.67 2008/08/06 17:38:06 fabiankeil -# In banners-by-size, make sure white-space around the height -# attribute is removed as well and replace two spaces with -# "\s" so we don't get fooled by tabs. Fixes #2036125. -# -# Revision 1.66 2008/08/03 17:27:47 fabiankeil -# Teach msn filter to catch a few new ad classes. -# -# Revision 1.65 2008/07/21 13:43:44 fabiankeil -# Fix img-reorder regression introduced with my last commit. -# Some tags were terminated too soon, letting the browser render -# some of their arguments as text. Oops. -# -# Revision 1.64 2008/07/12 15:49:09 fabiankeil -# - Don't let img-reorder touch width attributes -# that aren't followed by either whitespace or '>', -# as those usually indicate onclick nonsense. -# Problem and solution reported by Glenn Washburn in #2014552. -# - While at it, don't use more groups than necessary. -# -# Revision 1.63 2008/06/27 12:53:41 fabiankeil -# Make sure the taggers css-requests and image-requests -# only match at the beginning of the header. -# -# Revision 1.62 2008/06/21 17:02:03 fabiankeil -# Fix typo. -# -# Revision 1.61 2008/05/21 18:44:43 fabiankeil -# - Let the content-type tagger ignore headers without value. -# - Remove a few unused lines at the end of the file. -# -# Revision 1.60 2008/04/26 10:36:41 fabiankeil -# Let the msn filter hide another class. -# -# Revision 1.59 2008/04/23 16:18:18 fabiankeil -# s@declarded@declared@ -# -# Revision 1.58 2008/02/02 15:27:19 fabiankeil -# Yet another yahoo update to get the width limitation removal working again. -# -# Revision 1.57 2008/01/26 15:45:39 fabiankeil -# Don't let the less-download-windows filter mess up -# "Content-Type: application/x-shockwave-flash" headers. -# -# Revision 1.56 2008/01/25 19:12:40 fabiankeil -# - Add yet another new yahoo ad id. -# - Don't let the first banners-by-link job punish URLs for merely -# containing the pattern "/jump/" when it should really look for -# "doubleclick.net/jump/". -# -# Revision 1.55 2007/12/31 19:53:59 fabiankeil -# Let the msn filter remove the width limitation again. -# -# Revision 1.54 2007/12/31 19:11:31 fabiankeil -# - Let the yahoo filter remove the width limitation again. -# - Teach the blogspot filter to remove useless feed comment -# titles that only contain the beginning of the actual comment. -# -# Revision 1.53 2007/12/23 15:48:12 fabiankeil -# - Lo and behold, the CSS fix for the MSN buttons is no longer necessary. -# - Add some new selectors the msn filter should hide. -# - Add the two yahoo selectors Lee reported in #1856574. -# - Add comments that the width limitation fixes stopped -# working for the msn and yahoo filter. -# -# Revision 1.52 2007/11/27 18:35:48 fabiankeil -# Update CSS for the yahoo filter. -# -# Revision 1.51 2007/11/04 16:15:11 fabiankeil -# - Add client-header taggers: client-ip-address, -# http-method, allow-post, complete-url and user-agent. -# - Add server-header tagger: content-type. -# -# Revision 1.50 2007/11/03 15:05:30 fabiankeil -# Consistently use an empty line between the description and the PCRS code -# and end descriptions with dots. Patch submitted by Simon Ruderich. -# -# Revision 1.49 2007/11/03 14:29:41 fabiankeil -# Spelling fixes mostly submitted by Simon Ruderich. -# -# Revision 1.48 2007/10/17 18:11:32 fabiankeil -# Add privoxy-control header filters and taggers. -# -# Revision 1.47 2007/10/06 15:45:25 fabiankeil -# Let msn hide sponsored links in #at divs. -# -# Revision 1.46 2007/10/06 09:54:13 fabiankeil -# - Let msn hide sponsored links in #ar divs. -# - Teach banners-by-link not to block the graphs for sf's tracker statistics. -# -# Revision 1.45 2007/08/11 16:54:12 fabiankeil -# - Complete the changes from r1.42. -# - Make crude-parental less sensitive to the amount of white-space, -# add the note that it doesn't work too well again and replace the -# DMOZ link with a less confusing explanation. -# -# Revision 1.44 2007/07/18 11:06:56 hal9 -# Replace notarget with '' in all popups filter to keep from breaking xhmtl per -# report from Siegfried Gipp. -# -# Revision 1.43 2007/06/01 14:17:04 fabiankeil -# Mention possible delimiter conflicts with variables in dynamic pcrs commands. -# -# Revision 1.42 2007/05/17 15:55:36 fabiankeil -# Undo an improperly tested last-minute change -# and turn "text-requests" back into "css-requests". -# -# Revision 1.41 2007/05/17 15:45:41 fabiankeil -# - Mention new filter types and the 'D' option. -# - Header filters are now case-insensitive and accept a -# varying amount of whitespace after the colon. -# - Add another selector for yahoo ads. -# - New server-header filter: less-download-windows -# - New client-header taggers: text-requests and image-requests. -# -# Revision 1.40 2007/03/20 15:40:00 fabiankeil -# Adjust to new world order with dedicated header-filter actions. -# -# Revision 1.39 2007/02/21 14:10:23 fabiankeil -# - Fix a js-annoyances pcrs command that broke -# evaluated code. (BR #1124071, thanks to Bor Gergely) -# - Have unsolicited-popups and all-popups catch the -# wheather.com popup reported in in AF #1640173. -# -# Revision 1.38 2007/02/19 11:22:48 hal9 -# Adding back the orginal filter content to offset problems found by Fabian. -# -# Revision 1.37 2007/02/17 13:29:44 hal9 -# Updates to the crude parental filter per Feature Requests item #1648657. -# -# Revision 1.36 2007/02/05 16:47:31 fabiankeil -# - Let banners-by-link look for "advert". -# - Fix XML systax problems with banners-by-link -# and banners-by-size (AF#1651570). -# -# Revision 1.35 2006/12/21 12:28:12 fabiankeil -# Escaping special characters in filter descriptions is no -# longer necessary, it's done by Privoxy now. -# -# Revision 1.34 2006/12/12 17:32:23 fabiankeil -# Added id mbEnd to google filter, it's now and then -# used for the sponsored links. -# -# Have js-annoyances try to prevent status bar -# modifications where the status bar text is -# inside another variable. Fixes 1605710. -# -# Revision 1.33 2006/11/16 17:10:43 fabiankeil -# Removed webbugs debugging comment again. -# The apostrophe could break JavaScript and -# the comment itself could mess up existing -# comments. -# -# Revision 1.32 2006/11/10 18:04:04 fabiankeil -# Have no-ping print the ping warning in red. -# -# Modified yahoo to keep in sync with recent -# CSS changes and to suppress a useless horizontal -# scrollbar. -# -# msn now makes sure that the continue-link boxes -# act as links (the original CSS just changes the cursor). -# -# Changed fun filter regex to leave microsoft links alone. -# Fixes BR 1019996. -# -# Revision 1.31 2006/10/21 13:12:28 fabiankeil -# Added no-ping and hide-tor-exit-notation. -# -# Adjusted jumping-windows to break less. -# Fixes BR 1146134. -# -# Revision 1.30 2006/10/18 12:36:50 fabiankeil -# google filter now cleans Google groups as well. -# -# Revision 1.29 2006/10/11 14:03:17 fabiankeil -# Changed img-reorder regex to only move width -# attributes if they are following at least one -# whitespace. Fixes BR 1328455. -# -# Revision 1.28 2006/10/11 13:31:13 fabiankeil -# Added Anduin Withers' js-annoyances fix -# for not messing up escaped quotes. Fixes BR 999765. -# -# Improved blogspot filter to make it less likely that -# the blogspot banner at the top of the page is missed. -# -# Revision 1.27 2006/10/08 17:00:51 fabiankeil -# Modified webbugs filter to create a comment around the offending -# image instead of removing it entirely. -# -# Adjusted regex to only match if there's at least one whitespace -# before the width and height attributes. Makes it more likely that -# they are indeed attributes, and not part of the value of another attribute. -# Solves BR 1035587. -# -# Thanks to Martin Thomas for diagnosing the cause of the problem. -# -# Revision 1.26 2006/10/06 18:06:16 fabiankeil -# Added header filter x-httpd-php-to-html -# and reverted another img-reorder whitespace -# problem. -# -# Revision 1.25 2006/10/06 15:26:09 fabiankeil -# Bumped copyright year. -# -# Reverted parts of the last img-reorder change -# which were intended to remove superfluous whitespace -# but had the side effect to mess up some tags. -# -# Modified banners-by-size and banners-by-link to -# use border value "0" instead of "\0". Fixes BR 1100065. -# -# Revision 1.24 2006/10/06 11:25:31 fabiankeil -# Taught img-reorder not to break img tags -# with empty src attributes. Fixes BR 1089474. -# Thanks to Raphael Moll for reporting. -# -# Revision 1.23 2006/10/05 14:46:28 fabiankeil -# Replaced "<" in img-reorder's description with "<". -# -# Modified msn filter to tag ads with classes instead -# of ids. There may be more than one ad per page, -# but ids are required to be unique. -# -# Revision 1.22 2006/10/04 19:17:14 fabiankeil -# Incorportated Frédéric Crozat's ie-exploits -# modification to make it less trigger-happy. -# -# Modified blogspot filter to make .post-body -# scrollable if necessary. -# -# Revision 1.21 2006/10/02 16:21:14 fabiankeil -# Adjusted yahoo filter to hide .yschspns as well. -# Added header filters: html-to-xml and xml-to-html. -# -# Revision 1.20 2006/10/01 21:00:22 fabiankeil -# New site-specific filters: google, yahoo, msn and blogspot. -# -# Revision 1.19 2006/07/18 14:48:45 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.11.2.23 2004/02/17 13:34:01 oes -# - Beefed up the protection of the unsolicited-popups -# filter against matching in JavaScript string constants. -# - Extended the fun filter with a German joke -# - Extended the site-specifics filter with a convenience -# reeplacement for managing mailing lists at SourceForge -# -# Revision 1.11.2.22 2004/01/30 15:29:29 oes -# Updated the copyright note -# -# Revision 1.11.2.21 2004/01/20 15:15:01 oes -# Detail enhancement in all-popups -# -# Revision 1.11.2.20 2004/01/06 16:46:14 oes -# Fixed a JS syntax problem in jumping-windows -# -# Revision 1.11.2.19 2003/12/17 17:09:25 oes -# Added remedy against IE address bar spoofing -# -# Revision 1.11.2.18 2003/12/02 11:25:27 oes -# Fixed a line trashed in previous commit -# -# Revision 1.11.2.17 2003/12/01 21:58:46 oes -# Assorted tuning: -# -# - unsolicited-popups no longer matches at start or end of quoted -# strings, and is now activated earlier and deactivated later in -# the page. -# - replacement images in banners-by-* now without border -# - more effective shockwave flash flattening -# - Custom annoyance filtering for Yahoo Groups, Monster.com, NY Times. -# -# Revision 1.11.2.16 2003/05/08 09:44:56 oes -# Allow extra parameters in blink,marquee tags. Fixes bug #734012 -# -# Revision 1.11.2.15 2003/03/30 13:57:08 oes -# Making unsolicited-popups safe for use on <html> tags enclosed in JS strings -# -# Revision 1.11.2.14 2003/03/19 13:17:50 oes -# - Added filter "site-specifics" to address site specific problems -# - Fixed a small problem in the img-reorder filter -# -# Revision 1.11.2.13 2003/03/18 19:28:59 oes -# Fixed a minor problem in the img-reorder filter -# -# Revision 1.11.2.12 2003/03/15 14:06:58 oes -# - Assorted refinements, optimizations and fixes in the js-annoyances, -# img-reorder, banners-by-size, banners-by-link, webbugs, refresh-tags, -# html-annoyances, content-cookies and fun filters -# - Replaced filter "popups" by choice between two modes: -# - "unsolicited-popups" tries to catch only the unsolicited ones -# - "all-popups" tries to kill them all (as before) -# - New filter "tiny-textforms" Help those tiny or hard-wrap textareas. -# - New filter "jumping-windows" that prevents windows from resizing -# and moving themselves -# - Replaced "nimda" with more general "ie-exploits" filter in which -# all filters for exploits shall be collected -# -# Revision 1.11.2.11 2002/11/12 16:14:43 oes -# Exchanged js-annoyance filter against status bar rewrites with improved version by Don Libes -# -# Revision 1.11.2.10 2002/11/11 13:39:47 oes -# Make refresh-tags filter work even on incorrect refresh tags like found on usatoday.com -# -# Revision 1.11.2.9 2002/11/08 16:39:17 oes -# Made img-reorder more cautious. Fixes bug #632715 -# -# Revision 1.11.2.8 2002/10/13 21:56:52 hal9 -# Adding demoronizer filter. This should include all the common abuses. I have -# left a few of the rare cases commented out (never found these in the wild). -# -# Revision 1.11.2.7 2002/09/25 15:09:39 oes -# Preserve original quoting style in <img> tags wherever possible. Fixes Bug #605956 -# -# Revision 1.11.2.6 2002/08/23 14:12:26 oes -# Proofed frameset-borders against "fremaborder=0 border=0" -# -# Revision 1.11.2.5 2002/08/22 15:05:20 oes -# Added Filter to make Quicktime movies saveable (thanks to aaron@linville.org for the idea) -# -# Revision 1.11.2.4 2002/08/10 11:32:29 oes -# Attribute values in replacement tags of banners-by-size filter now undelimited. (Fixes bug #592493) -# -# Revision 1.11.2.3 2002/08/05 11:43:56 oes -# Fixed a bug in the popups filter that was introduced with the last fix :-( -# -# Revision 1.11.2.2 2002/08/01 11:20:13 oes -# Fixed bugs 587802, 577802 and an unreported one -# -# Revision 1.11.2.1 2002/07/26 15:18:26 oes -# - All filters reviewed and many shorcomings fixed -# - New filters: img-reorder, banners-by-link and js-events -# - Jobs reorderd because they are now executed in order of -# appearance -# -# Revision 1.11 2002/05/24 00:57:18 oes -# Made WeBugs job ungreedy; Fixes bug 559190 -# -# Revision 1.10 2002/04/18 10:14:19 oes -# renamed some filters -# -# Revision 1.9 2002/04/11 07:36:35 oes -# Generalized js-popup filter -# -# Revision 1.8 2002/04/10 17:07:21 oes -# Fixed potentially desctructive jobs, added noflash filter -# -# Revision 1.7 2002/04/09 18:34:51 oes -# Fixed HTML syntax in replacements -# -# Revision 1.6 2002/04/03 19:49:52 swa -# name change -# -# Revision 1.5 2002/03/27 15:30:26 swa -# have a consistent appearance -# -# 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/external/privoxy/doc/gpl.html b/external/privoxy/doc/gpl.html deleted file mode 100644 index 17c517d..0000000 --- a/external/privoxy/doc/gpl.html +++ /dev/null @@ -1,560 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<!-- $Id: gpl.html,v 1.4 2002/04/08 20:39:43 swa Exp $ - - See copyright details at end of file - - After changing this file, please run it through "HTML Tidy" - (from http://www.w3.org/People/Raggett/tidy/) - It should have no warnings or errors. ---> - -<html> - <head> - <title>The GNU General Public License</title> - <meta name="description" content= - "GNU General Public License, as used by Junkbuster"> - <meta name="keywords" content=""> -<style type="text/css"> -<!-- -h2 { text-align: Center; font-family: arial, helvetica, sans-serif } -p.sans { font-family: arial, helvetica, sans-serif } -b.dot { color: #FF0000 } ---> -</style> - </head> - - <body bgcolor="#f8f8f0" link="#000078" alink="#ff0022" vlink= - "#787878"> - <p class="sans"><a href="http://www.privoxy.org/"> - Website</a> <b class="dot">·</b> <a href="ijbman.html"> - Manual</a> <b class="dot">·</b> <a href="ijbfaq.html"> - FAQ</a> <b class="dot">·</b> <b>GPL</b></p> - - <h1 align="center"><a name="top_of_page">Internet J<small>UNK<i - style="color: #FF0000">BUSTER</i></small> License</a></h1> - - <h1>This document is out of date</h1> - - <p><b>Development of Junkbuster is ongoing and this document is - no longer current. However, it may provide some assistance. If - you have problems, please use the <a href= - "http://groups.yahoo.com/group/junkbuster-users/%22%3EYahoo Groups - mailing list</a> (which includes an archive of mail), the - SourceForge.net <a href= - "http://sourceforge.net/projects/ijbswa/%22%3Eproject page</a>, or - see the project's <a href="http://www.privoxy.org/">home - page</a>. Please also bear in mind that versions 2.9.x of - Junkbuster are development releases, and are not production - quality.</b></p> - - <h3 align="center">The GNU General Public License</h3> - - <p class="sans"><a name="notus"><b>We did not write the GPL: - the <a href="http://www.fsf.org/fsf/fsf.html">Free Software - Foundation</a> did</b></a></p> - - <h3><img border="0" width="14" height="14" src="fb.gif" alt= - "*"> The GPL allows copying and changing of copyrighted - documents</h3> - - <p><a name="fsf">The Free Software Foundation</a> <a href= - "http://www.fsf.org/fsf/fsf.html%22%3E(FSF)</a> is a non-profit - institution that designed the GNU General Public License (GPL) - to promote the publication of free software. The GPL is used by - thousands of programmers who want to give others the right to - copy and modify the source code of their programs. Millions of - people benefit from this.</p> - - <p><a name="junkbuster">We use the GPL</a> to allow everyone to - use, copy and modify the Internet Junkbuster as they wish. <a - name="separate">Companies can use it for commercial - purposes,</a> but they are not permitted to use it in products - that they claim as their property.</p> - - <p><a name="text">The GPL</a> can also be used on documents - written in human languages. This documentation for the Internet - Junkbuster is also under the GPL. This means that you do not - have to break copyright laws in order to print a page or email - a screen of the text to someone, for example.</p> - - <p><a name="rest">The</a> remainder of this page is the text of - the GPL. As legal documents go it's relatively clear, but - unfortunately it's fairly long because it has to cover a lot of - details. The HTML formatting is ours, and should not be - misinterpreted as changing the license in any way.</p> - - <p align="center"><a href="#top_of_page"><img border="0" width= - "250" height="15" src="top.gif" alt= - "--- Back to Top of Page ---"></a></p> - - <h2><a name="v2">Version 2, June 1991</a></h2> - - <blockquote> - <a name="crn">Copyright 1989, 1991</a><br> - <a name="address">Free Software Foundation, Inc.</a><br> - 675 Mass Ave.<br> - Cambridge, MA 02139<br> - USA - </blockquote> - <a name="changing">Everyone</a> - - <p>is permitted to copy and distribute verbatim copies of this - license document, but changing it is not allowed.</p> - - <h3><a name="pream"><img border="0" width="14" height="14" src= - "fb.gif" alt="*"></a> Preamble</h3> - - <p>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.</p> - - <p><a name="freedom">When we speak of free software,</a> 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.</p> - - <p><a name="forbid">To protect your rights,</a> 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.</p> - - <p><a name="allrights">For example,</a> 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.</p> - - <p><a name="steps">We protect your rights with two steps:</a> - (1) copyright the software, and (2) offer you this license - which gives you legal permission to copy, distribute and/or - modify the software.</p> - - <p><a name="protection">Also,</a> 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.</p> - - <p><a name="threat">Finally,</a> 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.</p> - - <p><a name="terms">The precise terms and conditions</a> for - copying, distribution and modification follow.</p> - - <h3><a name="tnc"><img border="0" width="14" height="14" src= - "fb.gif" alt="*"></a> GNU General Public License: Terms - and Conditions for Copying, Distribution and Modification</h3> - - <p><a name="applies">O.</a> 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".</p> - - <p><a name="scope">Activities</a> 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).</p> - - <p><a name="depends">Whether that is true depends on what the - Program does.</a><br> - </p> - - <ol type="1"> - <li> - <a name="verbatim">You may copy</a> 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. - - <p><a name="fee">You may charge a fee</a> for the physical - act of transferring a copy, and you may at your option - offer warranty protection in exchange for a fee.</p> - </li> - - <li> - <a name="modify">You may modify</a> 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:<br> - - - <ol type="a"> - <li><a name="notices">You must cause</a> the modified - files to carry prominent notices stating that you changed - the files and the date of any change.</li> - - <li><a name="nocharge">You must</a> 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.</li> - - <li><a name="interactive">If the modified program</a> - 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.)</li> - </ol> - - <p><a name="sections">These requirements</a> 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.</p> - - <p><a name="intent">Thus,</a> 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.</p> - - <p><a name="aggregation">In addition,</a> 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.</p> - </li> - - <li> - <a name="exeutable">You may copy</a> 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:<br> - - - <ol type="a"> - <li><a name="medium">Accompany it</a> 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,</li> - - <li><a name="written">Accompany it with a written - offer,</a> 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,</li> - - <li><a name="distrib">Accompany it</a> 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.)</li> - </ol> - - <p><a name="preferred">The source code</a> 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.</p> - - <p><a name="access">If distribution of executable or object - code is made</a> 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.</p> - </li> - - <li><a name="otherwise">You may not copy,</a> 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.</li> - - <li><a name="voluntary">You are not required</a> 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.</li> - - <li><a name="redistrib">Each time you redistribute</a> 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.</li> - - <li> - <a name="patent">If, as a consequence of a court - judgment</a> 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. - - <p><a name="invalid">If any portion</a> 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.</p> - - <p><a name="induce">It is not the purpose</a> 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.</p> - - <p><a name="clarify">This section</a> is intended to make - thoroughly clear what is believed to be a consequence of - the rest of this License.</p> - </li> - - <li><a name="geog">If the distribution</a> 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.</li> - - <li><a name="revise">The Free Software Foundation</a> 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.</li> - - <li> - <a name="permission">If you wish to incorporate parts</a> - 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. - - <p><a name="nowarr">NO WARRANTY</a></p> - </li> - - <li><a name="foc">BECAUSE THE PROGRAM IS LICENSED FREE OF - CHARGE,</a> 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.</li> - - <li><a name="liable">IN NO EVENT UNLESS REQUIRED</a> 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.</li> - </ol> - - <p>END OF TERMS AND CONDITIONS<br> - <br> - </p> - - <h3><a name="append"><img border="0" width="14" height="14" - src="fb.gif" alt="*"></a> Appendix: How to Apply These - Terms to Your New Programs</h3> - - <p>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.</p> - - <p><a name="attach">To do so,</a> 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.</p> - - <blockquote> - <one line to give the program's name and a brief idea of - what it does.> Copyright (C) 19yy <name of author> - - <p><a name="free">This program is free software;</a> you can - redistribute it and/or modify it 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.</p> - - <p><a name="merchant">This program</a> 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.</p> - - <p><a name="ifnot">You should</a> 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.</p> - </blockquote> - - <p><a name="contact">Also add</a> information on how to contact - you by electronic and paper mail.</p> - - <p><a name="short">If the program is interactive,</a> make it - output a short notice like this when it starts in an - interactive mode:</p> - - <blockquote> - Gnomovision version 69, Copyright (C) 19yy 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. - </blockquote> - - <p><a name="hypo">The hypothetical</a> 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.</p> - - <p><a name="disclaimer">You should also get your employer</a> - (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:</p> - - <blockquote> - Yoyodyne, Inc., hereby disclaims all copyright interest in - the program `Gnomovision' (which makes passes at compilers) - written by James Hacker. <signature of Ty Coon>, 1 - April 1989<br> - Ty Coon, President of Vice - </blockquote> - - <p><a name="library">This General Public License</a> 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.</p> - - <p align="center"><a href="#top_of_page"><img border="0" width= - "250" height="15" src="top.gif" alt= - "--- Back to Top of Page ---"></a></p> - - <p class="sans"><a href="http://www.privoxy.org/"> - Website</a> <b class="dot">·</b> <a href="ijbman.html"> - Manual</a> <b class="dot">·</b> <a href="ijbfaq.html"> - FAQ</a> <b class="dot">·</b> <b>GPL</b></p> - - <p class="sans"><small><small><a href="gpl.html#text"> - Copyright</a> © 1996-8 <a href= - "http://www.junkbusters.com/%22%3EJunkbusters</a> <a href= - "http://www.junkbusters.com/ht/en/legal.html#marks%22%3E%C2%AE;</a> - Corporation. <a href="gpl.html#text">Copyright</a> © 2001 - <a href="http://sourceforge.net/projects/ijbswa/">Jon - Foster</a>. Copying and distribution permitted under the <a - href="gpl.html">GNU</a> General Public License. The text of the - GNU GPL itself is copyrighted by the FSF, and may be copied but - not modified.</small></small></p> - - <p><small><code><a href= - "http://sourceforge.net/projects/ijbswa/%22%3E - http://sourceforge.net/projects/ijbswa/</a></code></small></p> - </body> -</html> - diff --git a/external/privoxy/doc/pcrs.3 b/external/privoxy/doc/pcrs.3 deleted file mode 100644 index 59e0f22..0000000 --- a/external/privoxy/doc/pcrs.3 +++ /dev/null @@ -1,488 +0,0 @@ -." Copyright (c) 2001-2003 Andreas S. Oesterhelt oes@oesterhelt.org -." -." This is free documentation; you can redistribute it and/or -." modify it under the terms of the GNU General Public License as -." published by the Free Software Foundation; either version 2 of -." the License, or (at your option) any later version. -." -." The GNU General Public License's references to "object code" -." and "executables" are to be interpreted as the output of any -." document formatting or typesetting system, including -." intermediate and printed output. -." -." This manual is distributed in the hope that it will be useful, -." but WITHOUT ANY WARRANTY; without even the implied warranty of -." MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -." GNU General Public License for more details. -." -." You should have received a copy of the GNU General Public -." License along with this manual; if not, write to the Free -." Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -." MA 02111, USA. -." -.TH PCRS 3 "2 December 2003" "pcrs-0.0.3" -.SH NAME -pcrs - Perl-compatible regular substitution. -.SH SYNOPSIS -.br -.B "#include <pcrs.h>" -.PP -.br -.BI "pcrs_job *pcrs_compile(const char *" pattern "," -.ti +5n -.BI "const char *" substitute ", const char *" options , -.ti +5n -.BI "int *" errptr ); -.PP -.br -.BI "pcrs_job *pcrs_compile_command(const char *" command , -.ti +5n -.BI "int *" errptr ); -.PP -.br -.BI "int pcrs_execute(pcrs_job *" job ", char *" subject , -.ti +5n -.BI "int " subject_length ", char **" result , -.ti +5n -.BI "int *" result_length ); -.PP -.br -.BI "int pcrs_execute_list (pcrs_job *" joblist ", char *" subject , -.ti +5n -.BI "int " subject_length ", char **" result , -.ti +5n -.BI "int *" result_length ); -.PP -.br -.BI "pcrs_job *pcrs_free_job(pcrs_job *" job ); -.PP -.br -.BI "void pcrs_free_joblist(pcrs_job *" joblist ); -.PP -.br -.BI "char *pcrs_strerror(int " err ); -.PP -.br - -.SH DESCRIPTION - -The -.SM PCRS -library is a supplement to the -.SB PCRE(3) -library that implements -.RB "regular expression based substitution, like provided by " Perl(1) "'s 's'" -operator. It uses the same syntax and semantics as Perl 5, with just a few -differences (see below). - -In a first step, the information on a substitution, i.e. the pattern, the -substitute and the options are compiled from Perl syntax to an internal form -.RB "called " pcrs_job " by using either the " pcrs_compile() " or " -.BR pcrs_compile_command() " functions." - -Once the job is compiled, it can be used on subjects, which are arbitrary -memory areas containing string or binary data, by calling -.BR pcrs_execute() ". Jobs can be chained to joblists and whole" -.RB "joblists can be applied to a subject using " pcrs_execute_list() . - -There are also convenience functions for freeing the jobs and for errno-to-string -.RB "conversion, namely " pcrs_free_job() ", " pcrs_free_joblist() " and " -.BR pcrs_strerror() . - -.SH COMPILING JOBS - -.RB "The function " pcrs_compile() " is called to compile a " pcrs_job -.RI "from a " pattern ", " substitute " and " options " string." -.RB "The resulting " "pcrs_job" " structure is dynamically allocated and it" -.RB "is the caller's responsibility to call " "pcrs_free_job()" " when it's no longer needed." - -.BR "pcrs_compile_command()" " is a convenience wrapper function that parses a Perl" -.IR "command" " of the form" -.BI "s/" "pattern" "/" "substitute" "/[" "options" "]" -.RB "into its components and then calls " "pcrs_compile()" ". As in Perl, you" -.RB "are not bound to the '" "/" "' character: Whatever" -.RB "follows the '" "s" "' will be used as the delimiter. Patterns or substitutes" -that contain the delimiter need to quote it: -\fBs/th\/is/th\/at/\fR -.RB "will replace " "th/is" " by " "th/at" " and can be written more simply as" -.BR "s|th/is|th/at|" "." - -.IR "pattern" ", " "substitute" ", " "options" " and " "command" " must be" -.RI "zero-terminated C strings. " "substitute" " and " "options" " may be" -.BR "NULL" ", in which case they are treated like the empty string." - -.SS "Return value and diagnostics" -On success, both functions return a pointer to the compiled job. -.RB "On failure, " "NULL" -.RI "is returned. In that case, the pcrs error code is written to *" "err" "." - -.SS Patterns -.RI "For the syntax of the " "pattern" ", see the " -.BR "PCRE(3)" " manual page." - -.SS Substitutes -.RI "The " "substitute" " uses" -.RB "Perl syntax as documented in the " "perlre(1)" " manual page, with" -some exceptions: - -Most notably and evidently, since -.SM PCRS -is not Perl, variable interpolation or Perl command substitution won't work. -Special variables that do get interpolated, are: -.TP -.B "$1, $2, ..., $n" -Like in Perl, these variables refer to what the nth capturing subpattern -in the pattern matched. -.TP -.B "$& and $0" -.RB "refer to the whole match. Note that " "$0" " is deprecated in recent" -Perl versions and now refers to the program name. -.TP -.B "$+" -refers to what the last capturing subpattern matched. -.TP -.BR "$` and $'" " (backtick and tick)" -.RI "refer to the areas of the " "subject" " before and after the match, respectively." -.RB "Note that, like in Perl, the " "unmodified" " subject is used, even" -if a global substitution previously matched. - -.PP -Perl4-style references to subpattern matches of the form -\fB\1, \2, ...\fR -.RB "which only exist in Perl5 for backwards compatibility, are " "not" -supported. - -Also, since the substitute is a double-quoted string in Perl, you -might expect all Perl syntax for special characters to apply. In fact, -only the following are supported: - -.TP -\fB\n\fR -newline (0x0a) -.TP -\fB\r\fR -carriage return (0x0d) -.TP -\fB\t\fR -horizontal tab (0x09) -.TP -\fB\f\fR -form feed (0x0c) -.TP -\fB\b\fR -backspace (0x08) -.TP -\fB\a\fR -alarm, bell (0x07) -.TP -\fB\e\fR -escape (0x1b) -.TP -\fB\0\fR -binary zero (0x00) - -.SS "Options" -.RB "The options " "gmisx" " are supported. " "e" " is not, since it would" -.RB "require a Perl interpreter and neither is " o ", because the pattern -is explicitly compiled, anyway. Additionally, -.SM PCRS -.RB "honors the options " "U" " and " "T" "." -Where -.SM PCRE -.RB "options are mentioned below, refer to " PCRE(3) " for the subtle differences" -to Perl behaviour. - -.TP -.B g -.RB "Replace " all " instances of" -.IR pattern " in " subject , -not just the first one. - -.TP -.B i -.RI "Match the " pattern " without respect to case. This translates to" -.SM PCRE_CASELESS. - -.TP -.B m -.RI "Treat the " subject " as consisting of multiple lines, i.e." -.RB ' ^ "' matches immediately after, and '" $ "' immediately before each newline." -Translates to -.SM PCRE_MULTILINE. - -.TP -.B s -.RI "Treat the " subject " as consisting of one single line, i.e." -.RB "let the scope of the '" . "' metacharacter include newlines." -Translates to -.SM PCRE_DOTALL. - -.TP -.B x -.RI "Allow extended regular expression syntax in the " pattern "," -.RB "enabling whitespace and comments in complex patterns." -Translates to -.SM PCRE_EXTENDED. - -.TP -.B U -.RB "Switch the default behaviour of the '" * "' and '" + "' quantifiers" -.RB "to ungreedy. Note that appending a '" ? "' switches back to greedy(!)." -.RB "The explicit in-pattern switches " (?U) " and " (?-U) " remain unaffected." -Translates to -.SM PCRE_UNGREEDY. - -.TP -.B T -.RI "Consider the " substitute " trivial, i.e. do not interpret any references" -or special character escape sequences in the substitute. Handy for large -user-supplied substitutes, which would otherwise have to be examined and properly -quoted. - -.PP -Unsupported options are silently ignored. - -.SH EXECUTING JOBS - -.RI "Calling " pcrs_execute() " produces a modified copy of the " subject ", in which" -.RB "the first (or all, if the '" g "' option was given when compiling the job)" -.RI "occurance(s) of the job's " pattern " in the " subject " is replaced by the job's" -.IR substitute . - -.RI "The first " subject_length " bytes following " subject " are processed, so" -.RI "a " subject_length " that exceeds the actual " subject " is dangerous." -.RI "Note that for zero-terminated C strings, you should set " subject_length " to" -.BI strlen( subject ) \fR, -so that the dollar metacharacter matches at the end of the string, not after -the string-terminating null byte. For convenience, an extra null byte is -appended to the result so it can again be used as a string. - -.RI "The " subject " itself is left untouched, and the " *result " is dynamically" -.RB "allocated, so it is the caller's responsibility to " free() " it when it's" -no longer needed. - -.RI "The result's length (excluding the extra null byte) is written to " *result_length "." - -.RB "If the job matched, the " PCRS_SUCCESS " flag in" -.IB job ->flags -is set. - - -.SS String subjects -If your - -.SS Return value and diagnostics - -.RB "On success, " pcrs_execute() " returns the number of substitutions that" -were made, which is limited to 0 or 1 for non-global searches. -.RI "On failure, a negative error code is returned and " result " is set" -.RB "to " NULL . - -.SH FREEING JOBS -.RB "It is not sufficient to call " free() " on a " pcrs_job ", because it " -contains pointers to other dynamically allocated structures. -.RB "Use " pcrs_free_job() " instead. It is safe to pass " NULL " pointers " -.RB "(or pointers to invalid " pcrs_job "s that contain " NULL " pointers" -.RB "to dependant structures) to " pcrs_free_job() "." - -.SS Return value -.RB "The value of the job's " next " pointer." - - -.SH CHAINING JOBS - -.SM PCRS -.RB "supports to some extent the chaining of multiple " pcrs_job " structures by" -.RB "means of their " next " member." - -Chaining the jobs is up to you, but once you have built a linked list of jobs, -.RI "you can execute a whole " joblist " on a given subject by" -.RB "a single call to " pcrs_execute_list() ", which will sequentially traverse" -.RB "the linked list until it reaches a " NULL " pointer, and call " pcrs_execute() -.RI "for each job it encounters, feeding the " result " and " result_length " of each" -.RI "call into the next as the " subject " and " subject_length ". As in the single" -.RI "job case, the original " subject " remains untouched, but all interim " result "s" -.RB "are of course " free() "d. The return value is the accumulated number of matches" -.RI "for all jobs in the " joblist "." -.RI "Note that while this is handy, it reduces the diagnostic value of " err ", since " -you won't know which job failed. - -.RI "In analogy, you can free all jobs in a given " joblist " by calling" -.BR pcrs_free_joblist() . - -.SH QUOTING -The quote character is (surprise!) '\fB\\fR'. It quotes the delimiter in a -.IR command ", the" -.RB ' $ "' in a" -.IR substitute ", and, of course, itself. Note that the" -.RB ' $ "' doesn't need to be quoted if it isn't followed by " [0-9+'`&] "." - -.RI "For quoting in the " pattern ", please refer to" -.BR PCRE(3) . - -.SH DIAGNOSTICS - -.RB "When " compiling " a job either via the " pcrs_compile() " or " pcrs_compile_command() -.RB "functions, you know that something went wrong when you are returned a " NULL " pointer." -.RI "In that case, or in the event of non-fatal warnings, the integer pointed to by " err -contains a nonzero error code, which is either a passed-through -.SM PCRE -error code or one generated by -.SM PCRS. -Under normal circumstances, it can take the following values: -.TP -.B PCRE_ERROR_NOMEMORY -While compiling the pattern, -.SM PCRE -ran out of memory. -.TP -.B PCRS_ERR_NOMEM -While compiling the job, -.SM PCRS -ran out of memory. -.TP -.B PCRS_ERR_CMDSYNTAX -.BR pcrs_compile_command() " didn't find four tokens while parsing the" -.IR command . -.TP -.B PCRS_ERR_STUDY -A -.SM PCRE -.RB "error occured while studying the compiled pattern. Since " pcre_study() -only provides textual diagnostic information, the details are lost. -.TP -.B PCRS_WARN_BADREF -.RI "The " substitute " contains a reference to a capturing subpattern that" -.RI "has a higher index than the number of capturing subpatterns in the " pattern -or that exceeds the current hard limit of 33 (See LIMITATIONS below). As in Perl, -this is non-fatal and results in substitutions with the empty string. - -.PP -.RB "When " executing " jobs via " pcrs_execute() " or " pcrs_execute_list() "," -.RI "a negative return code indicates an error. In that case, *" result -.RB "is " NULL ". Possible error codes are:" -.TP -.B PCRE_ERROR_NOMEMORY -While matching the pattern, -.SM PCRE -ran out of memory. This can only happen if there are more than 33 backrefrences -.RI "in the " pattern "(!)" -.BR and " memory is too tight to extend storage for more." -.TP -.B PCRS_ERR_NOMEM -While executing the job, -.SM PCRS -ran out of memory. -.TP -.B PCRS_ERR_BADJOB -.RB "The " pcrs_job "* passed to " pcrs_execute " was NULL, or the" -.RB "job is bogus (it contains " NULL " pointers to the compiled -pattern, extra, or substitute). - -.PP -If you see any other -.SM PCRE -error code passed through, you've either messed with the compiled job -or found a bug in -.SM PCRS. -Please send me an email. - -.RB "Ah, and don't look for " PCRE_ERROR_NOMATCH ", since this" -is not an error in the context of -.SM PCRS. -.RI "Should there be no match, an exact copy of the " subject " is" -.RI "found at *" result " and the return code is 0 (matches)." - -All error codes can be translated into human readable text by means -.RB "of the " pcrs_strerror() " function." - - -.SH EXAMPLE -A trivial command-line test program for -.SM PCRS -might look like: - -.nf -#include <pcrs.h> -#include <stdio.h> - -int main(int Argc, char **Argv) -{ - pcrs_job *job; - char *result; - size_t newsize; - int err; - - if (Argc != 3) - { - fprintf(stderr, "Usage: %s s/pattern/substitute/[options] subject\n", Argv[0]); - return 1; - } - - if (NULL == (job = pcrs_compile_command(Argv[1], &err))) - { - fprintf(stderr, "%s: compile error: %s (%d).\n", Argv[0], pcrs_strerror(err), err); - } - - if (0 > (err = pcrs_execute(job, Argv[2], strlen(Argv[2]), &result, &newsize))) - { - fprintf(stderr, "%s: exec error: %s (%d).\n", Argv[0], pcrs_strerror(err), err); - } - else - { - printf("Result: *%s*\n", result); - free(result); - } - - pcrs_free_job(job); - return(err < 0); - -} - -.fi - - -.SH LIMITATIONS -The number of matches that a global job can have is only limited by the -available memory. An initial storage for 40 matches is reserved, which -is dynamically resized by the factor 1.6 whenever it is exhausted. - -The number of capturing subpatterns is currently limited to 33, which -is a Bad Thing[tm]. It should be dynamically expanded until it reaches the -.SM PCRE -limit of 99. -.br -This limitation is particularly embarassing since -.SM PCRE -3.5 has raised the capturing subpattern limit to 65K. - -All of the above values can be adjusted in the "Capacity" section -.RB "of " pcrs.h "." - -The Perl-style escape sequences for special characters \\fInnn\fR, -\x\fInn\fR, and \c\fIX\fR are currently unsupported. - -.SH BUGS -This library has only been tested in the context of one application -and should be considered high risk. - -.SH HISTORY -.SM PCRS -was originally written for the Privoxy project -(http://www.privoxy.org/). - -.SH SEE ALSO -.B PCRE(3), perl(1), perlre(1) - -.SH AUTHOR - -.SM PCRS -is Copyright 2000 - 2003 by Andreas Oesterhelt andreas@oesterhelt.org and is -licensed under the terms of the GNU Lesser General Public License (LGPL), -version 2.1, which should be included in this distribution, with the exception -that the permission to replace that license with the GNU General Public -License (GPL) given in section 3 is restricted to version 2 of the GPL. - -If it is missing from this distribution, the LGPL can be obtained from -http://www.gnu.org/licenses/lgpl.html or by mail: Write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. diff --git a/external/privoxy/doc/source/authors.sgml b/external/privoxy/doc/source/authors.sgml deleted file mode 100644 index a810736..0000000 --- a/external/privoxy/doc/source/authors.sgml +++ /dev/null @@ -1,67 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/authors.sgml,v $ - - Purpose : AUTHORS file for Privoxy - - $Id: authors.sgml,v 2.11 2009/02/12 16:08:26 fabiankeil Exp $ - - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. You have been warned! - Failure to abide by this rule will result in the revocation of your license - to live a peaceful existence! - ======================================================================== - - =================================================================== - READ: Document Note: This file generates the AUTHORS file in the - top level source directory. See p-authors.sgml for list of developers - and contributors, etc. They were split from here for use in man page. - =================================================================== - ---> -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ -<!entity % dummy "IGNORE"> -<!entity authors SYSTEM "p-authors.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-not-stable "IGNORE"> -<!entity % p-stable "INCLUDE"> -<!entity % p-text "INCLUDE"> <!-- define we are a text only doc --> -<!entity % p-authors-formal "INCLUDE"> <!-- include additional text, etc --> -]> - -<article id="index"> - -<![%dummy;[ - <para> - <comment> - This is here to keep vim syntax file from breaking :/ - If I knew enough to fix it, I would. - PLEASE DO NOT REMOVE! HB: hal@foobox.net - </comment> - </para> -]]> - -<literallayout> - Authors of <application>Privoxy</application> v2.9.x and 3.x -=========================================================================== -</literallayout> - -<!-- include boilerplate p-authors.sgml --> - &authors; -<!-- end boilerplate --> - -<para> - If we've missed you off this list, please let us know! -</para> - -<literallayout> - Privoxy team. <ulink url="http://www.privoxy.org/">http://www.privoxy.org/</ulink> - <email>ijbswa-developers@lists.sourceforge.net</email> -</literallayout> - -</article> diff --git a/external/privoxy/doc/source/buildsource.sgml b/external/privoxy/doc/source/buildsource.sgml deleted file mode 100644 index f8f5955..0000000 --- a/external/privoxy/doc/source/buildsource.sgml +++ /dev/null @@ -1,256 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/buildsource.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: buildsource.sgml,v 2.18 2009/02/23 09:03:12 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - user-manual - INSTALL - ---> -<para> - To build <application>Privoxy</application> from source, - <ulink url="http://www.gnu.org/software/autoconf/autoconf.html">autoconf</ulink>, - <ulink - url="http://www.gnu.org/software/make/make.html%22%3EGNU make - (gmake)</ulink>, and, of course, a C compiler like <ulink - url="http://www.gnu.org/software/gcc/gcc.html%22%3Egcc</ulink> are required. -</para> - -<para> - When building from a source tarball, -<!-- - no longer available ... - <ulink - url="http://cvs.sourceforge.net/cvstarballs/ijbswa-cvsroot.tar.gz%22%3Enightly CVS - tarball</ulink>), ---> first unpack the source: -</para> - -<para> - <screen> - tar xzvf privoxy-&p-version;<![%p-not-stable;[-beta]]><![%p-stable;[-stable]]>-src.tar.gz - cd privoxy-&p-version;<![%p-not-stable;[-beta]]><![%p-stable;[-stable]]> -</screen> -</para> - -<para> - For retrieving the current CVS sources, you'll need a CVS client installed. - Note that sources from CVS are typically development quality, and may not be - stable, or well tested. To download CVS source, check the Sourceforge - documentation, which might give commands like: -</para> - -<para> - <screen> - cvs -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co current - cd current -</screen> -</para> - -<para> - This will create a directory named <filename>current/</filename>, which will - contain the source tree. -</para> - -<para> - You can also check out any <application>Privoxy</application> - <quote>branch</quote>, just exchange the <application>current</application> - name with the wanted branch name (Example: v_3_0_branch for the 3.0 cvs - tree). -</para> - -<para> - It is also strongly recommended to not run <application>Privoxy</application> - as root. You should configure/install/run <application>Privoxy</application> as - an unprivileged user, preferably by creating a <quote>privoxy</quote> user - and group just for this purpose. See your local documentation for the correct - command line to do add new users and groups (something like - <command>adduser</command>, but the command syntax may vary from platform - to platform). -</para> - -<para> - <filename>/etc/passwd</filename> might then look like: -</para> - -<para> - <screen> privoxy:*:7777:7777:privoxy proxy:/no/home:/no/shell</screen> -</para> - -<para> - And then <filename>/etc/group</filename>, like: -</para> - -<para> - <screen> privoxy:*:7777:</screen> -</para> - -<para> - Some binary packages may do this for you. -</para> - -<para> - Then, to build from either unpacked tarball or CVS source: -</para> - -<para> - <screen> - autoheader - autoconf - ./configure # (--help to see options) - make # (the make from GNU, sometimes called gmake) - su # Possibly required - make -n install # (to see where all the files will go) - make -s install # (to really install, -s to silence output)</screen> -</para> - -<para> - Using GNU <command>make</command>, you can have the first four steps - automatically done for you by just typing: -</para> - -<para> - <screen> - make -</screen> -</para> - -<para> - in the freshly downloaded or unpacked source directory. -</para> - -<para> - To build an executable with security enhanced features so that - users cannot easily bypass the proxy (e.g. <quote>Go There Anyway</quote>), or - alter their own configurations, <command>configure</command> like this: -</para> -<para> - <screen> - ./configure --disable-toggle --disable-editor --disable-force</screen> -</para> -<para> -Then build as above. In Privoxy 3.0.7 and later, all of these options -can also be disabled through the configuration file. -</para> -<para> - <emphasis>WARNING:</emphasis> If installing as root, the install will fail - unless a non-root user or group is specified, or a <literal>privoxy</literal> - user and group already exist on the system. If a non-root user is specified, - and no group, then the installation will try to also use a group of the same name - as <quote>user</quote>. If a group is specified (and no user), then the - support files will be installed as writable by that group, and owned by the - user running the installation. -</para> - -<para> - <command>configure</command> accepts <literal>--with-user</literal> and - <literal>--with-group</literal> options for setting user and group ownership - of the configuration files (which need to be writable by the daemon). The - specified <emphasis>user must already exist</emphasis>. When starting - <application>Privoxy</application>, it must be run as this same user to - insure write access to configuration and log files! -</para> - -<para> - Alternately, you can specify <literal>user</literal> and <literal>group</literal> - on the <command>make</command> command line, but be sure both already exist: -</para> - -<para> - <screen> - make -s install USER=privoxy GROUP=privoxy</screen> -</para> - -<para> - The default installation path for <command>make install</command> is - <filename>/usr/local</filename>. This may of course be customized with - the various <command>./configure</command> path options. If you are doing - an install to anywhere besides <filename>/usr/local</filename>, be - sure to set the appropriate paths with the correct configure options - (<command>./configure --help</command>). Non-privileged users must of course - have write access permissions to wherever the target installation is going. -</para> - -<para> - If you do install to <filename>/usr/local</filename>, the install will use - <literal>sysconfdir=$prefix/etc/privoxy</literal> by default. All other - destinations, and the direct usage of <literal>--sysconfdir</literal> flag - behave like normal, i.e. will not add the extra <filename>privoxy</filename> - directory. This is for a safer install, as there may already exist another - program that uses a file with the <quote>config</quote> name, and thus makes - <filename>/usr/local/etc</filename> cleaner. -</para> - -<para> - If installing to <filename>/usr/local</filename>, the documentation will go - by default to <filename>$prefix/share/doc</filename>. But if this directory - doesn't exist, it will then try <filename>$prefix/doc</filename> and install - there before creating a new <filename>$prefix/share/doc</filename> just for - <application>Privoxy</application>. -</para> - -<para> - Again, if the installs goes to <filename>/usr/local</filename>, the - <literal>localstatedir</literal> (ie: <filename>var/</filename>) will default - to <filename>/var</filename> instead of <literal>$prefix/var</literal> so - the logs will go to <filename>/var/log/privoxy/</filename>, and the pid file - will be created in <filename>/var/run/privoxy.pid</filename>. -</para> - -<para> - <command>make install</command> will attempt to set the correct values - in <filename>config</filename> (main configuration file). You should - check this to make sure all values are correct. If appropriate, - an init script will be installed, but it is up to the user to determine - how and where to start <application>Privoxy</application>. The init - script should be checked for correct paths and values, if anything other than - a default install is done. -</para> - -<para> - If install finds previous versions of local configuration files, most of - these will not be overwritten, and the new ones will be installed with a - <quote>new</quote> extension. default.action and default.filter - <emphasis>will be overwritten</emphasis>. You will then need - to manually update the other installed configuration files as needed. The - default template files <emphasis>will</emphasis> be overwritten. If you have - customized, local templates, these should be stored safely in a separate - directory and defined in <filename>config</filename> by the - <quote>templdir</quote> directive. It is of course wise to always back-up any - important configuration files <quote>just in case</quote>. If a previous - version of <application>Privoxy</application> is already running, you will - have to restart it manually. -</para> - -<para> - For more detailed instructions on how to build Redhat RPMs, - Windows self-extracting installers, building on platforms with - special requirements etc, please consult the <ulink - url="http://www.privoxy.org/developer-manual/newrelease.html%22%3Edeveloper manual</ulink>. -</para> - -<!-- print for README only --> -<!-- Actually this is now in INSTALL --> - <![%p-readme;[ -<para> - The simplest command line to start <application>Privoxy</application> is - <command>$path/privoxy --user=privoxy $path/etc/privoxy/config</command>. - See <command>privoxy --usage</command>, or the man page, for other options, - and configuration. -</para> -]]> diff --git a/external/privoxy/doc/source/config.sgml b/external/privoxy/doc/source/config.sgml deleted file mode 100644 index 472884c..0000000 --- a/external/privoxy/doc/source/config.sgml +++ /dev/null @@ -1,36 +0,0 @@ -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[ -<!entity % dummy "IGNORE"> -<!entity config SYSTEM "p-config.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-not-stable "IGNORE"> -<!entity % user-man "IGNORE"> -<!entity % config-file "IGNORE"> -<!entity my-app "<application>Privoxy</application>"> -]> -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/config.sgml,v $ - - Purpose : config file generation - - $Id: config.sgml,v 2.12 2009/02/12 16:08:26 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. - ======================================================================== - - This file is used to generate the main Privoxy config file. It is mostly - content included from p-config.sgml (where all the data is). See that - file for more comments. - ---> - -<article> -<!-- include config.sgml --> - &config; -<!-- end include --> -</article> diff --git a/external/privoxy/doc/source/contacting.sgml b/external/privoxy/doc/source/contacting.sgml deleted file mode 100644 index 96293f7..0000000 --- a/external/privoxy/doc/source/contacting.sgml +++ /dev/null @@ -1,262 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/contacting.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: contacting.sgml,v 2.14 2008/04/26 11:38:51 fabiankeil Exp $ - - Copyright (C) 2001-2008 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - This file is included into: - - faq - developer-manual - README - user-manual - webserver/index.sgml - announce.sgml - ---> - -<!-- READ: --> -<!-- Careful of the literallayout tags and finished formatting --> - -<para> - We value your feedback. In fact, we rely on it to improve - <application>Privoxy</application> and its configuration. - However, please note the following hints, so we can - provide you with the best support: -</para> - -<sect2 id="contact-support"><title>Get Support</title> -<para> - For casual users, our - <ulink url="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum at SourceForge</ulink> - is probably best suited: - <ulink url="http://sourceforge.net/tracker/?group_id=11118&atid=211118">http://sourceforge.net/tracker/?group_id=11118&atid=211118</ulink> -</para> - -<para> - All users are of course welcome to discuss their issues on the <ulink - url="http://lists.sourceforge.net/lists/listinfo/ijbswa-users%22%3Eusers - mailing list</ulink>, where the developers also hang around. -</para> - -<para> - Please don't sent private support requests to individual Privoxy - developers, either use the mailing lists or the support trackers. -</para> - -<para> - Note that the Privoxy mailing lists are moderated. Posts from unsubscribed - addresses have to be accepted manually by a moderator. This may cause a - delay of several days and if you use a subject that doesn't clearly - mention Privoxy or one of its features, your message may be accidentally - discarded as spam. -</para> - -<para> - If you aren't subscribed, you should therefore spend a few seconds - to come up with a proper subject. Additionally you should make it clear - that you want to get CC'd. Otherwise some responses will be directed to - the mailing list only, and you won't see them. -</para> - -</sect2> - -<sect2 id="reporting"><title>Reporting Problems</title> -<para> -<quote>Problems</quote> for our purposes, come in two forms: -</para> - <itemizedlist> - - <listitem> - <para> - Configuration issues, such as ads that slip through, or sites that - don't function properly due to one <application>Privoxy</application> - <quote>action</quote> or another being turned <quote>on</quote>. - </para> - </listitem> - - <listitem> - <para> - <quote>Bugs</quote> in the programming code that makes up - <application>Privoxy</application>, such as that might cause a crash. - </para> - </listitem> -</itemizedlist> - - -<sect3 id="contact-ads"><title>Reporting Ads or Other Configuration Problems</title> -<para> - Please send feedback on ads that slipped through, innocent images that were - blocked, sites that don't work properly, and other configuration related problem of - <filename>default.action</filename> file, to - <ulink url="http://sourceforge.net/tracker/?group_id=11118&atid=460288"> - http://sourceforge.net/tracker/?group_id=11118&atid=460288</ulink>, - the Actions File Tracker. -</para> - -<para> - New, improved <filename>default.action</filename> files may occasionally be made - available based on your feedback. These will be announced on the <ulink - url="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce%22%3Eijbswa-anno...</ulink> - list and available from our the <ulink - url="http://sourceforge.net/project/showfiles.php?group_id=11118%22%3Efiles section</ulink> of - our <ulink url="http://sf.net/projects/ijbswa/">project page</ulink>. -</para> -</sect3> - - -<sect3 id="contact-bugs"><title>Reporting Bugs</title> -<para> - Please report all bugs through our bug tracker: - <ulink url="http://sourceforge.net/tracker/?group_id=11118&atid=111118">http://sourceforge.net/tracker/?group_id=11118&atid=111118</ulink>. -</para> - -<para> - Before doing so, please make sure that the bug has <emphasis>not already been submitted</emphasis> - and observe the additional hints at the top of the <ulink - url="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=111118%... - form</ulink>. If already submitted, please feel free to add any info to the - original report that might help to solve the issue. -</para> - -<para> - Please try to verify that it is a <application>Privoxy</application> bug, - and not a browser or site bug or documented behaviour that just happens - to be different than what you expected. If unsure, - try <ulink url="http://config.privoxy.org/toggle?set=disable">toggling - off</ulink> <application>Privoxy</application>, and see if the problem persists. -</para> - -<para> - If you are using your own custom configuration, please try - the stock configs to see if the problem is configuration related. - If you're having problems with a feature that is disabled by default, - please ask around on the mailing list if others can reproduce the problem. -</para> - -<para> - If you aren't using the latest Privoxy version, the bug may have been found - and fixed in the meantime. We would appreciate if you could take the time - to <ulink url="http://www.privoxy.org/user-manual/installation.html">upgrade - to the latest version</ulink> (or even the latest CVS snapshot) and verify - that your bug still exists. -</para> -<para> -Please be sure to provide the following information: -</para> -<para> - <itemizedlist> - - <listitem> - <para> - The exact <application>Privoxy</application> version you are using - (if you got the source from CVS, please also provide the source code revisions - as shown in <ulink url="http://config.privoxy.org/show-version">http://config.privoxy.org/show-version</ulink>). - </para> - </listitem> - - <listitem> - <para> - The operating system and versions you run - <application>Privoxy</application> on, (e.g. <application>Windows - XP SP2</application>), if you are using a Unix flavor, - sending the output of <quote>uname -a</quote> should do, - in case of GNU/Linux, please also name the distribution. - </para> - </listitem> - - <listitem> - <para> - The name, platform, and version of the <application>browser</application> - you were using (e.g. <application>Internet Explorer v5.5</application> for Mac). - </para> - </listitem> - - <listitem> - <para> - The URL where the problem occurred, or some way for us to duplicate the - problem (e.g. <literal>http://somesite.example.com/?somethingelse=123</literal>). - </para> - </listitem> - - <listitem> - <para> - Whether your version of <application>Privoxy</application> is one supplied - by the <application>Privoxy</application> developers via SourceForge, - or if you got your copy somewhere else. - </para> - </listitem> - - <listitem> - <para> - Whether you are using <application>Privoxy</application> in tandem with - another proxy such as <application>Tor</application>. If so, please - temporary disable the other proxy to see if the symptoms change. - </para> - </listitem> - - <listitem> - <para> - Whether you are using a personal firewall product. If so, does - <application>Privoxy</application> work without it? - </para> - </listitem> - - <listitem> - <para> - Any other pertinent information to help identify the problem such as config - or log file excerpts (yes, you should have log file entries for each - action taken). - </para> - </listitem> - -</itemizedlist> -</para> - -<para> - You don't have to tell us your actual name when filing a problem - report, but please use a nickname so we can differentiate between - your messages and the ones entered by other "anonymous" users that - may respond to your request if they have the same problem or already - found a solution. -</para> - -<para> - Please also check the status of your request a few days after submitting - it, as we may request additional information. If you use a SF id, - you should automatically get a mail when someone responds to your request. -</para> - -<para> - The <ulink url="http://www.privoxy.org/user-manual/appendix.html#ACTIONSANAT">appendix - of the Privoxy User Manual</ulink> also has helpful information - on understanding <literal>actions</literal>, and <literal>action</literal> debugging. -</para> -</sect3> -</sect2> - -<sect2 id="contact-feature"><title>Request New Features</title> -<para> - You are welcome to submit ideas on new features or other proposals - for improvement through our feature request tracker at - <ulink url="http://sourceforge.net/tracker/?atid=361118&group_id=11118">http://sourceforge.net/tracker/?atid=361118&group_id=11118</ulink>. -</para> -</sect2> - -<sect2 id="contact-other"><title>Other</title> -<para> -For any other issues, feel free to use the mailing lists. Technically interested users -and people who wish to contribute to the project are also welcome on the developers list! -You can find an overview of all <application>Privoxy</application>-related mailing lists, -including list archives, at: -<ulink url="http://sourceforge.net/mail/?group_id=11118">http://sourceforge.net/mail/?group_id=11118</ulink>. -</para> -</sect2> diff --git a/external/privoxy/doc/source/copyright.sgml b/external/privoxy/doc/source/copyright.sgml deleted file mode 100644 index 01c978d..0000000 --- a/external/privoxy/doc/source/copyright.sgml +++ /dev/null @@ -1,47 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/copyright.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: copyright.sgml,v 2.10 2009/02/10 16:13:30 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - privoxy-man-page - user-manual - developer-manual - faq - - ************************************************************** - NOTE: the &my-copy entity must be defined in any file that will - include this file. (This is a workaround for docbook2man not - handling the standard © entity in the man page processing.) - ************************************************************** - ---> - -<!-- - GFDL: - http://www.gnu.org/licenses/fdl.html ---> - -<para> - Copyright &my-copy; 2001-2009 by Privoxy Developers <email>ijbswa-developers@lists.sourceforge.net</email> -</para> - -<para> - Some source code is based on code Copyright &my-copy; 1997 by Anonymous Coders - and Junkbusters, Inc. and licensed under the <citetitle>GNU General Public - License</citetitle>. -</para> - diff --git a/external/privoxy/doc/source/developer-manual.sgml b/external/privoxy/doc/source/developer-manual.sgml deleted file mode 100644 index 0e1dc1f..0000000 --- a/external/privoxy/doc/source/developer-manual.sgml +++ /dev/null @@ -1,3304 +0,0 @@ -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[ -<!entity % dummy "IGNORE"> -<!entity supported SYSTEM "supported.sgml"> -<!entity newfeatures SYSTEM "newfeatures.sgml"> -<!entity p-intro SYSTEM "privoxy.sgml"> -<!entity history SYSTEM "history.sgml"> -<!entity seealso SYSTEM "seealso.sgml"> -<!entity contacting SYSTEM "contacting.sgml"> -<!entity copyright SYSTEM "copyright.sgml"> -<!entity license SYSTEM "license.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-not-stable "IGNORE"> -<!entity % p-stable "INCLUDE"> -<!entity % p-text "IGNORE"> <!-- define we are not a text only doc --> -<!entity % p-doc "INCLUDE"> <!-- and we are a formal doc --> -<!entity % seealso-extra "INCLUDE"> <!-- extra stuff from seealso.sgml --> -<!entity my-copy "©"> <!-- kludge for docbook2man --> -]> -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/developer-manual.sgml,v $ - - Purpose : developer manual - This file belongs into - ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - - $Id: developer-manual.sgml,v 2.27 2009/02/19 02:20:22 hal9 Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. You have been warned! - Failure to abide by this rule will result in the revocation of your license - to live a peaceful existence! - ======================================================================== - ---> - -<article id="index"> - <artheader> - <title>Privoxy Developer Manual</title> - <pubdate> - <subscript> - <!-- Completely the wrong markup, but very little is allowed --> - <!-- in this part of an article. FIXME --> - <link linkend="copyright">Copyright</link> &my-copy; 2001-2009 by - <ulink url="http://www.privoxy.org/">Privoxy Developers</ulink> - </subscript> - </pubdate> - - - <pubdate>$Id: developer-manual.sgml,v 2.27 2009/02/19 02:20:22 hal9 Exp $</pubdate> - -<!-- - -Note: this should generate a separate page, and a live link to it. -But it doesn't for some mysterious reason. Please leave commented -unless it can be fixed proper. For the time being, the copyright -statement will be in copyright.smgl. - -Hal. - -<legalnotice id="legalnotice"> - <para> - text goes here ........ - </para> -</legalnotice> - ---> - - <abstract> - -<![%dummy;[ - <para> - <comment> - This is here to keep vim syntax file from breaking :/ - If I knew enough to fix it, I would. - PLEASE DO NOT REMOVE! HB: hal@foobox.net - </comment> - </para> - ]]> -<para> - The developer manual provides guidance on coding, testing, packaging, documentation - and other issues of importance to those involved with - <application>Privoxy</application> development. It is mandatory (and helpful!) reading - for anyone who wants to join the team. Note that it's currently out of date - and may not be entirely correct. As always, patches are welcome. -</para> - -<!-- Include privoxy.sgml boilerplate text: --> - -<!-- &p-intro; Someone interested enough in the project to contribute - will already know at this point what Privoxy is. --> - -<!-- end boilerplate --> - -<para> - Please note that this document is constantly evolving. This copy represents - the state at the release of version &p-version;. - You can find the latest version of the this manual at <ulink - url="http://www.privoxy.org/developer-manual/%22%3Ehttp://www.privoxy.org/develop...</ulink>. - Please see <link linkend="contact">the Contact section</link> - on how to contact the developers. -</para> -<!-- <para> --> -<!-- Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. --> -<!-- </para> --> - - </abstract> - </artheader> - - -<!-- ~~~~~ New section ~~~~~ --> - <sect1 id="introduction"><title>Introduction</title> -<!-- - - I don't like seeing blank space :) So added *something* here. - - --> - <para> - <application>Privoxy</application>, as an heir to - <application>Junkbuster</application>, is a Free Software project - and the code is licensed under the GNU General Public License version 2. - As such, <application>Privoxy</application> development is potentially open - to anyone who has the time, knowledge, and desire to contribute - in any capacity. Our goals are simply to continue the mission, - to improve <application>Privoxy</application>, and - to make it available to as wide an audience as possible. - </para> - <para> - One does not have to be a programmer to contribute. Packaging, testing, - documenting and porting, are all important jobs as well. - </para> - - <!-- ~~~~~ New section ~~~~~ --> - <sect2 id="quickstart"><title>Quickstart to Privoxy Development</title> - <para> - The first step is to join the <ulink - url="mailto:ijbswa-developers@lists.sourceforge.net">developer's mailing list</ulink>. - You can submit your ideas, or even better patches. Patches are best - submitted to the Sourceforge tracker set up for this purpose, but - can be sent to the list for review too. - </para> - <para> - You will also need to have a cvs package installed, which will - entail having ssh installed as well (which seems to be a requirement of - SourceForge), in order to access the cvs repository. Having the GNU build - tools is also going to be important (particularly, autoconf and gmake). - </para> - <para> - For the time being (read, this section is under construction), you can - also refer to the extensive comments in the source code. In fact, - reading the code is recommended in any case. - </para> - </sect2> - </sect1> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="cvs"><title>The CVS Repository</title> - <para> - If you become part of the active development team, you will eventually - need write access to our holy grail, the CVS repository. One of the - team members will need to set this up for you. Please read - this chapter completely before accessing via CVS. - </para> - - <sect2 id="cvsaccess"><title>Access to CVS</title> - <para> - The project's CVS repository is hosted on - <ulink url="http://sourceforge.net/">SourceForge.</ulink> - Please refer to the chapters 6 and 7 in - <ulink url="http://sourceforge.net/docman/?group_id=1">SF's site - documentation</ulink> for the technical access details for your - operating system. For historical reasons, the CVS server is - called <literal>ijbswa.cvs.sourceforge.net</literal>, the repository is - called <literal>ijbswa</literal>, and the source tree module is called - <literal>current</literal>. - </para> - </sect2> - - <sect2 id="cvsbranches"> - <title>Branches</title> - <para> - Within the CVS repository, there are modules and branches. As - mentioned, the sources are in the <literal>current</literal> - <quote>module</quote>. Other modules are present for platform specific - issues. There is a webview of the CVS hierarchy at <ulink - url="http://ijbswa.cvs.sourceforge.net/ijbswa/%22%3Ehttp://ijbswa.cvs.sourceforge...</ulink>, - which might help with visualizing how these pieces fit together. - </para> - <para> - Branches are used to fork a sub-development path from the main trunk. - Within the <literal>current</literal> module where the sources are, there - is always at least one <quote>branch</quote> from the main trunk - devoted to a stable release series. The main trunk is where active - development takes place for the next stable series (e.g. 3.2.x). - So just prior to each stable series (e.g. 3.0.x), a branch is created - just for stable series releases (e.g. 3.0.0 -> 3.0.1 -> 3.0.2, etc). - Once the initial stable release of any stable branch has taken place, - this branch is <emphasis>only used for bugfixes</emphasis>, which have - had prior testing before being committed to CVS. (See <link - linkend="versionnumbers">Version Numbers</link> below for details on - versioning.) - </para> - <para> - At one time there were two distinct branches: stable and unstable. The - more drastic changes were to be in the unstable branch. These branches - have now been merged to minimize time and effort of maintaining two - branches. - </para> - <!-- - <para> - This will result in at least two active branches, which means there may - be occasions that require the same (or similar) item to be - checked into to two different places (assuming its a bugfix and needs - fixing in both the stable and unstable trees). This also means that in - order to have access to both trees, both will have to be checked out - separately. Use the <literal>cvs -r</literal> flag to check out a - branch, e.g: <literal>cvs co -r v_3_0_branch current</literal>. - </para> - --> - </sect2> - - <sect2 id="cvscommit"><title>CVS Commit Guidelines</title> - <para> - The source tree is the heart of every software project. Every effort must - be made to ensure that it is readable, compilable and consistent at all - times. There are differing guidelines for the stable branch and the - main development trunk, and we ask anyone with CVS access to strictly - adhere to the following guidelines: - </para> - - <para> - Basic Guidelines, for all branches: - </para> - <para> - <itemizedlist> - <listitem><para> - Please don't commit even - a small change without testing it thoroughly first. When we're - close to a public release, ask a fellow developer to review your - changes. - </para></listitem> - <listitem><para> - Your commit message should give a concise overview of <emphasis>what you - changed</emphasis> (no big details) and <emphasis>why you changed it</emphasis> - Just check previous messages for good examples. - </para></listitem> - <listitem><para> - Don't use the same message on multiple files, unless it equally applies to - all those files. - </para></listitem> - <listitem><para> - If your changes span multiple files, and the code won't recompile unless - all changes are committed (e.g. when changing the signature of a function), - then commit all files one after another, without long delays in between. - If necessary, prepare the commit messages in advance. - </para></listitem> - <listitem><para> - Before changing things on CVS, make sure that your changes are in line - with the team's general consensus on what should be done. - </para></listitem> - <listitem> - <para> - Note that near a major public release, we get more cautious. - There is always the possibility to submit a patch to the <ulink - url="http://sourceforge.net/tracker/?atid=311118&group_id=11118&func=brow... - tracker</ulink> instead. - </para> - </listitem> - </itemizedlist> - </para> - -<!-- - <para> - Stable branches are handled with more care, especially after the - initial *.*.0 release, and we are just in bugfix mode. In addition to - the above, the below applies only to the stable branch (currently the - <literal>v_3_0_branch</literal> branch): - </para> - - <para> - <itemizedlist> - <listitem> - <para> - Do not commit <emphasis>anything</emphasis> unless your proposed - changes have been well tested first, preferably by other members of the - project, or have prior approval of the project leaders or consensus - of the devel list. - </para> - </listitem> - <listitem> - <para> - Where possible, bugfixes and changes should be tested in the main - development trunk first. There may be occasions where this is not - feasible, though. - </para> - </listitem> - <listitem> - <para> - Alternately, proposed changes can be submitted as patches to the patch tracker on - Sourceforge first: <ulink - url="http://sourceforge.net/tracker/?group_id=11118&atid=311118">http://sourceforge.net/tracker/?group_id=11118&atid=311118</ulink>. - Then ask for peer review. - </para> - </listitem> - <listitem> - <para> - Do not even think about anything except bugfixes. No new features! - </para> - </listitem> - - </itemizedlist> - </para> - --> - </sect2> - - </sect1> - - <!-- ~~~~~ New section ~~~~~ --> -<sect1 id="documentation"><title>Documentation Guidelines</title> - <para> - All formal documents are maintained in Docbook SGML and located in the - <computeroutput>doc/source/*</computeroutput> directory. You will need - <ulink url="http://www.docbook.org">Docbook</ulink>, the Docbook - DTD's and the Docbook modular stylesheets (or comparable alternatives), - and either <application>jade</application> or - <application>openjade</application> (recommended) installed in order to - build docs from source. Currently there is <ulink - url="../user-manual/index.html"><citetitle>user-manual</citetitle></ulink>, - <ulink url="../faq/index.html"><citetitle>FAQ</citetitle></ulink>, and, of - course this, the <citetitle>developer-manual</citetitle> in this format. - The <citetitle>README</citetitle>, <citetitle>AUTHORS</citetitle>, - <citetitle>INSTALL</citetitle>, - <citetitle>privoxy.1</citetitle> (man page), and - <citetitle>config</citetitle> files are also now maintained as Docbook - SGML. These files, when built, in the top-level source directory are - generated files! Also, the <application>Privoxy</application> <filename>index.html</filename> (and a - variation on this file, <filename>privoxy-index.html</filename>, - meant for inclusion with doc packages), are maintained as SGML as well. - <emphasis>DO NOT edit these directly</emphasis>. Edit the SGML source, or - contact someone involved in the documentation. - </para> - <para> - <filename>config</filename> requires some special handling. The reason it - is maintained this way is so that the extensive comments in the file - mirror those in <citetitle>user-manual</citetitle>. But the conversion - process requires going from SGML to HTML to text to special formatting - required for the embedded comments. Some of this does not survive so - well. Especially some of the examples that are longer than 80 characters. - The build process for this file outputs to <filename>config.new</filename>, - which should be reviewed for errors and mis-formatting. Once satisfied - that it is correct, then it should be hand copied to - <filename>config</filename>. - </para> - <para> - Other, less formal documents (e.g. <filename>LICENSE</filename>) are - maintained as plain text files in the top-level source directory. - </para> - <para> - Packagers are encouraged to include this documentation. For those without - the ability to build the docs locally, text versions of each are kept in - CVS. HTML versions are also being kept in CVS under - <filename>doc/webserver/*</filename>. And PDF version are kept in - <filename>doc/pdf/*</filename>. - </para> - <para> - Formal documents are built with the Makefile targets of - <computeroutput>make dok</computeroutput>, or alternately - <computeroutput>make redhat-dok</computeroutput>. If you have problems, - try both. The build process uses the document SGML sources in - <computeroutput>doc/source/*/*</computeroutput> to update all text files in - <computeroutput>doc/text/</computeroutput> and to update all HTML - documents in <computeroutput>doc/webserver/</computeroutput>. - </para> - <para> - Documentation writers should please make sure documents build - successfully before committing to CVS, if possible. - </para> - <para> - How do you update the webserver (i.e. the pages on privoxy.org)? - - <orderedlist numeration="arabic"> - <listitem><para> - First, build the docs by running <computeroutput>make - dok</computeroutput> (or alternately <computeroutput>make - redhat-dok</computeroutput>). For PDF docs, do <computeroutput>make - dok-pdf</computeroutput>. - </para></listitem> - <listitem><para> - Run <computeroutput>make webserver</computeroutput> which copies all - files from <computeroutput>doc/webserver</computeroutput> to the - sourceforge webserver via scp. - </para></listitem> - </orderedlist> - </para> - - <para> - Finished docs should be occasionally submitted to CVS - (<filename>doc/webserver/*/*.html</filename>) so that those without - the ability to build them locally, have access to them if needed. - This is especially important just prior to a new release! Please - do this <emphasis>after</emphasis> the <literal>$VERSION</literal> and - other release specific data in <filename>configure.in</filename> has been - updated (this is done just prior to a new release). - </para> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="sgml"> -<title>Quickstart to Docbook and SGML</title> -<para> - If you are not familiar with SGML, it is a markup language similar to HTML. - Actually, not a mark up language per se, but a language used to define - markup languages. In fact, HTML is an SGML application. Both will use - <quote>tags</quote> to format text and other content. SGML tags can be much - more varied, and flexible, but do much of the same kinds of things. The tags, - or <quote>elements</quote>, are definable in SGML. There is no set - <quote>standards</quote>. Since we are using - <application>Docbook</application>, our tags are those that are defined by - <application>Docbook</application>. Much of how the finish document is - rendered is determined by the <quote>stylesheets</quote>. - The stylesheets determine how each tag gets translated to HTML, or other - formats. -</para> - -<para> - Tags in Docbook SGML need to be always <quote>closed</quote>. If not, you - will likely generate errors. Example: <literal><title>My - Title</title></literal>. They are also case-insensitive, but we - strongly suggest using all lower case. This keeps compatibility with - [Docbook] <application>XML</application>. -</para> - -<para> - Our documents use <quote>sections</quote> for the most part. Sections - will be processed into HTML headers (e.g. <literal>h1</literal> for - <literal>sect1</literal>). The <application>Docbook</application> stylesheets - will use these to also generate the Table of Contents for each doc. Our - TOC's are set to a depth of three. Meaning <literal>sect1</literal>, - <literal>sect2</literal>, and <literal>sect3</literal> will have TOC - entries, but <literal>sect4</literal> will not. Each section requires - a <literal><title></literal> element, and at least one - <literal><para></literal>. There is a limit of five section - levels in Docbook, but generally three should be sufficient for our - purposes. -</para> - -<para> - Some common elements that you likely will use: -</para> - -<para> - <simplelist> - <member> - <emphasis><para></para></emphasis>, paragraph delimiter. Most - text needs to be within paragraph elements (there are some exceptions). - </member> - <member> - <emphasis><emphasis></emphasis></emphasis>, the stylesheets - make this italics. - </member> - <member> - <emphasis><filename></filename></emphasis>, files and directories. - </member> - <member> - <emphasis><command></command></emphasis>, command examples. - </member> - <member> - <emphasis><literallayout></literallayout></emphasis>, like - <literal><pre></literal>, more or less. - </member> - <member> - <emphasis><itemizedlist></itemizedlist></emphasis>, list with bullets. - </member> - <member> - <emphasis><listitem></listitem></emphasis>, member of the above. - </member> - <member> - <emphasis><screen></screen></emphasis>, screen output, implies - <literal><literallayout></literal>. - </member> - <member> - <emphasis><ulink url="example.com"></ulink></emphasis>, like - HTML <literal><a></literal> tag. - </member> - <member> - <emphasis><quote></quote></emphasis>, for, doh, quoting text. - </member> - </simplelist> -</para> - -<para> - Look at any of the existing docs for examples of all these and more. -</para> - -<para> - You might also find <quote><ulink - url="http://opensource.bureau-cornavin.com/crash-course/index.html%22%3EWriting Documentation - Using DocBook - A Crash Course</ulink></quote> useful. -</para> -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> - <sect2 id="docstyle"> - <title><application>Privoxy</application> Documentation Style</title> - <para> - It will be easier if everyone follows a similar writing style. This - just makes it easier to read what someone else has written if it - is all done in a similar fashion. - </para> - <para> - Here it is: - </para> - <para> - <itemizedlist> - <listitem> - <para> - All tags should be lower case. - </para> - </listitem> - <listitem> - <para> - Tags delimiting a <emphasis>block</emphasis> of text (even small - blocks) should be on their own line. Like: - <literallayout> - <para> - Some text goes here. - </para> - </literallayout> - Tags marking individual words, or few words, should be in-line: - <literallayout> - Just to <emphasis>emphasize</emphasis>, some text goes here. - </literallayout> - </para> - </listitem> - <listitem> - <para> - Tags should be nested and step indented for block text like: (except - in-line tags) - <literallayout> - <para> - <itemizedlist> - <para> - <listitem> - Some text goes here in our list example. - </listitem> - </para> - </itemizedlist> - </para> - </literallayout> - This makes it easier to find the text amongst the tags ;-) - </para> - </listitem> - <listitem> - <para> - Use white space to separate logical divisions within a document, - like between sections. Running everything together consistently - makes it harder to read and work on. - </para> - </listitem> - <listitem> - <para> - Do not hesitate to make comments. Comments can either use the - <comment> element, or the <!-- --> style comment - familiar from HTML. (Note in Docbook v4.x <comment> is - replaced by <remark>.) - </para> - </listitem> - <listitem> - <para> - We have an international audience. Refrain from slang, or English - idiosyncrasies (too many to list :). Humor also does not translate - well sometimes. - </para> - </listitem> - <listitem> - <para> - Try to keep overall line lengths in source files to 80 characters or less - for obvious reasons. This is not always possible, with lengthy URLs for - instance. - </para> - </listitem> - <listitem> - <para> - Our documents are available in differing formats. Right now, they - are just plain text, HTML, and PDF, but others are always a - future possibility. Be careful with URLs (<ulink>), and avoid - this mistake: - </para> - <para> - My favorite site is <ulink url="http://example.com%22%3Ehere%3C/ulink%3E;. - </para> - <para> - This will render as <quote>My favorite site is here</quote>, which is - not real helpful in a text doc. Better like this: - </para> - <para> - My favorite site is <ulink url="http://example.com%22%3Eexample.com%3C/ulink%3E;. - </para> - </listitem> - <listitem> - <para> - All documents should be spell checked occasionally. - <application>aspell</application> can check SGML with the - <literal>-H</literal> option. (<application>ispell</application> I think - too.) - </para> - </listitem> - - </itemizedlist> - </para> - - </sect2> - - - <!-- ~~~~~ New section ~~~~~ --> - - <sect2><title>Privoxy Custom Entities</title> - <para> - <application>Privoxy</application> documentation is using - a number of customized <quote>entities</quote> to facilitate - documentation maintenance. - </para> - <para> - We are using a set of <quote>boilerplate</quote> files with generic text, - that is used by multiple docs. This way we can write something once, and use - it repeatedly without having to re-write the same content over and over again. - If editing such a file, keep in mind that it should be - <emphasis>generic</emphasis>. That is the purpose; so it can be used in varying - contexts without additional modifications. - </para> - <para> - We are also using what <application>Docbook</application> calls - <quote>internal entities</quote>. These are like variables in - programming. Well, sort of. For instance, we have the - <literal>p-version</literal> entity that contains the current - <application>Privoxy</application> version string. You are strongly - encouraged to use these where possible. Some of these obviously - require re-setting with each release (done by the Makefile). A sampling of - custom entities are listed below. See any of the main docs for examples. - </para> - - <para> - <itemizedlist> - <listitem> - <para> - Re- <quote>boilerplate</quote> text entities are defined like: - </para> - <para> - <literal><!entity supported SYSTEM "supported.sgml"></literal> - </para> - <para> - In this example, the contents of the file, - <filename>supported.sgml</filename> is available for inclusion anywhere - in the doc. To make this happen, just reference the now defined - entity: <literal>&supported;</literal> (starts with an ampersand - and ends with a semi-colon), and the contents will be dumped into - the finished doc at that point. - </para> - </listitem> - <listitem> - <para> - Commonly used <quote>internal entities</quote>: - </para> - <simplelist> - <member> - <emphasis>p-version</emphasis>: the <application>Privoxy</application> - version string, e.g. <quote>&p-version;</quote>. - </member> - <member> - <emphasis>p-status</emphasis>: the project status, either - <quote>alpha</quote>, <quote>beta</quote>, or <quote>stable</quote>. - </member> - <member> - <emphasis>p-not-stable</emphasis>: use to conditionally include - text in <quote>not stable</quote> releases (e.g. <quote>beta</quote>). - </member> - <member> - <emphasis>p-stable</emphasis>: just the opposite. - </member> - <member> - <emphasis>p-text</emphasis>: this doc is only generated as text. - </member> - </simplelist> - </listitem> - </itemizedlist> - </para> - <para> - There are others in various places that are defined for a specific - purpose. Read the source! - </para> - - </sect2> - - </sect1> - -<!-- <listitem><para>be consistent with the redirect script (i.e. the <application>Privoxy</application> program --> -<!-- points via the redirect URL at sf to valid end-points in the document)</para></listitem> --> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="coding"><title>Coding Guidelines</title> - - <sect2 id="s1"><title>Introduction</title> - - <para>This set of standards is designed to make our lives easier. It is - developed with the simple goal of helping us keep the "new and improved - <application>Privoxy</application>" consistent and reliable. Thus making - maintenance easier and increasing chances of success of the - project.</para> - - <para>And that of course comes back to us as individuals. If we can - increase our development and product efficiencies then we can solve more - of the request for changes/improvements and in general feel good about - ourselves. ;-></para> - - </sect2> - - <sect2 id="s2"><title>Using Comments</title> - - - <sect3 id="s3"><title>Comment, Comment, Comment</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Comment as much as possible without commenting the obvious. - For example do not comment "variable_a is equal to variable_b". - Instead explain why variable_a should be equal to the variable_b. - Just because a person can read code does not mean they will - understand why or what is being done. A reader may spend a lot - more time figuring out what is going on when a simple comment - or explanation would have prevented the extra research. Please - help your brother IJB'ers out!</para> - - <para>The comments will also help justify the intent of the code. - If the comment describes something different than what the code - is doing then maybe a programming error is occurring.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -/* if page size greater than 1k ... */ -if ( page_length() > 1024 ) -{ - ... "block" the page up ... -} - -/* if page size is small, send it in blocks */ -if ( page_length() > 1024 ) -{ - ... "block" the page up ... -} - -This demonstrates 2 cases of "what not to do". The first is a -"syntax comment". The second is a comment that does not fit what -is actually being done. -</programlisting> - </sect3> - - - - <sect3 id="s4"><title>Use blocks for comments</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Comments can help or they can clutter. They help when they - are differentiated from the code they describe. One line - comments do not offer effective separation between the comment - and the code. Block identifiers do, by surrounding the code - with a clear, definable pattern.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -/********************************************************************* - * This will stand out clearly in your code! - *********************************************************************/ -if ( this_variable == that_variable ) -{ - do_something_very_important(); -} - - -/* unfortunately, this may not */ -if ( this_variable == that_variable ) -{ - do_something_very_important(); -} - - -if ( this_variable == that_variable ) /* this may not either */ -{ - do_something_very_important(); -}</programlisting> - - <para><emphasis>Exception:</emphasis></para> - - <para>If you are trying to add a small logic comment and do not - wish to "disrupt" the flow of the code, feel free to use a 1 - line comment which is NOT on the same line as the code.</para> - - - </sect3> - - - <sect3 id="s5"><title>Keep Comments on their own line</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>It goes back to the question of readability. If the comment - is on the same line as the code it will be harder to read than - the comment that is on its own line.</para> - - <para>There are three exceptions to this rule, which should be - violated freely and often: during the definition of variables, - at the end of closing braces, when used to comment - parameters.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -/********************************************************************* - * This will stand out clearly in your code, - * But the second example won't. - *********************************************************************/ -if ( this_variable == this_variable ) -{ - do_something_very_important(); -} - -if ( this_variable == this_variable ) /*can you see me?*/ -{ - do_something_very_important(); /*not easily*/ -} - - -/********************************************************************* - * But, the encouraged exceptions: - *********************************************************************/ -int urls_read = 0; /* # of urls read + rejected */ -int urls_rejected = 0; /* # of urls rejected */ - -if ( 1 == X ) -{ - do_something_very_important(); -} - - -short do_something_very_important( - short firstparam, /* represents something */ - short nextparam /* represents something else */ ) -{ - ...code here... - -} /* -END- do_something_very_important */ -</programlisting> - </sect3> - - - <sect3 id="s6"><title>Comment each logical step</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Logical steps should be commented to help others follow the - intent of the written code and comments will make the code more - readable.</para> - - <para>If you have 25 lines of code without a comment, you should - probably go back into it to see where you forgot to put - one.</para> - - <para>Most "for", "while", "do", etc... loops _probably_ need a - comment. After all, these are usually major logic - containers.</para> - - - </sect3> - - - <sect3 id="s7"><title>Comment All Functions Thoroughly</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>A reader of the code should be able to look at the comments - just prior to the beginning of a function and discern the - reason for its existence and the consequences of using it. The - reader should not have to read through the code to determine if - a given function is safe for a desired use. The proper - information thoroughly presented at the introduction of a - function not only saves time for subsequent maintenance or - debugging, it more importantly aids in code reuse by allowing a - user to determine the safety and applicability of any function - for the problem at hand. As a result of such benefits, all - functions should contain the information presented in the - addendum section of this document.</para> - - - </sect3> - - - <sect3 id="s8"><title>Comment at the end of braces if the - content is more than one screen length</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Each closing brace should be followed on the same line by a - comment that describes the origination of the brace if the - original brace is off of the screen, or otherwise far away from - the closing brace. This will simplify the debugging, - maintenance, and readability of the code.</para> - - <para>As a suggestion , use the following flags to make the - comment and its brace more readable:</para> - - <para>use following a closing brace: } /* -END- if() or while () - or etc... */</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -if ( 1 == X ) -{ - do_something_very_important(); - ...some long list of commands... -} /* -END- if x is 1 */ - -or: - -if ( 1 == X ) -{ - do_something_very_important(); - ...some long list of commands... -} /* -END- if ( 1 == X ) */ -</programlisting> - </sect3> - - </sect2> - - <sect2 id="s9"><title>Naming Conventions</title> - - - - <sect3 id="s10"><title>Variable Names</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Use all lowercase, and separate words via an underscore - ('_'). Do not start an identifier with an underscore. (ANSI C - reserves these for use by the compiler and system headers.) Do - not use identifiers which are reserved in ANSI C++. (E.g. - template, class, true, false, ...). This is in case we ever - decide to port Privoxy to C++.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -int ms_iis5_hack = 0;</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para> -<programlisting> -int msiis5hack = 0; int msIis5Hack = 0; -</programlisting> -</para> - - - - </sect3> - - <sect3 id="s11"><title>Function Names</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Use all lowercase, and separate words via an underscore - ('_'). Do not start an identifier with an underscore. (ANSI C - reserves these for use by the compiler and system headers.) Do - not use identifiers which are reserved in ANSI C++. (E.g. - template, class, true, false, ...). This is in case we ever - decide to port Privoxy to C++.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -int load_some_file( struct client_state *csp )</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para> -<programlisting> -int loadsomefile( struct client_state *csp ) -int loadSomeFile( struct client_state *csp ) -</programlisting> -</para> - - - </sect3> - - - <sect3 id="s12"><title>Header file prototypes</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Use a descriptive parameter name in the function prototype - in header files. Use the same parameter name in the header file - that you use in the c file.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -(.h) extern int load_aclfile( struct client_state *csp ); -(.c) int load_aclfile( struct client_state *csp )</programlisting> - - <para><emphasis>Instead of:</emphasis> -<programlisting> -(.h) extern int load_aclfile( struct client_state * ); or -(.h) extern int load_aclfile(); -(.c) int load_aclfile( struct client_state *csp ) -</programlisting> -</para> - - - </sect3> - - - <sect3 id="s13"><title>Enumerations, and #defines</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Use all capital letters, with underscores between words. Do - not start an identifier with an underscore. (ANSI C reserves - these for use by the compiler and system headers.)</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -(enumeration) : enum Boolean { FALSE, TRUE }; -(#define) : #define DEFAULT_SIZE 100;</programlisting> - - <para><emphasis>Note:</emphasis> We have a standard naming scheme for #defines - that toggle a feature in the preprocessor: FEATURE_>, where - > is a short (preferably 1 or 2 word) description.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -#define FEATURE_FORCE 1 - -#ifdef FEATURE_FORCE -#define FORCE_PREFIX blah -#endif /* def FEATURE_FORCE */ -</programlisting> - </sect3> - - - <sect3 id="s14"><title>Constants</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Spell common words out entirely (do not remove vowels).</para> - - <para>Use only widely-known domain acronyms and abbreviations. - Capitalize all letters of an acronym.</para> - - <para>Use underscore (_) to separate adjacent acronyms and - abbreviations. Never terminate a name with an underscore.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -#define USE_IMAGE_LIST 1</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para> -<programlisting> -#define USE_IMG_LST 1 or -#define _USE_IMAGE_LIST 1 or -#define USE_IMAGE_LIST_ 1 or -#define use_image_list 1 or -#define UseImageList 1 -</programlisting> -</para> - - - </sect3> - - </sect2> - - - <sect2 id="s15"><title>Using Space</title> - - - - <sect3 id="s16"><title>Put braces on a line by themselves.</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>The brace needs to be on a line all by itself, not at the - end of the statement. Curly braces should line up with the - construct that they're associated with. This practice makes it - easier to identify the opening and closing braces for a - block.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -if ( this == that ) -{ - ... -}</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para>if ( this == that ) { ... }</para> - - <para>or</para> - - <para>if ( this == that ) { ... }</para> - - <para><emphasis>Note:</emphasis> In the special case that the if-statement is - inside a loop, and it is trivial, i.e. it tests for a - condition that is obvious from the purpose of the block, - one-liners as above may optically preserve the loop structure - and make it easier to read.</para> - - <para><emphasis>Status:</emphasis> developer-discretion.</para> - - <para><emphasis>Example exception:</emphasis></para> -<programlisting> -while ( more lines are read ) -{ - /* Please document what is/is not a comment line here */ - if ( it's a comment ) continue; - - do_something( line ); -} -</programlisting> - </sect3> - - - <sect3 id="s17"><title>ALL control statements should have a - block</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Using braces to make a block will make your code more - readable and less prone to error. All control statements should - have a block defined.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -if ( this == that ) -{ - do_something(); - do_something_else(); -}</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para>if ( this == that ) do_something(); do_something_else();</para> - - <para>or</para> - - <para>if ( this == that ) do_something();</para> - - <para><emphasis>Note:</emphasis> The first example in "Instead of" will execute - in a manner other than that which the developer desired (per - indentation). Using code braces would have prevented this - "feature". The "explanation" and "exception" from the point - above also applies.</para> - - - </sect3> - - - <sect3 id="s18"><title>Do not belabor/blow-up boolean - expressions</title> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -structure->flag = ( condition );</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para>if ( condition ) { structure->flag = 1; } else { - structure->flag = 0; }</para> - - <para><emphasis>Note:</emphasis> The former is readable and concise. The later - is wordy and inefficient. Please assume that any developer new - to the project has at least a "good" knowledge of C/C++. (Hope - I do not offend by that last comment ... 8-)</para> - - - </sect3> - - - <sect3 id="s19"><title>Use white space freely because it is - free</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Make it readable. The notable exception to using white space - freely is listed in the next guideline.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -int first_value = 0; -int some_value = 0; -int another_value = 0; -int this_variable = 0; - -if ( this_variable == this_variable ) - -first_value = old_value + ( ( some_value - another_value ) - whatever ) -</programlisting> - </sect3> - - - <sect3 id="s20"><title>Don't use white space around structure - operators</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>- structure pointer operator ( "->" ) - member operator ( - "." ) - functions and parentheses</para> - - <para>It is a general coding practice to put pointers, references, - and function parentheses next to names. With spaces, the - connection between the object and variable/function name is not - as clear.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -a_struct->a_member; -a_struct.a_member; -function_name();</programlisting> - - <para><emphasis>Instead of:</emphasis> a_struct -> a_member; a_struct . a_member; - function_name ();</para> - - - </sect3> - - - <sect3 id="s21"><title>Make the last brace of a function stand - out</title> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -int function1( ... ) -{ - ...code... - return( ret_code ); - -} /* -END- function1 */ - - -int function2( ... ) -{ -} /* -END- function2 */ -</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para>int function1( ... ) { ...code... return( ret_code ); } int - function2( ... ) { }</para> - - <para><emphasis>Note:</emphasis> Use 1 blank line before the closing brace and 2 - lines afterward. This makes the end of function standout to - the most casual viewer. Although function comments help - separate functions, this is still a good coding practice. In - fact, I follow these rules when using blocks in "for", "while", - "do" loops, and long if {} statements too. After all whitespace - is free!</para> - - <para><emphasis>Status:</emphasis> developer-discretion on the number of blank - lines. Enforced is the end of function comments.</para> - - - </sect3> - - - <sect3 id="s22"><title>Use 3 character indentions</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>If some use 8 character TABs and some use 3 character TABs, - the code can look *very* ragged. So use 3 character indentions - only. If you like to use TABs, pass your code through a filter - such as "expand -t3" before checking in your code.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -static const char * const url_code_map[256] = -{ - NULL, ... -}; - - -int function1( ... ) -{ - if ( 1 ) - { - return( ALWAYS_TRUE ); - } - else - { - return( HOW_DID_YOU_GET_HERE ); - } - - return( NEVER_GETS_HERE ); - -} -</programlisting> - </sect3> - - </sect2> - - - <sect2 id="s23"><title>Initializing</title> - - - - <sect3 id="s24"><title>Initialize all variables</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Do not assume that the variables declared will not be used - until after they have been assigned a value somewhere else in - the code. Remove the chance of accidentally using an unassigned - variable.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -short a_short = 0; -float a_float = 0; -struct *ptr = NULL;</programlisting> - - <para><emphasis>Note:</emphasis> It is much easier to debug a SIGSEGV if the - message says you are trying to access memory address 00000000 - and not 129FA012; or array_ptr[20] causes a SIGSEV vs. - array_ptr[0].</para> - - <para><emphasis>Status:</emphasis> developer-discretion if and only if the - variable is assigned a value "shortly after" declaration.</para> - - </sect3> - </sect2> - - - <sect2 id="s25"><title>Functions</title> - - - - <sect3 id="s26"><title>Name functions that return a boolean as a - question.</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Value should be phrased as a question that would logically - be answered as a true or false statement</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -should_we_block_this(); -contains_an_image(); -is_web_page_blank(); -</programlisting> - </sect3> - - - <sect3 id="s27"><title>Always specify a return type for a - function.</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>The default return for a function is an int. To avoid - ambiguity, create a return for a function when the return has a - purpose, and create a void return type if the function does not - need to return anything.</para> - - - </sect3> - - - <sect3 id="s28"><title>Minimize function calls when iterating by - using variables</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>It is easy to write the following code, and a clear argument - can be made that the code is easy to understand:</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -for ( size_t cnt = 0; cnt < block_list_length(); cnt++ ) -{ - .... -}</programlisting> - - <para><emphasis>Note:</emphasis> Unfortunately, this makes a function call for - each and every iteration. This increases the overhead in the - program, because the compiler has to look up the function each - time, call it, and return a value. Depending on what occurs in - the block_list_length() 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 block_list_length() is a function - call, with the same overhead.</para> - - <para>Instead of using a function call during the iterations, - assign the value to a variable, and evaluate using the - variable.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -size_t len = block_list_length(); - -for ( size_t cnt = 0; cnt < len; cnt++ ) -{ - .... -}</programlisting> - - <para><emphasis>Exceptions:</emphasis> if the value of block_list_length() - *may* change or could *potentially* change, then you must code the - function call in the for/while loop.</para> - - - </sect3> - - - <sect3 id="s29"><title>Pass and Return by Const Reference</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>This allows a developer to define a const pointer and call - your function. If your function does not have the const - keyword, we may not be able to use your function. Consider - strcmp, if it were defined as: extern int strcmp( char *s1, - char *s2 );</para> - - <para>I could then not use it to compare argv's in main: int main( - int argc, const char *argv[] ) { strcmp( argv[0], "privoxy" - ); }</para> - - <para>Both these pointers are *const*! If the c runtime library - maintainers do it, we should too.</para> - - - </sect3> - - - <sect3 id="s30"><title>Pass and Return by Value</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Most structures cannot fit onto a normal stack entry (i.e. - they are not 4 bytes or less). Aka, a function declaration - like: int load_aclfile( struct client_state csp )</para> - - <para>would not work. So, to be consistent, we should declare all - prototypes with "pass by value": int load_aclfile( struct - client_state *csp )</para> - - - </sect3> - - - <sect3 id="s31"><title>Names of include files</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Your include statements should contain the file name without - a path. The path should be listed in the Makefile, using -I as - processor directive to search the indicated paths. An exception - to this would be for some proprietary software that utilizes a - partial path to distinguish their header files from system or - other header files.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -#include <iostream.h> /* This is not a local include */ -#include "config.h" /* This IS a local include */ -</programlisting> - - <para><emphasis>Exception:</emphasis></para> - - <para> -<programlisting> -/* This is not a local include, but requires a path element. */ -#include <sys/fileName.h> -</programlisting> -</para> - - <para><emphasis>Note:</emphasis> Please! do not add "-I." to the Makefile - without a _very_ good reason. This duplicates the #include - "file.h" behavior.</para> - - - </sect3> - - - <sect3 id="s32"><title>Provide multiple inclusion - protection</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Prevents compiler and linker errors resulting from - redefinition of items.</para> - - <para>Wrap each header file with the following syntax to prevent - multiple inclusions of the file. Of course, replace PROJECT_H - with your file name, with "." Changed to "_", and make it - uppercase.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED - ... -#endif /* ndef PROJECT_H_INCLUDED */ -</programlisting> - </sect3> - - - <sect3 id="s33"><title>Use `extern "C"` when appropriate</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>If our headers are included from C++, they must declare our - functions as `extern "C"`. This has no cost in C, but increases - the potential re-usability of our code.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -#ifdef __cplusplus -extern "C" -{ -#endif /* def __cplusplus */ - -... function definitions here ... - -#ifdef __cplusplus -} -#endif /* def __cplusplus */ -</programlisting> - </sect3> - - - <sect3 id="s34"><title>Where Possible, Use Forward Struct - Declaration Instead of Includes</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Useful in headers that include pointers to other struct's. - Modifications to excess header files may cause needless - compiles.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -/********************************************************************* - * We're avoiding an include statement here! - *********************************************************************/ -struct file_list; -extern file_list *xyz;</programlisting> - - <para><emphasis>Note:</emphasis> If you declare "file_list xyz;" (without the - pointer), then including the proper header file is necessary. - If you only want to prototype a pointer, however, the header - file is unnecessary.</para> - - <para><emphasis>Status:</emphasis> Use with discretion.</para> - - - </sect3> - </sect2> - - <sect2 id="s35"><title>General Coding Practices</title> - - - - <sect3 id="s36"><title>Turn on warnings</title> - - <para><emphasis>Explanation</emphasis></para> - - <para>Compiler warnings are meant to help you find bugs. You - should turn on as many as possible. With GCC, the switch is - "-Wall". Try and fix as many warnings as possible.</para> - - - </sect3> - - - <sect3 id="s37"><title>Provide a default case for all switch - statements</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>What you think is guaranteed is never really guaranteed. The - value that you don't think you need to check is the one that - someday will be passed. So, to protect yourself from the - unknown, always have a default step in a switch statement.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -switch( hash_string( cmd ) ) -{ - case hash_actions_file : - ... code ... - break; - - case hash_confdir : - ... code ... - break; - - default : - log_error( ... ); - ... anomaly code goes here ... - continue; / break; / exit( 1 ); / etc ... - -} /* end switch( hash_string( cmd ) ) */</programlisting> - - <para><emphasis>Note:</emphasis> If you already have a default condition, you - are obviously exempt from this point. Of note, most of the - WIN32 code calls `DefWindowProc' after the switch statement. - This API call *should* be included in a default statement.</para> - - <para><emphasis>Another Note:</emphasis> This is not so much a readability issue - as a robust programming issue. The "anomaly code goes here" may - be no more than a print to the STDERR stream (as in - load_config). Or it may really be an abort condition.</para> - - <para><emphasis>Status:</emphasis> Programmer discretion is advised.</para> - - - </sect3> - - - <sect3 id="s38"><title>Try to avoid falling through cases in a - switch statement.</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>In general, you will want to have a 'break' statement within - each 'case' of a switch statement. This allows for the code to - be more readable and understandable, and furthermore can - prevent unwanted surprises if someone else later gets creative - and moves the code around.</para> - - <para>The language allows you to plan the fall through from one - case statement to another simply by omitting the break - statement within the case statement. This feature does have - benefits, but should only be used in rare cases. In general, - use a break statement for each case statement.</para> - - <para>If you choose to allow fall through, you should comment both - the fact of the fall through and reason why you felt it was - necessary.</para> - - - </sect3> - - - <sect3 id="s39"><title>Use 'long' or 'short' Instead of - 'int'</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>On 32-bit platforms, int usually has the range of long. On - 16-bit platforms, int has the range of short.</para> - - <para><emphasis>Status:</emphasis> open-to-debate. In the case of most FSF - projects (including X/GNU-Emacs), there are typedefs to int4, - int8, int16, (or equivalence ... I forget the exact typedefs - now). Should we add these to IJB now that we have a "configure" - script?</para> - - - </sect3> - - - <sect3 id="s40"><title>Don't mix size_t and other types</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>The type of size_t varies across platforms. Do not make - assumptions about whether it is signed or unsigned, or about - how long it is. Do not compare a size_t against another - variable of a different type (or even against a constant) - without casting one of the values.</para> - - - </sect3> - - - <sect3 id="s41"><title>Declare each variable and struct on its - own line.</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>It can be tempting to declare a series of variables all on - one line. Don't.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -long a = 0; -long b = 0; -long c = 0;</programlisting> - - <para><emphasis>Instead of:</emphasis></para> - - <para>long a, b, c;</para> - - <para><emphasis>Explanation:</emphasis> - there is more room for comments on the - individual variables - easier to add new variables without - messing up the original ones - when searching on a variable to - find its type, there is less clutter to "visually" - eliminate</para> - - <para><emphasis>Exceptions:</emphasis> when you want to declare a bunch of loop - variables or other trivial variables; feel free to declare them - on one line. You should, although, provide a good comment on - their functions.</para> - - <para><emphasis>Status:</emphasis> developer-discretion.</para> - - - </sect3> - - - <sect3 id="s42"><title>Use malloc/zalloc sparingly</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>Create a local struct (on the stack) if the variable will - live and die within the context of one function call.</para> - - <para>Only "malloc" a struct (on the heap) if the variable's life - will extend beyond the context of one function call.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -If a function creates a struct and stores a pointer to it in a -list, then it should definitely be allocated via `malloc'. -</programlisting> - </sect3> - - - <sect3 id="s43"><title>The Programmer Who Uses 'malloc' is - Responsible for Ensuring 'free'</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>If you have to "malloc" an instance, you are responsible for - insuring that the instance is `free'd, even if the deallocation - event falls within some other programmer's code. You are also - responsible for ensuring that deletion is timely (i.e. not too - soon, not too late). This is known as "low-coupling" and is a - "good thing (tm)". You may need to offer a - free/unload/destructor type function to accommodate this.</para> - - <para><emphasis>Example:</emphasis></para> -<programlisting> -int load_re_filterfile( struct client_state *csp ) { ... } -static void unload_re_filterfile( void *f ) { ... }</programlisting> - - <para><emphasis>Exceptions:</emphasis></para> - - <para>The developer cannot be expected to provide `free'ing - functions for C run-time library functions ... such as - `strdup'.</para> - - <para><emphasis>Status:</emphasis> developer-discretion. The "main" use of this - standard is for allocating and freeing data structures (complex - or nested).</para> - - - </sect3> - - - <sect3 id="s44"><title>Add loaders to the `file_list' structure - and in order</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>I have ordered all of the "blocker" file code to be in alpha - order. It is easier to add/read new blockers when you expect a - certain order.</para> - - <para><emphasis>Note:</emphasis> It may appear that the alpha order is broken in - places by POPUP tests coming before PCRS tests. But since - POPUPs can also be referred to as KILLPOPUPs, it is clear that - it should come first.</para> - - - </sect3> - - - <sect3 id="s45"><title>"Uncertain" new code and/or changes to - existing code, use FIXME or XXX</title> - - <para><emphasis>Explanation:</emphasis></para> - - <para>If you have enough confidence in new code or confidence in - your changes, but are not *quite* sure of the repercussions, - add this:</para> - - <para>/* FIXME: this code has a logic error on platform XYZ, * - attempting to fix */ #ifdef PLATFORM ...changed code here... - #endif</para> - - <para>or:</para> - - <para>/* FIXME: I think the original author really meant this... - */ ...changed code here...</para> - - <para>or:</para> - - <para>/* FIXME: new code that *may* break something else... */ - ...new code here...</para> - - <para><emphasis>Note:</emphasis> If you make it clear that this may or may not - be a "good thing (tm)", it will be easier to identify and - include in the project (or conversely exclude from the - project).</para> - - - </sect3> - - </sect2> - - <sect2 id="s46"><title>Addendum: Template for files and function - comment blocks:</title> - - <para><emphasis>Example for file comments:</emphasis></para> -<programlisting> -const char FILENAME_rcs[] = "$I<!-- Break CVS Substitution -->d$"; -/********************************************************************* - * - * File : $S<!-- Break CVS Substitution -->ource$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001-2009 - * the Privoxy team. http://www.privoxy.org/ - * - * 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/licenses/old-licenses/gpl-2.0.html - * or write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 , - * USA - * - * Revisions : - * $L<!-- Break CVS Substitution -->og$ - * - *********************************************************************/ - - -#include "config.h" - - ...necessary include files for us to do our work... - -const char FILENAME_h_rcs[] = FILENAME_H_VERSION; -</programlisting> - - <para><emphasis>Note:</emphasis> This declares the rcs variables that should be - added to the "show-proxy-args" page. If this is a brand new - creation by you, you are free to change the "Copyright" section - to represent the rights you wish to maintain.</para> - - <para><emphasis>Note:</emphasis> The formfeed character that is present right - after the comment flower box is handy for (X|GNU)Emacs users to - skip the verbiage and get to the heart of the code (via - `forward-page' and `backward-page'). Please include it if you - can.</para> - - <para><emphasis>Example for file header comments:</emphasis></para> -<programlisting> -#ifndef _FILENAME_H -#define _FILENAME_H -#define FILENAME_H_VERSION "$I<!-- Break CVS Substitution -->d$" -/********************************************************************* - * - * File : $S<!-- Break CVS Substitution -->ource$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001-2009 - * the Privoxy team. http://www.privoxy.org/ - * - * 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/licenses/old-licenses/gpl-2.0.html - * or write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 , - * USA - * - * Revisions : - * $L<!-- Break CVS Substitution -->og$ - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - - ... function headers here ... - - -/* Revision control strings from this header and associated .c file */ -extern const char FILENAME_rcs[]; -extern const char FILENAME_h_rcs[]; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef _FILENAME_H */ - -/* - Local Variables: - tab-width: 3 - end: -*/ -</programlisting> - - <para><emphasis>Example for function comments:</emphasis></para> -<programlisting> -/********************************************************************* - * - * Function : FUNCTION_NAME - * - * Description : (Fill me in with a good description!) - * - * parameters : - * 1 : param1 = pointer to an important thing - * 2 : x = pointer to something else - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int FUNCTION_NAME( void *param1, const char *x ) -{ - ... - return( 0 ); - -} -</programlisting> - - <para><emphasis>Note:</emphasis> If we all follow this practice, we should be - able to parse our code to create a "self-documenting" web - page.</para> - - </sect2> - - </sect1> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="testing"><title>Testing Guidelines</title> - <para>To be filled. -</para> - - <!-- ~~~~~ New section ~~~~~ --> - <sect2 id="testing-plan"><title>Testplan for releases</title> - <para> - Explain release numbers. major, minor. developer releases. etc. - -<orderedlist numeration="arabic"> - <listitem><para> -Remove any existing rpm with rpm -e -</para></listitem> - <listitem><para> -Remove any file that was left over. This includes (but is not limited to) - <itemizedlist> - <listitem><para>/var/log/privoxy</para></listitem> - <listitem><para>/etc/privoxy</para></listitem> - <listitem><para>/usr/sbin/privoxy</para></listitem> - <listitem><para>/etc/init.d/privoxy</para></listitem> - <listitem><para>/usr/doc/privoxy*</para></listitem> - </itemizedlist> -</para></listitem> - <listitem><para> -Install the rpm. Any error messages? -</para></listitem> - <listitem><para>start,stop,status <application>Privoxy</application> with the specific script - (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does - autostart work?</para></listitem> - <listitem><para>Start browsing. Does <application>Privoxy</application> work? Logfile written?</para></listitem> - <listitem><para>Remove the rpm. Any error messages? All files removed?</para></listitem> - </orderedlist> -</para> - </sect2> - - <!-- ~~~~~ New section ~~~~~ --> - <sect2 id="testing-report"><title>Test reports</title> - <para> -Please submit test reports only with the <ulink url="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005">test form</ulink> -at sourceforge. Three simple steps: - <itemizedlist> - - <listitem><para>Select category: the distribution you test on.</para></listitem> - <listitem><para>Select group: the version of <application>Privoxy</application> that we are about to release.</para></listitem> - <listitem><para>Fill the Summary and Detailed Description with something - intelligent (keep it short and precise).</para> - </listitem> - </itemizedlist> - Do not mail to the mailing list (we cannot keep track on issues there). - </para> - </sect2> - - </sect1> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="newrelease"><title>Releasing a New Version</title> - <para> - When we release versions of <application>Privoxy</application>, - our work leaves our cozy secret lab and has to work in the cold - RealWorld[tm]. Once it is released, there is no way to call it - back, so it is very important that great care is taken to ensure - that everything runs fine, and not to introduce problems in the - very last minute. - </para> - <para> - So when releasing a new version, please adhere exactly to the - procedure outlined in this chapter. - </para> - - <para> - The following programs are required to follow this process: - <filename>ncftpput</filename> (ncftp), <filename>scp, ssh</filename> (ssh), - <filename>gmake</filename> (GNU's version of make), autoconf, cvs. - </para> - - <sect2 id="versionnumbers"> - <title>Version numbers</title> - - <para> - First you need to determine which version number the release will have. - <application>Privoxy</application> version numbers consist of three numbers, - separated by dots, like in X.Y.Z (e.g. 3.0.0), where: - <itemizedlist> - <listitem> - <para> - X, the version major, is rarely ever changed. It is increased by one if - turning a development branch into stable substantially changes the functionality, - user interface or configuration syntax. Majors 1 and 2 were - <application>Junkbuster</application>, and 3 will be the first stable - <application>Privoxy</application> release. - </para> - </listitem> - <listitem> - <para> - Y, the version minor, represents the branch within the major version. - At any point in time, there are two branches being maintained: - The stable branch, with an even minor, say, 2N, in which no functionality is - being added and only bug-fixes are made, and 2N+1, the development branch, in - which the further development of <application>Privoxy</application> takes - place. - This enables us to turn the code upside down and inside out, while at the same time - providing and maintaining a stable version. - The minor is reset to zero (and one) when the major is incremented. When a development - branch has matured to the point where it can be turned into stable, the old stable branch - 2N is given up (i.e. no longer maintained), the former development branch 2N+1 becomes the - new stable branch 2N+2, and a new development branch 2N+3 is opened. - </para> - </listitem> - <listitem> - <para> - Z, the point or sub version, represents a release of the software within a branch. - It is therefore incremented immediately before each code freeze. - In development branches, only the even point versions correspond to actual releases, - while the odd ones denote the evolving state of the sources on CVS in between. - It follows that Z is odd on CVS in development branches most of the time. There, it gets - increased to an even number immediately before a code freeze, and is increased to an odd - number again immediately thereafter. - This ensures that builds from CVS snapshots are easily distinguished from released versions. - The point version is reset to zero when the minor changes. - </para> - <para> - Stable branches work a little differently, since there should be - little to no development happening in such branches. Remember, - only bugfixes, which presumably should have had some testing - before being committed. Stable branches will then have their - version reported as <literal>0.0.0</literal>, during that period - between releases when changes are being added. This is to denote - that this code is <emphasis>not for release</emphasis>. Then - as the release nears, the version is bumped according: e.g. - <literal>3.0.1 -> 0.0.0 -> 3.0.2</literal>. - </para> - </listitem> - </itemizedlist> - </para> - <para> - In summary, the main CVS trunk is the development branch where new - features are being worked on for the next stable series. This should - almost always be where the most activity takes place. There is always at - least one stable branch from the trunk, e.g now it is - <literal>3.0</literal>, which is only used to release stable versions. - Once the initial *.0 release of the stable branch has been done, then as a - rule, only bugfixes that have had prior testing should be committed to - the stable branch. Once there are enough bugfixes to justify a new - release, the version of this branch is again incremented Example: 3.0.0 - -> 3.0.1 -> 3.0.2, etc are all stable releases from within the stable - branch. 3.1.x is currently the main trunk, and where work on 3.2.x is - taking place. If any questions, please post to the devel list - <emphasis>before</emphasis> committing to a stable branch! - </para> - <para> - Developers should remember too that if they commit a bugfix to the stable - branch, this will more than likely require a separate submission to the - main trunk, since these are separate development trees within CVS. If you - are working on both, then this would require at least two separate check - outs (i.e main trunk, <emphasis>and</emphasis> the stable release branch, - which is <literal>v_3_0_branch</literal> at the moment). - </para> - - </sect2> - - <sect2 id="beforerelease"> - <title>Before the Release: Freeze</title> - <para> - The following <emphasis>must be done by one of the - developers</emphasis> prior to each new release. - </para> - <para> - <itemizedlist> - <listitem> - <para> - Make sure that everybody who has worked on the code in the last - couple of days has had a chance to yell <quote>no!</quote> in case - they have pending changes/fixes in their pipelines. Announce the - freeze so that nobody will interfere with last minute changes. - </para> - </listitem> - <listitem> - <para> - Increment the version number (point from odd to even in development - branches!) in <filename>configure.in</filename>. (RPM spec files - will need to be incremented as well.) - </para> - </listitem> - <listitem> - <para> - If <filename>default.action</filename> has changed since last - release (i.e. software release or standalone actions file release), - bump up its version info to A.B in this line: - </para> - <para> - <programlisting> - {+add-header{X-Actions-File-Version: A.B} -filter -no-popups} -</programlisting> - </para> - <para> - Then change the version info in doc/webserver/actions/index.php, - line: '$required_actions_file_version = "A.B";' - </para> - </listitem> - <listitem> - <para> - All documentation should be rebuild after the version bump. - Finished docs should be then be committed to CVS (for those - without the ability to build these). Some docs may require - rather obscure processing tools. <filename>config</filename>, - the man page (and the html version of the man page), and the PDF docs - fall in this category. REAMDE, the man page, AUTHORS, and config - should all also be committed to CVS for other packagers. The - formal docs should be uploaded to the webserver. See the - Section "Updating the webserver" in this manual for details. - </para> - </listitem> - <listitem> - <para> - The <citetitle>User Manual</citetitle> is also used for context - sensitive help for the CGI editor. This is version sensitive, so that - the user will get appropriate help for his/her release. So with - each release a fresh version should be uploaded to the webserver - (this is in addition to the main <citetitle>User Manual</citetitle> - link from the main page since we need to keep manuals for various - versions available). The CGI pages will link to something like - <literal>http://privoxy.org/$(VERSION)/user-manual/</literal>. This - will need to be updated for each new release. There is no Makefile - target for this at this time!!! It needs to be done manually. - </para> - </listitem> - <listitem> - <para> - All developers should look at the <filename>ChangeLog</filename> and - make sure noteworthy changes are referenced. - </para> - </listitem> - <listitem> - <para> - <emphasis>Commit all files that were changed in the above steps!</emphasis> - </para> - </listitem> - <listitem> - <para> - Tag all files in CVS with the version number with - <quote><command>cvs tag v_X_Y_Z</command></quote>. - Don't use vX_Y_Z, ver_X_Y_Z, v_X.Y.Z (won't work) etc. - </para> - </listitem> - <listitem> - <para> - If the release was in a development branch, increase the point version - from even to odd (X.Y.(Z+1)) again in <filename>configure.in</filename> and - commit your change. - </para> - </listitem> - <listitem> - <para> - On the webserver, copy the user manual to a new top-level directory - called <filename>X.Y.Z</filename>. This ensures that help links from the CGI - pages, which have the version as a prefix, will go into the right version of the manual. - If this is a development branch release, also symlink <filename>X.Y.(Z-1)</filename> - to <filename>X.Y.Z</filename> and <filename>X.Y.(Z+1)</filename> to - <filename>.</filename> (i.e. dot). - </para> - </listitem> - </itemizedlist> - </para> - </sect2> - - <sect2 id="therelease"> - <title>Building and Releasing the Packages</title> - <para> - Now the individual packages can be built and released. Note that for - GPL reasons the first package to be released is always the source tarball. - </para> - - <para> - For <emphasis>all</emphasis> types of packages, including the source tarball, - <emphasis>you must make sure that you build from clean sources by exporting - the right version from CVS into an empty directory</emphasis> (just press return when - asked for a password): - </para> - - <para> - <programlisting> - mkdir dist # delete or choose different name if it already exists - cd dist - cvs -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa export -r v_X_Y_Z current -</programlisting> - </para> - - <para> - <emphasis>Do NOT change</emphasis> a single bit, including, but not limited to - version information after export from CVS. This is to make sure that - all release packages, and with them, all future bug reports, are based - on exactly the same code. - </para> - - <warning> - <para> - Every significant release of Privoxy has included at least one - package that either had incorrect versions of files, missing files, - or incidental leftovers from a previous build process that gave - unknown numbers of users headaches to try to figure out what was - wrong. PLEASE, make sure you are using pristene sources, and are - following the prescribed process! - </para> - </warning> - - <para> - Please find additional instructions for the source tarball and the - individual platform dependent binary packages below. And details - on the Sourceforge release process below that. - </para> - - <sect3 id="pack-guidelines"> - <title>Note on Privoxy Packaging</title> - <para> - Please keep these general guidelines in mind when putting together - your package. These apply to <emphasis>all</emphasis> platforms! - </para> - <para> - <itemizedlist> - <listitem> - <para> - <application>Privoxy</application> <emphasis>requires</emphasis> - write access to: all <filename>*.action</filename> files, all - logfiles, and the <filename>trust</filename> file. You will - need to determine the best way to do this for your platform. - </para> - </listitem> - <listitem> - <para> - Please include up to date documentation. At a bare minimum: - </para> - <simplelist> - <member> - <filename>LICENSE</filename> (top-level directory) - </member> - </simplelist> - <simplelist> - <member> - <filename>README</filename> (top-level directory) - </member> - </simplelist> - <simplelist> - <member> - <filename>AUTHORS</filename> (top-level directory) - </member> - </simplelist> - <simplelist> - <member> - <filename>man page</filename> (top-level directory, Unix-like - platforms only) - </member> - </simplelist> - <simplelist> - <member> - <filename>The User Manual</filename> (doc/webserver/user-manual/) - </member> - </simplelist> - <simplelist> - <member> - <filename>FAQ</filename> (doc/webserver/faq/) - </member> - </simplelist> - <para> - Also suggested: <filename>Developer Manual</filename> - (doc/webserver/developer-manual) and <filename>ChangeLog</filename> - (top-level directory). <filename>FAQ</filename> and the manuals are - HTML docs. There are also text versions in - <filename>doc/text/</filename> which could conceivably also be - included. - </para> - <para> - The documentation has been designed such that the manuals are linked - to each other from parallel directories, and should be packaged - that way. <filename>privoxy-index.html</filename> can also be - included and can serve as a focal point for docs and other links of - interest (and possibly renamed to <filename>index.html</filename>). - This should be one level up from the manuals. There is a link also - on this page to an HTMLized version of the man page. To avoid 404 for - this, it is in CVS as - <filename>doc/webserver/man-page/privoxy-man-page.html</filename>, - and should be included along with the manuals. There is also a - css stylesheets that can be included for better presentation: - <filename>p_doc.css</filename>. This should be in the same directory - with <filename>privoxy-index.html</filename>, (i.e. one level up from - the manual directories). - </para> - </listitem> - <listitem> - <para> - <filename>user.action</filename> and <filename>user.filter</filename> - are designed for local preferences. Make sure these do not get overwritten! - <filename>config</filename> should not be overwritten either. This - has especially important configuration data in it. - <filename>trust</filename> should be left in tact as well. - </para> - </listitem> - <listitem> - <para> - Other configuration files (<filename>default.action</filename> and - <filename>default.filter</filename>) should be installed as the new - defaults, but all previously installed configuration files should be - preserved as backups. This is just good manners :-) These files are - likely to change between releases and contain important new features - and bug fixes. - </para> - </listitem> - <listitem> - <para> - Please check platform specific notes in this doc, if you haven't - done <quote>Privoxy</quote> packaging before for other platform - specific issues. Conversely, please add any notes that you know - are important for your platform (or contact one of the doc - maintainers to do this if you can't). - </para> - </listitem> - <listitem> - <para> - Packagers should do a <quote>clean</quote> install of their - package after building it. So any previous installs should be - removed first to ensure the integrity of the newly built package. - Then run the package for a while to make sure there are no - obvious problems, before uploading. - </para> - </listitem> - - </itemizedlist> - </para> - - </sect3> - - <sect3 id="newrelease-tarball"><title>Source Tarball</title> - <para> - First, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then run: - </para> - <para> - <programlisting> - cd current - autoheader && autoconf && ./configure -</programlisting> - </para> - <para> - Then do: - </para> - <para> - <programlisting> - make tarball-dist -</programlisting> - </para> - <para> - To upload the package to Sourceforge, simply issue - </para> - <para> - <programlisting> - make tarball-upload -</programlisting> - </para> - <para> - Go to the displayed URL and release the file publicly on Sourceforge. - For the change log field, use the relevant section of the - <filename>ChangeLog</filename> file. - </para> - </sect3> - - <sect3 id="newrelease-rpm"><title>SuSE, Conectiva or Red Hat RPM</title> - <para> - In following text, replace <replaceable class="parameter">dist</replaceable> - with either <quote>rh</quote> for Red Hat or <quote>suse</quote> for SuSE. - </para> - <para> - First, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). - </para> - <para> - As the only exception to not changing anything after export from CVS, - now examine the file <filename>privoxy-</filename><replaceable class="parameter">dist</replaceable><filename>.spec</filename> - and make sure that the version information and the RPM release number are - correct. The RPM release numbers for each version start at one. Hence it must - be reset to one if this is the first RPM for - <replaceable class="parameter">dist</replaceable> which is built from version - X.Y.Z. Check the - <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118">file - list</ulink> if unsure. Else, it must be set to the highest already available RPM - release number for that version plus one. - </para> - <para> - Then run: - </para> - <para> - <programlisting> - cd current - autoheader && autoconf && ./configure -</programlisting> - </para> - <para> - Then do - </para> - <para> - <programlisting> - make <replaceable class="parameter">dist</replaceable>-dist -</programlisting> - </para> - <para> - To upload the package to Sourceforge, simply issue - </para> - <para> - <programlisting> - make <replaceable class="parameter">dist</replaceable>-upload <replaceable class="parameter">rpm_packagerev</replaceable> -</programlisting> - </para> - <para> - where <replaceable class="parameter">rpm_packagerev</replaceable> is the - RPM release number as determined above. - Go to the displayed URL and release the file publicly on Sourceforge. - Use the release notes and change log from the source tarball package. - </para> - </sect3> - - <sect3 id="newrelease-os2"><title>OS/2</title> - <para> - First, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then get the OS/2 Setup module: - </para> - <para> - <programlisting> - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co os2setup -</programlisting> - </para> - <para> - You will need a mix of development tools. - The main compilation takes place with IBM Visual Age C++. - Some ancillary work takes place with GNU tools, available from - various sources like hobbes.nmsu.edu. - Specificially, you will need <filename>autoheader</filename>, - <filename>autoconf</filename> and <filename>sh</filename> tools. - The packaging takes place with WarpIN, available from various sources, including - its home page: <ulink url="http://www.xworkplace.org/">xworkplace</ulink>. - </para> - <para> - Change directory to the <filename>os2setup</filename> directory. - Edit the os2build.cmd file to set the final executable filename. - For example, - </para> - <para> - <programlisting> - installExeName='privoxyos2_setup_X.Y.Z.exe' -</programlisting> - </para> - <para> - Next, edit the <filename>IJB.wis</filename> file so the release number matches - in the <filename>PACKAGEID</filename> section: - </para> - <para> - <programlisting> - PACKAGEID="Privoxy Team\Privoxy\Privoxy Package\X\Y\Z" -</programlisting> - </para> - <para> - You're now ready to build. Run: - </para> - <para> - <programlisting> - os2build -</programlisting> - </para> - <para> - You will find the WarpIN-installable executable in the - <filename>./files</filename> directory. Upload this anonymously to - <filename>uploads.sourceforge.net/incoming</filename>, create a release - for it, and you're done. Use the release notes and Change Log from the - source tarball package. - </para> - </sect3> - - <sect3 id="newrelease-solaris"><title>Solaris</title> - <para> - Login to Sourceforge's compilefarm via ssh: - </para> - <para> - <programlisting> - ssh cf.sourceforge.net -</programlisting> - </para> - <para> - Choose the right operating system (not the Debian one). - When logged in, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then run: - </para> - <para> - <programlisting> - cd current - autoheader && autoconf && ./configure -</programlisting> - </para> - <para> - Then run - </para> - <para> - <programlisting> - gmake solaris-dist -</programlisting> - </para> - <para> - which creates a gzip'ed tar archive. Sadly, you cannot use <command>make - solaris-upload</command> on the Sourceforge machine (no ncftpput). You now have - to manually upload the archive to Sourceforge's ftp server and release - the file publicly. Use the release notes and Change Log from the - source tarball package. - </para> - </sect3> - - <sect3 id="newrelease-windows"><title>Windows</title> - <para> - You should ensure you have the latest version of Cygwin (from - <ulink url="http://www.cygwin.com/">http://www.cygwin.com/</ulink>). - Run the following commands from within a Cygwin bash shell. - </para> - <para> - First, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then get the Windows setup module: - </para> - <para> - <programlisting> - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co winsetup -</programlisting> - </para> - <para> - Then you can build the package. This is fully automated, and is - controlled by <filename>winsetup/GNUmakefile</filename>. - All you need to do is: - </para> - <para> - <programlisting> - cd winsetup - make -</programlisting> - </para> - <para> - Now you can manually rename <filename>privoxy_setup.exe</filename> to - <filename>privoxy_setup_X_Y_Z.exe</filename>, and upload it to - SourceForge. When releasing the package on SourceForge, use the release notes - and Change Log from the source tarball package. - </para> - </sect3> - - <sect3 id="newrelease-debian"><title>Debian</title> - <para> - First, <emphasis>make sure that you have freshly exported the - right version into an empty directory</emphasis>. (See - "Building and releasing packages" above). Then add a log - entry to <filename>debian/changelog</filename>, if it is not - already there, for example by running: - </para> - <para> - <programlisting> - debchange -v &p-version;-&p-status;-1 "New upstream version" -</programlisting> - </para> - <para> - Then, run: - </para> - <para> - <programlisting> - dpkg-buildpackage -rfakeroot -us -uc -b -</programlisting> - </para> - <para> - This will create - <filename>../privoxy_&p-version;-&p-status;-1_i386.deb</filename> - which can be uploaded. To upload the package to Sourceforge, simply - issue - </para> - <para> - <programlisting> - make debian-upload -</programlisting> - </para> - </sect3> - - <sect3 id="newrelease-macosx"><title>Mac OS X</title> - <para> - First, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then get the Mac OS X setup module: - </para> - <para> - <programlisting> - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co osxsetup -</programlisting> - </para> - <para> - Then run: - </para> - <para> - <programlisting> - cd osxsetup - build -</programlisting> - </para> - <para> - This will run <filename>autoheader</filename>, <filename>autoconf</filename> and - <filename>configure</filename> as well as <filename>make</filename>. - Finally, it will copy over the necessary files to the ./osxsetup/files directory - for further processing by <filename>PackageMaker</filename>. - </para> - <para> - Bring up PackageMaker with the PrivoxyPackage.pmsp definition file, modify the package - name to match the release, and hit the "Create package" button. - If you specify ./Privoxy.pkg as the output package name, you can then create - the distributable zip file with the command: - </para> - <para> - <programlisting> - zip -r privoxyosx_setup_x.y.z.zip Privoxy.pkg -</programlisting> - </para> - <para> - You can then upload <filename>privoxyosx_setup_x.y.z.zip</filename> anonymously to - <filename>uploads.sourceforge.net/incoming</filename>, - create a release for it, and you're done. Use the release notes - and Change Log from the source tarball package. - </para> - </sect3> - - <sect3 id="newrelease-freebsd"><title>FreeBSD</title> - <para> - Login to Sourceforge's compile-farm via ssh: - </para> - <para> - <programlisting> - ssh cf.sourceforge.net -</programlisting> - </para> - <para> - Choose the right operating system. - When logged in, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then run: - </para> - <para> - <programlisting> - cd current - autoheader && autoconf && ./configure -</programlisting> - </para> - <para> - Then run: - </para> - <para> - <programlisting> - gmake freebsd-dist -</programlisting> - </para> - <para> - which creates a gzip'ed tar archive. Sadly, you cannot use <command>make - freebsd-upload</command> on the Sourceforge machine (no ncftpput). You now have - to manually upload the archive to Sourceforge's ftp server and release - the file publicly. Use the release notes and Change Log from the - source tarball package. - </para> - </sect3> - - <sect3 id="newrelease-hpux"><title>HP-UX 11</title> - <para> - First, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then run: - </para> - <para> - <programlisting> - cd current - autoheader && autoconf && ./configure -</programlisting> - </para> - <para> - Then do FIXME. - </para> - </sect3> - - <sect3 id="newrelease-amiga"><title>Amiga OS</title> - <para> - First, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then run: - </para> - <para> - <programlisting> - cd current - autoheader && autoconf && ./configure -</programlisting> - </para> - <para> - Then do FIXME. - </para> - </sect3> - - <sect3 id="newrelease-aix"><title>AIX</title> - <para> - Login to Sourceforge's compilefarm via ssh: - </para> - <para> - <programlisting> - ssh cf.sourceforge.net -</programlisting> - </para> - <para> - Choose the right operating system. - When logged in, <emphasis>make sure that you have freshly exported the right - version into an empty directory</emphasis>. (See "Building and releasing - packages" above). Then run: - </para> - <para> - <programlisting> - cd current - autoheader && autoconf && ./configure -</programlisting> - </para> - <para> - Then run: - </para> - <para> - <programlisting> - make aix-dist -</programlisting> - </para> - <para> - which creates a gzip'ed tar archive. Sadly, you cannot use <command>make - aix-upload</command> on the Sourceforge machine (no ncftpput). You now have - to manually upload the archive to Sourceforge's ftp server and release - the file publicly. Use the release notes and Change Log from the - source tarball package. - </para> - </sect3> - </sect2> - - <sect2 id="releasing"> - <title>Uploading and Releasing Your Package</title> - <para> - After the package is ready, it is time to upload it - to SourceForge, and go through the release steps. The upload - is done via FTP: - </para> - <para> - <itemizedlist> - <listitem> - <para> - Upload to: <ulink url="ftp://upload.sourceforge.net/incoming">ftp://upload.sourceforge.net/incoming</ulink> - </para> - </listitem> - <listitem> - <para> - user: <literal>anonymous</literal> - </para> - </listitem> - <listitem> - <para> - password: <literal>ijbswa-developers@lists.sourceforge.net</literal> - </para> - </listitem> - </itemizedlist> - </para> - <para> - Or use the <command>make</command> targets as described above. - </para> - <para> - Once this done go to <ulink - url="https://sourceforge.net/project/admin/editpackages.php?group_id=11118" - >https://sourceforge.net/project/admin/editpackages.php?group_id=11118</ulink>, - making sure you are logged in. Find your target platform in the - second column, and click <literal>Add Release</literal>. You will - then need to create a new release for your package, using the format - of <literal>$VERSION ($CODE_STATUS)</literal>, e.g. <emphasis>&p-version; - (beta)</emphasis>. - </para> - <para> - Now just follow the prompts. Be sure to add any appropriate Release - notes. You should see your freshly uploaded packages in - <quote>Step 2. Add Files To This Release</quote>. Check the - appropriate box(es). Remember at each step to hit the - <quote>Refresh/Submit</quote> buttons! You should now see your - file(s) listed in Step 3. Fill out the forms with the appropriate - information for your platform, being sure to hit <quote>Update</quote> - for each file. If anyone is monitoring your platform, check the - <quote>email</quote> box at the very bottom to notify them of - the new package. This should do it! - </para> - <para> - If you have made errors, or need to make changes, you can go through - essentially the same steps, but select <literal>Edit Release</literal>, - instead of <literal>Add Release</literal>. - </para> - </sect2> - - <sect2 id="afterrelease"> - <title>After the Release</title> - <para> - When all (or: most of the) packages have been uploaded and made available, - send an email to the <ulink url="mailto:ijbswa-announce@lists.sourceforge.net">announce - mailing list</ulink>, Subject: "Version X.Y.Z available for download". Be sure to - include the - <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118">download - location</ulink>, the release notes and the Changelog. Also, post an - updated News item on the project page Sourceforge, and update the Home - page and docs linked from the Home page (see below). Other news sites - and release oriented sites, such as Freshmeat, should also be notified. - </para> - </sect2> - - </sect1> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="webserver-update"><title>Update the Webserver</title> - <para> - The webserver should be updated at least with each stable release. When - updating, please follow these steps to make sure that no broken links, - inconsistent contents or permission problems will occur (as it has many - times in the past!): - </para> - <para> - If you have changed anything in the stable-branch documentation source - SGML files, do: - </para> - <para> - <programlisting> - make dok dok-pdf # (or 'make redhat-dok dok-pdf' if 'make dok' doesn't work for you) -</programlisting> - </para> - <para> - That will generate <filename>doc/webserver/user-manual</filename>, - <filename>doc/webserver/developer-manual</filename>, - <filename>doc/webserver/faq</filename>, - <filename>doc/pdf/*.pdf</filename> and - <filename>doc/webserver/index.html</filename> automatically. - </para> - <para> - If you changed the manual page sources, generate - <filename>doc/webserver/man-page/privoxy-man-page.html</filename> - by running <quote><command>make man</command></quote>. (This is - a separate target due to dependencies on some obscure perl scripts - [now in CVS, but not well tested]. See comments in <filename>GNUmakefile</filename>.) - </para> - <para> - If you want to add new files to the webserver, create them locally in - the <filename>doc/webserver/*</filename> directory (or - create new directories under <filename>doc/webserver</filename>). - </para> - <para> - Next, commit any changes from the above steps to CVS. All set? - If these are docs in the stable branch, then do: - </para> - <para> - <programlisting> - make webserver -</programlisting> - </para> - <para> - This will do the upload to <ulink url="http://www.privoxy.org/">the - webserver</ulink> (www.privoxy.org) and ensure all files and directories - there are group writable. - </para> - <para> - Please do <emphasis>NOT</emphasis> use any other means of transferring - files to the webserver to avoid permission problems. Also, please do not - upload docs from development branches or versions. The publicly posted - docs should be in sync with the last official release. - </para> - </sect1> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="contact"><title>Contacting the developers, Bug Reporting and Feature Requests</title> -<!-- Include contacting.sgml --> - &contacting; -<!-- end contacting --> - </sect1> - - -<!-- ~~~~~~~~ New section Header ~~~~~~~~~ --> -<sect1 id="copyright"><title>Privoxy Copyright, License and History</title> - -<!-- Include copyright.sgml --> - ©right; -<!-- end --> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2><title>License</title> -<!-- Include copyright.sgml: --> - &license; -<!-- end copyright --> -</sect2> -<!-- ~ End section ~ --> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2><title>History</title> -<!-- Include history.sgml --> - &history; -<!-- end --> -</sect2> - -</sect1> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="seealso"><title>See also</title> -<!-- Include seealso.sgml --> - &seealso; -<!-- end --> - - </sect1> - - <!-- - - This program is free software; you can redistribute it - and/or modify it under the terms of the GNU General - Public License as published by the Free Software - Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A - PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - The GNU General Public License should be included with - this file. If not, you can view it at - http://www.gnu.org/copyleft/gpl.html - or write to the Free Software Foundation, Inc., 59 - Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - $Log: developer-manual.sgml,v $ - Revision 2.27 2009/02/19 02:20:22 hal9 - Make some links in seealso conditional. Man page is now privoxy only links. - - Revision 2.26 2009/02/12 16:08:26 fabiankeil - Declare the code stable. - - Revision 2.25 2009/02/12 15:37:05 fabiankeil - Update templates. - - Revision 2.24 2009/01/13 16:50:35 fabiankeil - The standard.action file is gone. - - Revision 2.23 2008/09/26 17:02:01 fabiankeil - - Break some more CVS substitutions in examples. - - Remove Junkbusters reference in example header - for new files. - - Revision 2.22 2008/08/30 15:37:35 fabiankeil - Update entities. - - Revision 2.21 2008/08/16 08:51:28 fabiankeil - Update version-related entities. - - Revision 2.20 2008/06/14 13:21:24 fabiankeil - Prepare for the upcoming 3.0.9 beta release. - - Revision 2.19 2008/05/12 11:13:33 fabiankeil - Clarify that Privoxy is licensed under GPL version 2. - - Revision 2.18 2008/02/04 12:14:06 fabiankeil - Change "Edit Packages" URL to use https. - - Revision 2.17 2008/02/03 21:37:41 hal9 - Apply patch from Mark: s/OSX/OS X/ - - Revision 2.16 2008/01/19 17:52:38 hal9 - Re-commit to fix various minor issues for new release. - - Revision 2.15 2008/01/19 15:03:05 hal9 - Doc sources tagged for 3.0.8 release. - - Revision 2.14 2008/01/17 01:49:51 hal9 - Change copyright notice for docs s/2007/2008/. All these will be rebuilt soon - enough. - - Revision 2.13 2007/10/30 17:59:31 fabiankeil - - Bump p-version, p-status and copyright date. - - Mention that the manual is out of date. - - Don't use examples with HardToReadCamelCase after - explaining that we actually don't like that. - - Minor cosmetics. - - Revision 2.12 2006/11/14 01:57:46 hal9 - Dump all docs prior to 3.0.6 release. Various minor changes to faq and user - manual. - - Revision 2.11 2006/09/26 02:36:29 hal9 - Fix broken link per bug tracker. - - Revision 2.10 2006/09/22 01:27:55 hal9 - Final commit of probably various minor changes here and there. Unless - something changes this should be ready for pending release. - - Revision 2.9 2006/09/14 02:30:07 hal9 - Fix ijbswa cvs links. Update notes on release process, and which config files - should be overwritten and which not. - - Revision 2.8 2006/08/22 23:35:01 hal9 - Fix email address, cvs URI, address branching changes and various other - small updates. - - Revision 2.7 2006/07/18 14:48:50 david__schmidt - Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - with what was really the latest development (the v_3_0_branch branch) - - Revision 1.46.2.11 2002/12/11 13:12:15 hal9 - Rewrite cvs write access give-away section. - - Revision 1.46.2.10 2002/09/26 21:53:45 hal9 - Changes to reflect recent change in stable branch commit policy (hopefully - clearer now). - - Revision 1.46.2.9 2002/09/26 01:21:40 hal9 - Porting 3.1.1 changes: more on cvs and branches, more on versions and - releases. - - Revision 1.46.2.8 2002/08/17 00:16:10 hal9 - Add note on updating webserver for User-manual/CGI editor, which is version - dependent (and different from main UM link). - - Revision 1.46.2.7 2002/08/14 17:29:25 hal9 - Add small notes on post-release steps, and uploading docs to webserver. - - Revision 1.46.2.6 2002/08/10 11:40:25 oes - Added disclaimer about probably being out-of-date and two small hints - - Revision 1.46.2.5 2002/08/09 01:15:12 hal9 - Added some notes on pre-release steps (test builds first, update ChangeLog). - - Revision 1.46.2.4 2002/05/29 00:30:59 mal0rd - Fixed a little formatting. Clarified debian section. - - Revision 1.46.2.3 2002/05/28 04:32:45 hal9 - Change hints on bundling index.html to privoxy-index.html - - Revision 1.46.2.2 2002/05/26 17:04:24 hal9 - -Spellcheck, very minor edits, and sync across branches - - Revision 1.48 2002/05/26 12:48:31 roro - Add releasing information about Debian. - - Revision 1.47 2002/05/26 04:55:11 mal0rd - Added debian-dist and debian-upload targets. Also documented usage. - - Revision 1.46 2002/05/22 17:15:00 oes - Updated intro - - Revision 1.45 2002/05/19 23:01:54 hal9 - Add small section on general packaging guidelines (e.g. actions files must - be writable). - - Revision 1.44 2002/05/15 03:55:17 hal9 - Fix ulink -> link, and minor modification to release process section for - clarification. - - Revision 1.43 2002/05/10 01:48:19 hal9 - This is mostly proposed copyright/licensing additions and changes. Docs - are still GPL, but licensing and copyright are more visible. Also, copyright - changed in doc header comments (eliminate references to JB except FAQ). - - Revision 1.42 2002/05/05 20:26:02 hal9 - Sorting out license vs copyright in these docs. - - Revision 1.41 2002/05/04 08:44:44 swa - bumped version - - Revision 1.40 2002/05/04 00:43:43 hal9 - -Remove TOC/first page kludge with proper stylesheet fix. - -Combined the two very brief sections: Intro and Quickstart. - - Revision 1.39 2002/05/02 15:08:25 oes - Added explanation about version numbers and RPM package revisions - - Revision 1.38 2002/04/29 02:20:31 hal9 - Add info on steps for uploading and the release process on SF. - - Revision 1.37 2002/04/26 17:23:29 swa - bookmarks cleaned, changed structure of user manual, screen and programlisting cleanups, and numerous other changes that I forgot - - Revision 1.36 2002/04/26 05:25:23 hal9 - Mass commit to catch a few scattered fixes. - - Revision 1.35 2002/04/17 15:16:15 oes - Added link to docbook crash course - - Revision 1.34 2002/04/15 23:39:32 oes - - Extended & fixed the release section - - Added CVS guideline sections - - Separated webserver section from release section - - Commented out boilerplate inclusion (If you don't know yet what it is, - you shouldn't mess with its code ;-) - - Nits & fixes - - Revision 1.33 2002/04/12 03:49:53 hal9 - Spell checked. Clarification on where docs are kept. - - Revision 1.32 2002/04/11 21:29:58 jongfoster - Documenting Win32 release procedure - - Revision 1.31 2002/04/11 09:32:52 oes - more nits - - Revision 1.30 2002/04/11 09:24:53 oes - nits - - Revision 1.29 2002/04/10 18:45:14 swa - generated - - Revision 1.28 2002/04/08 22:59:26 hal9 - Version update. Spell chkconfig correctly :) - - Revision 1.27 2002/04/08 15:31:18 hal9 - Touch ups to documentation section. - - Revision 1.26 2002/04/07 23:50:08 hal9 - Documentation changes to reflect HTML docs now in CVS, and new generated files - list. - - Revision 1.25 2002/04/06 05:07:28 hal9 - -Add privoxy-man-page.sgml, for man page. - -Add authors.sgml for AUTHORS (and p-authors.sgml) - -Reworked various aspects of various docs. - -Added additional comments to sub-docs. - - Revision 1.24 2002/04/04 21:33:37 hal9 - More on documenting the documents. - - Revision 1.23 2002/04/04 18:46:47 swa - consistent look. reuse of copyright, history et. al. - - Revision 1.22 2002/04/04 17:27:56 swa - more single file to be included at multiple points. make maintaining easier - - Revision 1.21 2002/04/04 06:48:37 hal9 - Structural changes to allow for conditional inclusion/exclusion of content - based on entity toggles, e.g. 'entity % p-not-stable "INCLUDE"'. And - definition of internal entities, e.g. 'entity p-version "2.9.13"' that will - eventually be set by Makefile. - More boilerplate text for use across multiple docs. - - Revision 1.20 2002/04/04 03:28:27 david__schmidt - Add Mac OS X section - - Revision 1.19 2002/04/03 15:09:42 david__schmidt - Add OS/2 build section - - Revision 1.18 2002/04/03 03:51:48 hal9 - Touch ups. - - Revision 1.17 2002/04/03 01:21:17 hal9 - Implementing Andreas's suggestions for Release sections. - - Revision 1.16 2002/03/31 23:04:40 hal9 - Fleshed out the doc section, and added something for an intro so it was not - blank. - - Revision 1.15 2002/03/30 22:29:47 swa - wrong make flavour - - Revision 1.14 2002/03/30 19:04:08 swa - people release differently. no good. - I want to make parts of the docs only. - - Revision 1.13 2002/03/27 01:16:41 hal9 - ditto - - Revision 1.12 2002/03/27 01:02:51 hal9 - Touch up on name change... - - Revision 1.11 2002/03/26 22:29:55 swa - we have a new homepage! - - Revision 1.10 2002/03/24 12:33:01 swa - more additions. - - Revision 1.9 2002/03/24 11:01:05 swa - name change - - Revision 1.8 2002/03/23 15:13:11 swa - renamed every reference to the old name with foobar. - fixed "application foobar application" tag, fixed - "the foobar" with "foobar". left junkbustser in cvs - comments and remarks to history untouched. - - Revision 1.7 2002/03/11 13:13:27 swa - correct feedback channels - - Revision 1.6 2002/02/24 14:25:06 jongfoster - Formatting changes. Now changing the doctype to DocBook XML 4.1 - will work - no other changes are needed. - - Revision 1.5 2001/10/31 18:16:51 swa - documentation added: howto generate docs in text and html - format, howto move stuff to the webserver. - - Revision 1.4 2001/09/23 10:13:48 swa - upload process established. run make webserver and - the documentation is moved to the webserver. documents - are now linked correctly. - - Revision 1.3 2001/09/13 15:27:40 swa - cosmetics - - Revision 1.2 2001/09/13 15:20:17 swa - merged standards into developer manual - - Revision 1.1 2001/09/12 15:36:41 swa - source files for junkbuster documentation - - Revision 1.3 2001/09/10 17:43:59 swa - first proposal of a structure. - - Revision 1.2 2001/06/13 14:28:31 swa - docs should have an author. - - Revision 1.1 2001/06/13 14:20:37 swa - first import of project's documentation for the webserver. - - --> - -</article> diff --git a/external/privoxy/doc/source/faq.sgml b/external/privoxy/doc/source/faq.sgml deleted file mode 100644 index 7684e8e..0000000 --- a/external/privoxy/doc/source/faq.sgml +++ /dev/null @@ -1,3454 +0,0 @@ -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[ -<!entity % dummy "IGNORE"> -<!entity supported SYSTEM "supported.sgml"> -<!entity newfeatures SYSTEM "newfeatures.sgml"> -<!entity p-intro SYSTEM "privoxy.sgml"> -<!entity seealso SYSTEM "seealso.sgml"> -<!entity contacting SYSTEM "contacting.sgml"> -<!entity history SYSTEM "history.sgml"> -<!entity copyright SYSTEM "copyright.sgml"> -<!entity license SYSTEM "license.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-not-stable "IGNORE"> -<!entity % p-stable "INCLUDE"> -<!entity % p-text "IGNORE"> <!-- define we are not a text only doc --> -<!entity % p-doc "INCLUDE"> <!-- and we are a formal doc --> -<!entity % p-supp-userman "INCLUDE"> <!-- Include all from supported.sgml --> -<!entity my-copy "©"> <!-- kludge for docbook2man --> -<!entity % p-newstuff "INCLUDE"> <!-- exclude stuff from devel versions --> -<!entity % seealso-extra "INCLUDE"> <!-- extra stuff from seealso.sgml --> -<!entity my-app "<application>Privoxy</application>"> -]> -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/faq.sgml,v $ - - Purpose : FAQ - This file belongs into - ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - - $Id: faq.sgml,v 2.58 2009/03/21 12:27:44 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - Based partially on the Internet Junkbuster FAQ originally written by and - Copyright (C) 1997 Anonymous Coders and Junkbusters Corporation. - http://www.junkbusters.com/ - - <Qandaset defaultlabel='qanda'> - <QandAEntry> - <question> - <para> - How are you? - </para> - </question> - <answer> - <para> - Fine. - </para> - </answer> - </QandAEntry> - </QandASet> - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - this file! - - Please we keep the info in this file as version independent as possible - so we only have to maintain one FAQ. Where significant changes are - made to Privoxy configuration, please note the change in such a way that - it makes sense to both users of older and newer versions. - ======================================================================== - - ---> - - -<article id="index" class="faq"> -<artheader> -<title>Privoxy Frequently Asked Questions</title> - -<pubdate> - <subscript> -<!-- Completely the wrong markup, but very little is allowed --> -<!-- in this part of an article. FIXME --> - <link linkend="copyright">Copyright</link> &my-copy; 2001-2009 by - <ulink url="http://www.privoxy.org/">Privoxy Developers</ulink> - </subscript> -</pubdate> - -<pubdate>$Id: faq.sgml,v 2.58 2009/03/21 12:27:44 fabiankeil Exp $</pubdate> - -<!-- - -Note: this should generate a separate page, and a live link to it. -But it doesn't for some mysterious reason. Please leave commented -unless it can be fixed proper. For the time being, the copyright -statement will be in copyright.smgl. - -Hal. - -<legalnotice id="legalnotice"> - <para> - text goes here ........ - </para> -</legalnotice> - ---> - -<!-- -<authorgroup> - <author> - <affiliation> - <orgname>By: Privoxy Developers</orgname> - </affiliation> - </author> -</authorgroup> ---> -<abstract> -<![%dummy;[ -<para> - <comment> - This is here to keep vim syntax file from breaking :/ - If I knew enough to fix it, I would. - PLEASE DO NOT REMOVE! HB: hal@foobox.net - </comment> -</para> -]]> - <para> - This FAQ gives quick answers to frequently asked questions about - <ulink url="http://www.privoxy.org/">Privoxy</ulink>. - It is not a substitute for the - <ulink url="../user-manual/index.html"><citetitle>Privoxy User Manual</citetitle></ulink>. -<!-- - This works, at least in some situtations: - Test: <ulink url="privoxy-user-manual.pdf"><citetitle>User Manual</citetitle></ulink>. ---> - </para> - -<!-- Include privoxy.sgml boilerplate: --> - <para>What is Privoxy?</para> &p-intro; -<!-- end boilerplate --> - - <para> - Please note that this document is a work in progress. This copy represents - the state at the release of version &p-version;. - You can find the latest version of the document at <ulink - url="http://www.privoxy.org/faq/%22%3Ehttp://www.privoxy.org/faq/</ulink>. - Please see the <link linkend="contact">Contact section</link> if you want to - contact the developers. - </para> - -<!-- <para> --> -<!-- Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. --> -<!-- </para> --> -</abstract> -</artheader> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect1 id="general"><title>General Information</title> -<sect2 renderas="sect3" id="who-uses"><title>Who should give &my-app; a try?</title> - <para> - Anyone who is interested in security, privacy, or in - finer-grained control over their web and Internet experience. - </para> -</sect2> - -<sect2 renderas="sect3" id="bestchoice"><title>Is Privoxy the best choice for -me?</title> - <para> - &my-app; is certainly a good choice, especially for those who want more - control and security. Those with the willingness to read the documentation - and the ability to fine-tune their installation will benefit the most. - </para> - <para> - One of <application>Privoxy's</application> - strengths is that it is highly configurable giving you the ability to - completely personalize your installation. Being familiar with, or at least - having an interest in learning about <ulink - url="http://en.wikipedia.org/wiki/Http%22%3EHTTP</ulink> and other networking - protocols, <ulink url="http://en.wikipedia.org/wiki/Html">HTML</ulink>, and - <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular - Expressions</quote></ulink> - will be a big plus and will help you get the most out of &my-app;. - A new installation just includes a very basic configuration. The user - should take this as a starting point only, and enhance it as he or she - sees fit. In fact, the user is encouraged, and expected to, fine-tune the - configuration. - </para> - <para> - Much of <application>Privoxy's</application> configuration can be done - with a <ulink url="http://en.wikipedia.org/wiki/Web_browser">Web browser</ulink>. - But there are areas where configuration is done using a - <ulink url="http://en.wikipedia.org/wiki/Text_editors">text editor</ulink> - to edit configuration files. Also note that the web-based action editor - doesn't use authentication and should only be enabled in environments - where all clients with access to &my-app; listening port can be trusted. - </para> -</sect2> - -<sect2 renderas="sect3" id="proxymoron"><title>What is a <quote>proxy</quote>? How does -Privoxy work? </title> - <para> - A <ulink url="http://en.wikipedia.org/wiki/Proxy_server">web proxy</ulink> - is a service, based on a software such as &my-app;, that clients - (i.e. browsers) can use instead of connecting to web servers directly. - The clients then ask the proxy to request objects (web pages, images, movies etc) - on their behalf and to forward the data to the clients. - It is a <quote>go-between</quote>. For details, see - <ulink url="http://en.wikipedia.org/wiki/Proxy_server">Wikipedia's proxy definition</ulink>. - </para> - <para> - There are many reasons to use web proxies, such as security (firewalling), - efficiency (caching) and others, and there are any number of proxies - to accommodate those needs. - </para> - <para> - &my-app; is a proxy that is primarily focused on - privacy enhancement, ad and junk elimination and freeing the user from - restrictions placed on his activities. Sitting between your browser(s) and the Internet, - it is in a perfect position to filter outbound personal information that your - browser is leaking, as well as inbound junk. It uses a variety of techniques to do - this, all of which are under your complete control via the various configuration - files and options. Being a proxy also makes it easier to share - configurations among multiple browsers and/or users. - </para> -</sect2> - -<sect2 renderas="sect3" id="otherstuff"> -<title>Does Privoxy do anything more than ad blocking?</title> - <para> - Yes, ad blocking is but one possible use. There are many, many ways &my-app; - can be used to sanitize and customize web browsing. -</para> -</sect2> - -<sect2 renderas="sect3" id="newjb"><title>What is this new version of -<quote><citetitle>Junkbuster</citetitle></quote>?</title> - -<!-- Include history.sgml --> - &history; -<!-- end --> - -</sect2> - - -<sect2 renderas="sect3"> -<title id="whyprivoxy">Why <quote>Privoxy</quote>? Why change the name from -Junkbuster at all?</title> -<para> - Though outdated, <ulink url="http://junkbusters.com/">Junkbusters Corporation</ulink> - continues to offer their original version of the <application>Internet - Junkbuster</application>, so publishing our - <application> Junkbuster</application>-derived software under the same name - led to confusion. -</para> -<para> - There are also potential legal complications from our use of the - <application>Junkbuster</application> name, which is a registered trademark of - <ulink url="http://junkbusters.com/">Junkbusters Corporation</ulink>. - There are, however, no objections from Junkbusters Corporation to the - <application>Privoxy</application> project itself, and they, in fact, still - share our ideals and goals. -</para> -<para> - The developers also believed that there are so many improvements over the original - code, that it was time to make a clean break from the past and make - a name in their own right. -</para> -<para> - <application>Privoxy</application> is the - <quote><emphasis>Privacy Enhancing Proxy</emphasis></quote>. Also, its content - modification and junk suppression gives <emphasis>you</emphasis>, the user, more - control, more freedom, and allows you to browse your personal and - <quote><emphasis>private</emphasis> edition</quote> of the web. -</para> -</sect2> - -<sect2 renderas="sect3" id="differs"><title>How does Privoxy differ -from the old Junkbuster?</title> -<para> - <application>Privoxy</application> picks up where - <application>Junkbuster</application> left off. - The new <application>Privoxy</application> still blocks ads and banners, - still manages <ulink - url="http://en.wikipedia.org/wiki/Browser_cookie%22%3Ecookies</ulink>, and still - helps protect your privacy. But, most of these features have been enhanced, - and many new ones have been added, all in the same vein. - </para> -<para> - <application>Privoxy</application>'s new features include: -</para> - -<!-- Include newfeatures.sgml: --> - &newfeatures; -<!-- end include --> - -</sect2> - -<sect2 renderas="sect3" id="whatsanad"> -<title id="knows">How does Privoxy know what is -an ad, and what is not?</title> -<para> - <application>Privoxy</application>'s approach to blocking ads is twofold: -</para> -<para> - First, there are certain patterns in the <emphasis>locations</emphasis> (URLs) - of banner images. This applies to both the path (you wouldn't guess how many - web sites serve their banners from a directory called <quote>banners</quote>!) - and the host (blocking the big banner hosting services like doublecklick.net - already helps a lot). <application>Privoxy</application> takes advantage of this - fact by using <ulink url="../user-manual/actions-file.html#AF-PATTERNS">URL - patterns</ulink> to sort out and block the requests for things that sound - like they would be ads or banners. -</para> -<para> - Second, banners tend to come in certain <emphasis>sizes</emphasis>. But you - can't tell the size of an image by its URL without downloading it, and if you - do, it's too late to save bandwidth. Therefore, <application>Privoxy</application> - also inspects the HTML sources of web pages while they are loaded, and replaces - references to images with standard banner sizes by dummy references, so that - your browser doesn't request them anymore in the first place. -</para> -<para> - Both of this involves a certain amount of guesswork and is, of course, freely - and readily configurable. -</para> -</sect2> - -<sect2 renderas="sect3"> -<title id="mistakes">Can Privoxy make mistakes? -This does not sound very scientific.</title> -<para> - Actually, it's a black art ;-) And yes, it is always possible to have a broad - rule accidentally block or change something by mistake. You will almost surely - run into such situations at some point. It is tricky writing rules to - cover every conceivable possibility, and not occasionally get false positives. -</para> - -<para> - But this should not be a big concern since the - <application>Privoxy</application> configuration is very flexible, and - includes tools to help identify these types of situations so they can be - addressed as needed, allowing you to customize your installation. - (<link linkend="badsite">See the Troubleshooting section below</link>.) -</para> - -</sect2> - -<sect2 renderas="sect3"> -<title id="configornot">Will I have to configure Privoxy - before I can use it?</title> -<para> - That depends on your expectations. - The default installation should give you a good starting - point, and block <emphasis>most</emphasis> ads and unwanted content, - but many of the more advanced features are off by default, and require - you to activate them. -</para> -<para> - You do have to set up your browser to use - <application>Privoxy</application> (see the <link - linkend="firststep">Installation section below</link>). -</para> -<para> - And you will certainly run into situations where there are false positives, - or ads not being blocked that you may not want to see. In these cases, you - would certainly benefit by customizing <application>Privoxy's</application> - configuration to more closely match your individual situation. And we - encourage you to do this. This is where the real power of - <application>Privoxy</application> lies! -</para> - -</sect2> - -<sect2 renderas="sect3" id="lan"> -<title>Can Privoxy run as a server on a network?</title> - <para> - Yes, &my-app; runs as a server already, and can easily be configured to - <quote>serve</quote> more than one client. See <link linkend="lanconfig"> - How can I set up Privoxy to act as a proxy for my LAN</link> below. -</para> -</sect2> - -<sect2 renderas="sect3" id="browsers2"><title>My browser does the same things as -Privoxy. Why should I use Privoxy at all?</title> - <para> - Modern browsers do indeed have <emphasis>some</emphasis> of the same - functionality as <application>Privoxy</application>. Maybe this is - adequate for you. But <application>Privoxy</application> is very - versatile and powerful, and can probably do a number of things - your browser just can't. - </para> - <para> - In addition, a proxy is good choice if you use multiple browsers, or - have a LAN with multiple computers since &my-app; can run as a server - application. This way all the configuration is in one place, and you don't - have to maintain a similar configuration for possibly many browsers or - users. - </para> - <para> - Note, however, that it's recommended to leverage both your browser's - and <application>Privoxy's</application> privacy enhancing features - at the same time. While your browser probably lacks some features - &my-app; offers, it should also be able to do some things more - reliable, for example restricting and suppressing JavaScript. - </para> -</sect2> - -<sect2 renderas="sect3" id="whytrust"><title>Why should I trust Privoxy?</title> - <para> - The most important reason is because you have access to - <emphasis>everything</emphasis>, and you can control everything. You can - check every line of every configuration file yourself. You can check every - last bit of source code should you desire. And even if you can't read code, - there should be some comfort in knowing that <!-- thousands of -->other people can, - and do read it. You can build the software from scratch, if you want, - so that you know the executable is clean, and that it is - <emphasis>yours</emphasis>. In fact, we encourage this level of scrutiny. It - is one reason we use &my-app; ourselves. - </para> -</sect2> - -<sect2 renderas="sect3" id="license"><title>Is there is a license or fee? What about a -warranty? Registration?</title> - <para> - <application>Privoxy</application> is free software and licensed under the <ulink - url="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html%22%3EGNU General Public License (GPL) version 2</ulink>. - It is free to use, copy, modify or distribute as you wish under the terms of this - license. Please see the <link linkend="copyright">Copyright</link> section for more - information on the license and copyright. Or the <filename>LICENSE</filename> file - that should be included. - </para> - <para> - There is <emphasis>no warranty</emphasis> of any kind, expressed, implied or otherwise. - That is something that would cost real money ;-) There is no registration either. - </para> - -</sect2> - -<sect2 renderas="sect3" id="spyware"> -<title>Can Privoxy remove spyware? Adware? Viruses?</title> -<para> - No, at least not reliably enough to trust it. &my-app; is not designed to be - a malware removal tool and the default configuration doesn't even try to - filter out any malware. -</para> -<para> - &my-app; could help prevent contact from (known) sites that use such - tactics with appropriate configuration rules, and thus could conceivably - prevent contamination from such sites. However, keeping such a configuration - up to date would require a lot of time and effort that would be better spend - on keeping your software itself up to date so it doesn't have known - vulnerabilities. -</para> -</sect2> - - -<sect2 renderas="sect3" id="otherads"> -<title>Can I use Privoxy with other ad-blocking software?</title> -<para> - &my-app; should work fine with other proxies and other software in general. -</para> -<para> - But it is probably not necessary to use &my-app; in conjunction with other - ad-blocking products, and this could conceivably cause undesirable results. - It might be better to choose one software or the other and work a little to - tweak its configuration to your liking. -</para> -<para> - Note that this is an advice specific to ad blocking. -</para> -</sect2> - -<sect2 renderas="sect3" id="jointeam"><title>I would like to help you, what can I do?</title> - -<sect3 renderas="sect4" id="jointeam-work"><title>Would you like to participate?</title> -<para> - Well, we <emphasis>always</emphasis> need help. There is something for - everybody who wants to help us. We welcome new developers, packagers, - testers, documentation writers or really anyone with a desire to help in - any way. You <emphasis>DO NOT</emphasis> need to be a - <quote>programmer</quote>. There are many other tasks available. In fact, - the programmers often can't spend as much time programming because of some - of the other, more mundane things that need to be done, like checking the - Tracker feedback sections. - </para> - <para> - So first thing, <ulink - url="https://sourceforge.net/account/register.php%22%3Eget an account on SourceForge.net</ulink> - and mail your id to the <ulink url="mailto:ijbswa-developers@lists.sourceforge.net">developers - mailing list</ulink>. Then, please read the <ulink - url="../developer-manual/index.html">Developer's Manual</ulink>, at least - the pertinent sections. -</para> - <para> - You can also start helping out without SourceForge.net account, - simply by showing up on the mailing list, helping out other users, - providing general feedback or reporting problems you noticed. - </para> -</sect3> - -<sect3 renderas="sect4" id="donate"><title>Would you like to donate?</title> -<para> - <application>Privoxy</application> is developed by unpaid volunteers - and thus our current running costs are pretty low. Nevertheless, we - have plans that will cost money in the future. We would like to get - this money through donations made by our users. -</para> - -<para> - <application>Privoxy</application> has therefore become an associated - project of <ulink url="http://www.spi-inc.org/about-spi/about-spi">Software - in the Public Interest (SPI)</ulink>, which allows us to receive tax-deductible - donations in most western countries. -</para> - -<para> - We intend to use the donations to pay for our domain after transfering - it to SPI. Our goal is to make sure there's no single point of failure - and the bill gets paid and the site keeps running even if a some of - the currently active developers were to suddenly disappear for a while. -</para> - -<para> - We would also like to spend some money on more reliable hosting, - on hardware to help make sure <application>Privoxy</application> - keeps running on platforms the developers currently can't test on, - and on technical books to educate our developers about said platforms - or to improve their knowledge in general. -</para> - -<para> - If you enjoy our software and feel like helping out with a donation, - please have a look at - <ulink url="http://www.spi-inc.org/donations">SPI's donation page</ulink> - to see what the options are. -<para> -</sect3> - -</sect2> - -</sect1> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect1 id="installation"><title>Installation</title> - -<sect2 renderas="sect3" id="whichbrowsers"> -<title>Which browsers are supported by Privoxy?</title> -<para> - Any browser that can be configured to use a proxy, which - should be virtually all browsers, including - <application>Firefox</application>, <application>Internet - Explorer</application>, <application>Opera</application>, and - <application>Safari</application> among others. - Direct browser support is not an absolute requirement since - <application>Privoxy</application> runs as a separate application and talks - to the browser in the standardized HTTP protocol, just like a web server - does. -</para> -</sect2> - -<sect2 renderas="sect3" id="whichos"> -<title>Which operating systems are supported?</title> -<!-- -Include supported.sgml here: ---> -&supported; -</sect2> - -<sect2 renderas="sect3" id="email-client"> -<title>Can I use Privoxy with my email client?</title> -<para> - As long as there is some way to set a HTTP proxy for the client, then yes, - any application can be used, whether it is strictly speaking a - <quote>browser</quote> or not. Though this may not be the best approach for - dealing with some of the common abuses of HTML in email. See <link - linkend="outlook">How can I configure <application>Privoxy</application> - with <application>Outlook</application>?</link> below for more on - this. -</para> -<para> - Be aware that HTML email presents a number of unique security and privacy - related issues, that can require advanced skills to overcome. The developers - recommend using email clients that can be configured to convert HTML to plain - text for these reasons. -</para> -</sect2> - -<!-- Nobody is going to still be doing this! -<sect2 renderas="sect3" id="newinstall"><title>Can I install - Privoxy over Junkbuster?</title> - <para> - We recommend you un-install <application>Junkbuster</application> - first to minimize conflicts and confusion. You may want to - save your old configuration files for future reference. The configuration - files and syntax have substantially changed, so you will need to manually - port your old patterns. See the <ulink url="../user-manual/upgradersnote.html">note - to upgraders</ulink> and <ulink url="../user-manual/installation.html">installation - chapter</ulink> in the <ulink url="../user-manual/index.html">User Manual</ulink> - for details. - </para> - <para> - Note: Some installers may automatically un-install - <application>Junkbuster</application>, if present! - </para> - -</sect2> ---> - -<sect2 renderas="sect3" id="firststep"> -<title>I just installed Privoxy. Is there anything -special I have to do now?</title> - -<para> - All browsers should be told to use <application>Privoxy</application> - as a proxy by specifying the correct proxy address and port number - in the appropriate configuration area for the browser. It's possible - to combine &my-app; with a packet filter to intercept HTTP requests - even if the client isn't explicitly configured to use &my-app;, - but where possible, configuring the client is recommended. See - <ulink url="../user-manual/startup.html">the User Manual for more - details</ulink>. You should also flush your browser's memory and disk - cache to get rid of any cached junk items, and remove any stored - <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookies</ulink>. - -</para> - -</sect2> - -<sect2 renderas="sect3" id="localhost"><title>What is the proxy address of Privoxy?</title> - <para> - If you set up the <application>Privoxy</application> to run on - the computer you browse from (rather than your ISP's server or some - networked computer on a LAN), the proxy will be on <literal>127.0.0.1</literal> - (sometimes referred to as <quote>localhost</quote>, - which is the special name used by every computer on the Internet to refer - to itself) and the port will be 8118 (unless you used the <ulink - url="../user-manual/config.html#LISTEN-ADDRESS">listen-address</ulink> - config option to tell <application>Privoxy</application> to run on - a different port). - </para> - <para> - When configuring your browser's proxy settings you typically enter - the word <quote>localhost</quote> or the IP address <quote>127.0.0.1</quote> - in the boxes next to <quote>HTTP</quote> and <quote>Secure</quote> (HTTPS) and - then the number <quote>8118</quote> for <quote>port</quote>. - This tells your browser to send all web requests to <application>Privoxy</application> - instead of directly to the Internet. - </para> - <para> - <application>Privoxy</application> can also be used to proxy for - a Local Area Network. In this case, your would enter either the IP - address of the LAN host where <application>Privoxy</application> - is running, or the equivalent hostname, e.g. <literal>192.168.1.1</literal>. - Port assignment would be same as above. Note that - <application>Privoxy</application> doesn't listen on any LAN interfaces by - default. - </para> - <para> - <application>Privoxy</application> does not currently handle - any other protocols such as FTP, SMTP, IM, IRC, ICQ, etc. - </para> -</sect2> - -<sect2 renderas="sect3" id="nothing"> -<title>I just installed Privoxy, and nothing is happening. -All the ads are there. What's wrong?</title> - -<para> - Did you configure your browser to use <application>Privoxy</application> - as a proxy? It does not sound like it. See above. You might also try flushing - the browser's caches to force a full re-reading of pages. You can verify - that <application>Privoxy</application> is running, and your browser - is correctly configured by entering the special URL: - <ulink url="http://p.p/">http://p.p/</ulink>. - <!-- Use http://p.p/ instead of http://config.privoxy.org/ here because - of potential redirect caching problem (see next Q). --> - This should take you to a page titled <quote>This is Privoxy..</quote> with - access to <application>Privoxy's</application> internal configuration. - If you see this, then you are good to go. If you receive a page saying - <quote>Privoxy is not running</quote>, then the browser is not set up to use - your <application>Privoxy</application> installation. - If you receive anything else (probably nothing at all), it could either - be that the browser is not set up correctly, or that - <application>Privoxy</application> is not running at all. Check the <ulink - url="../user-manual/config.html#LOGFILE">log file</ulink>. For instructions - on starting <application>Privoxy</application> and browser configuration, - see the <ulink url="http://www.privoxy.org/user-manual/startup.html">chapter - on starting <application>Privoxy</application></ulink> in the - <ulink url="http://www.privoxy.org/user-manual/">User Manual</ulink>. -</para> - -</sect2> - -<sect2 renderas="sect3" id="notused"> -<title>I get a <quote>Privoxy is not being used</quote> dummy page although -Privoxy is running and being used.</title> - -<para> - First, make sure that Privoxy is <emphasis>really</emphasis> running and - being used by visiting <ulink url="http://p.p/">http://p.p/</ulink>. You - should see the <application>Privoxy</application> main page. If not, see - the <ulink url="http://www.privoxy.org/user-manual/startup.html">chapter - on starting <application>Privoxy</application></ulink> in the - <ulink url="http://www.privoxy.org/user-manual/">User Manual</ulink>. -</para> - -<para> - Now if <ulink url="http://p.p/">http://p.p/</ulink> works for you, but - other parts of <application>Privoxy</application>'s web interface show - the dummy page, your browser has cached a redirection it encountered before - <application>Privoxy</application> was being used. You need to clear your - browser's cache. Note that shift-reloading the dummy page won't help, since - that'll only refresh the dummy page, not the redirection that lead you there. -</para> - -<para> - The procedure for clearing the cache varies from browser to browser. For - example, <application>Mozilla/Netscape</application> users would click - <guibutton>Edit</guibutton> --> <guibutton>Preferences</guibutton> --> - <guibutton>Advanced</guibutton> --> <guibutton>Cache</guibutton> and - then click both <quote><guibutton>Clear Memory Cache</guibutton></quote> - and <quote><guibutton>Clear Disk Cache</guibutton></quote>. - In some <application>Firefox</application> versions it's - <guibutton>Tools</guibutton> --> <guibutton>Options</guibutton> --> - <guibutton>Privacy</guibutton> --> <guibutton>Cache</guibutton> and - then click <quote><guibutton>Clear Cache Now</guibutton></quote>. - <!-- In my Firefox versions it's the Netscape way. fk 2007-11-19--> -</para> -</sect2> - -</sect1> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect1 id="configuration"><title>Configuration</title> -<sect2 renderas="sect3"> -<title id="actionsfile">What exactly is an <quote>actions</quote> file?</title> - -<para> - &my-app; utilizes the concept of <quote> - <ulink url="../user-manual/actions-file.html#ACTIONS">actions</ulink></quote> - that are used to manipulate and control web page data. - <ulink url="../user-manual/actions-file.html">Actions files</ulink> - are where these <ulink url="../user-manual/actions-file.html#ACTIONS">actions</ulink> - that <application>Privoxy</application> could take while processing a certain - request, are configured. Typically, you would define a set of default actions - that apply globally to all URLs, then add exceptions to these defaults where needed. - There is a wide array of actions available that give the user a high degree - of control and flexibility on how to process each and every web page. -</para> - -<para> - Actions can be defined on a <ulink - url="../user-manual/actions-file.html#AF-PATTERNS">URL pattern</ulink> basis, i.e. - for single URLs, whole web sites, groups or parts thereof etc. Actions can also be - grouped together and then applied to requests matching one or more patterns. - There are many possible actions that might apply to any given site. As an example, - if you are blocking <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookies</ulink> - as one of your default actions, but need to accept cookies from a given site, - you would need to define an exception for this site in one of your actions - files, preferably in <filename>user.action</filename>. -</para> - -</sect2> - -<sect2 renderas="sect3" id="actionss"> -<title>The <quote>actions</quote> concept confuses me. Please list -some of these <quote>actions</quote>.</title> -<para> - For a comprehensive discussion of the actions concept, please refer - to the <ulink url="../user-manual/actions-file.html">actions file - chapter</ulink> in the <ulink url="../user-manual/index.html">User - Manual</ulink>. It includes a <ulink - url="../user-manual/actions-file.html#ACTIONS">list of all actions</ulink> - and an <ulink url="../user-manual/actions-file.html#ACT-EXAMPLES">actions - file tutorial</ulink> to get you started. -</para> -</sect2> - - -<sect2 renderas="sect3"> -<title id="actconfig">How are actions files configured? What is the easiest -way to do this?</title> - -<para> - Actions files are just text files in a special syntax and can be edited - with a text editor. But probably the easiest way is to access - <application>Privoxy</application>'s user interface with your web browser - at <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink> - (Shortcut: <ulink url="http://p.p/">http://p.p/</ulink>) and then select - <quote><ulink url="http://config.privoxy.org/show-status">View & - change the current configuration</ulink></quote> from the menu. Note - that this feature must be explicitly enabled in the main config file - (see <ulink - url="../user-manual/config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions</ulink>). -</para> -</sect2> - - -<sect2 renderas="sect3"> -<title>There are several different <quote>actions</quote> files. What are -the differences?</title> -<para> - Three actions files - are being included by the developers, to be used for - different purposes: These are - <filename>default.action</filename>, the <quote>main</quote> actions file - which is actively maintained by the <application>Privoxy</application> - developers and typically sets the default policies, <filename>user.action</filename>, - where users are encouraged to make their private customizations. - Please see <ulink url="../user-manual/actions-file.html">the actions chapter</ulink> - in the <ulink url="../user-manual/index.html">User Manual</ulink> for a more - detailed explanation. -</para> - -<para> - Earlier versions included three different versions of the - <filename>default.action</filename> file. The new scheme allows for - greater flexibility of local configuration, and for browser based - selection of pre-defined <quote>aggressiveness</quote> levels. -</para> - -</sect2> - -<sect2 renderas="sect3" id="getupdates"><title>Where can I get updated Actions Files?</title> - <para> - Based on your feedback and the continuing development, updates of - <filename>default.action</filename> will be - made available from time to time on the <ulink - url="http://sourceforge.net/project/showfiles.php?group_id=11118%22%3Efiles section</ulink> of - our <ulink url="http://sf.net/projects/ijbswa/">project page</ulink>. - </para> - - <para> - If you wish to receive an email notification whenever we release updates of - <application>Privoxy</application> or the actions file, <ulink - url="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce/%22%3Esubscribe - to our announce mailing list</ulink>, ijbswa-announce@lists.sourceforge.net. - </para> - -</sect2> - -<sect2 renderas="sect3" id="newconfig"><title>Can I use my old config files?</title> - <para> - The syntax and purpose of configuration files has remained roughly the - same throughout the 3.x series, but backwards compatibility is not guaranteed. - Also each release contains updated, <quote>improved</quote> versions and it is - therefore strongly recommended to install the newer configuration files - and merge back your modifications. - </para> -</sect2> - -<sect2 renderas="sect3" id="difficult"> -<title>Why is the configuration so complicated?</title> - <para> - <quote>Complicated</quote> is in the eye of the beholder. Those that are - familiar with some of the underlying concepts, such as regular expression - syntax, take to it like a fish takes to water. Also, software that tries - hard to be <quote>user friendly</quote>, often lacks sophistication and - flexibility. There is always that trade-off there between power vs. - easy-of-use. Furthermore, anyone is welcome to contribute ideas and - implementations to enhance &my-app;. - </para> -</sect2> - -<sect2 renderas="sect3" id="yahoo"><title>How can I make my Yahoo/Hotmail/Gmail account work?</title> - <para> - The default configuration shouldn't impact the usability of any of these services. - It may, however, make all <ulink - url="http://en.wikipedia.org/wiki/Browser_cookie%22%3Ecookies</ulink> - temporary, so that your browser will forget your - login credentials in between browser sessions. If you would like not to have to log - in manually each time you access those websites, simply turn off all cookie handling - for them in the <filename>user.action</filename> file. An example for yahoo might - look like: - </para> - <para> - <screen># Allow all cookies for Yahoo login: -# -{ -<ulink url="../user-manual/actions-file.html#CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</ulink> -<ulink url="../user-manual/actions-file.html#CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</ulink> -<ulink url="../user-manual/actions-file.html#SESSION-COOKIES-ONLY">session-cookies-only</ulink> } -.login.yahoo.com</screen> - </para> - <para> - These kinds of sites are often quite complex and heavy with - <ulink url="http://en.wikipedia.org/wiki/Javascript">Javascript</ulink> and - thus <quote>fragile</quote>. So if <emphasis>still</emphasis> a problem, - we have an <ulink - url="../user-manual/actions-file.html#ALIASES">alias</ulink> just for such - sticky situations: - </para> - <para> - <screen># Gmail is a _fragile_ site: -# -{ <literal>fragile</literal> } - # Gmail is ... - mail.google.com</screen> - </para> - <para> - Be sure to flush your browser's caches whenever making these kinds of - changes, just to make sure the changes <quote>take</quote>. - </para> - <para> - Make sure the domain, host and path are appropriate as well. Your browser can - tell you where you are specifically and you should use that information for - your configuration settings. Note that above it is not referenced as - <literal>gmail.com</literal>, which is a valid domain name. - </para> - -</sect2> - -<sect2 renderas="sect3" id="configfiles"> <title>What's the difference between the -<quote>Cautious</quote>, <quote>Medium</quote> and <quote>Advanced</quote> defaults?</title> - <para> - Configuring <application>Privoxy</application> is not entirely trivial. To - help you get started, we provide you with three different default action - <quote>profiles</quote> in the web based actions file editor at <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink>. - See the <ulink url="../user-manual/actions-file.html"><citetitle>User - Manual</citetitle></ulink> for a list of actions, and how the default - profiles are set. - </para> - -<para> - Where the defaults are likely to break some sites, exceptions for - known popular <quote>problem</quote> sites are included, but in - general, the more aggressive your default settings are, the more exceptions - you will have to make later. New users are best to start off in - <quote>Cautious</quote> setting. This is safest and will have the fewest - problems. See the <ulink - url="../user-manual/index.html"><citetitle>User Manual</citetitle></ulink> - for a more detailed discussion. -</para> - -<para> - It should be noted that the <quote>Advanced</quote> profile (formerly known - as the <quote>Adventuresome</quote> profile) is more - aggressive, and will make use of some of - <application>Privoxy's</application> advanced features. Use at your own risk! -</para> - -</sect2> - -<sect2 renderas="sect3" id="browseconfig"> <title>Why can I change the configuration -with a browser? Does that not raise security issues?</title> - <para> - It may seem strange that regular users can edit the config files with their - browsers, although the whole <filename>/etc/privoxy</filename> hierarchy - belongs to the user <quote>privoxy</quote>, with only 644 permissions. - </para> - <para> - When you use the browser-based editor, <application>Privoxy</application> - itself is writing to the config files. Because - <application>Privoxy</application> is running as the user <quote>privoxy</quote>, - it can update its own config files. - </para> - <para> - If you run <application>Privoxy</application> for multiple untrusted users (e.g. in - a LAN) or aren't entirely in control of your own browser, you will probably want - to make sure that the the web-based editor and remote toggle features are - <quote>off</quote> by setting <quote><literal><ulink - url="../user-manual/config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions</ulink> - 0</literal></quote> and <quote><literal><ulink - url="../user-manual/config.html#ENABLE-REMOTE-TOGGLE">enable-remote-toggle</ulink> - 0</literal></quote> in the <ulink url="../user-manual/config.html">main configuration file</ulink>. - </para> - <para> - As of &my-app; 3.0.7 these options are disabled by default. - </para> -</sect2> - - -<sect2 renderas="sect3"> -<title id="filterfile">What is the <filename>default.filter</filename> file? What is a <quote>filter</quote>?</title> -<para> - The <ulink url="../user-manual/filter-file.html"><filename>default.filter</filename></ulink> - file is where <emphasis>filters</emphasis> as supplied by the developers are defined. - Filters are a special subset of actions that can be used to modify or - remove web page content or headers on the fly. Content filters can - be applied to <emphasis>anything</emphasis> in the page source, - header filters can be applied to either server or client headers. - Regular expressions are used to accomplish this. -</para> -<para> - There are a number of pre-defined filters to deal with common annoyances. The - filters are only defined here, to invoke them, you need to use the - <ulink - url="../user-manual/actions-file.html#FILTER"><literal>filter</literal> - action</ulink> in one of the actions files. Content filtering is automatically - disabled for inappropriate MIME types, but if you now better than Privoxy - what should or should not be filtered you can filter any content you like. -</para> -<para> - Filters should - <emphasis>not</emphasis> be confused with <ulink - url="../user-manual/actions-file.html#BLOCK"><literal>blocks</literal></ulink>, which - is a completely different action, and is more typically used to block ads and - unwanted sites. -</para> - -<para> - If you are familiar with regular expressions, and HTML, you can look at - the provided <filename>default.filter</filename> with a text editor and define - your own filters. This is potentially a very powerful feature, but - requires some expertise in both regular expressions and HTML/HTTP. - <![%p-newstuff;[ You should - place any modifications to the default filters, or any new ones you create - in a separate file, such as <filename>user.filter</filename>, so they won't - be overwritten during upgrades. - The ability to define multiple filter files - in <filename>config</filename> is a new feature as of v. 3.0.5.]]> -</para> - -<para> - There is no GUI editor option for this part of the configuration, - but you can disable/enable the various pre-defined filters of the included - <filename>default.filter</filename> file with the <ulink - url="http://config.privoxy.org/show-status%22%3Eweb-based actions file editor</ulink>. - Note that the custom actions editor must be explicitly enabled in - the main config file (see <ulink - url="../user-manual/config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions</ulink>). -</para> - -<para> - If you intend to develop your own filters, you might want to have a look at - <ulink - url="http://www.fabiankeil.de/sourcecode/pft/%22%3EPrivoxy-Filter-Test</ulink>. -</para> - -</sect2> - -<sect2 renderas="sect3" id="lanconfig"> -<title>How can I set up Privoxy to act as a proxy for my - LAN?</title> -<para> - By default, <application>Privoxy</application> only responds to requests - from <literal>127.0.0.1</literal> (localhost). To have it act as a server for - a network, this needs to be changed in the <ulink - url="../user-manual/config.html">main configuration file</ulink>. Look for - the <literal><ulink - url="../user-manual/config.html#LISTEN-ADDRESS">listen-address</ulink></literal> - option, which may be commented out with a <quote>#</quote> symbol. Make sure - it is uncommented, and assign it the address of the LAN gateway interface, - and port number to use. Assuming your LAN address is 192.168.1.1 and you - wish to run <application>Privoxy</application> on port 8118, this line - should look like: -</para> - -<para> - <screen> - listen-address 192.168.1.1:8118</screen> -</para> - -<para> - Save the file, and restart <application>Privoxy</application>. Configure - all browsers on the network then to use this address and port number. -</para> - -<para> - Alternately, you can have <application>Privoxy</application> listen on - all available interfaces: -</para> - -<para> - <screen> - listen-address :8118</screen> -</para> - -<para> - And then use <application>Privoxy's</application> - <ulink - url="../user-manual/config.html#PERMIT-ACCESS">permit-access</ulink> - feature to limit connections. A firewall in this situation is recommended - as well. -</para> - -<para> - The above steps should be the same for any TCP network, regardless of - operating system. -</para> - -<para> - If you run <application>Privoxy</application> on a LAN with untrusted users, - we recommend that you double-check the <ulink - url="../user-manual/config.html#ACCESS-CONTROL">access control and security</ulink> - options! -</para> - -</sect2> - - -<sect2 renderas="sect3"> -<title id="noseeum">Instead of ads, now I get a checkerboard pattern. I don't want to see anything.</title> -<para> - The replacement for blocked images can be controlled with the <ulink - url="../user-manual/actions-file.html#SET-IMAGE-BLOCKER"><literal>set-image-blocker</literal> - action</ulink>. You have the choice of a checkerboard pattern, a transparent 1x1 GIF - image (aka <quote>blank</quote>), or a redirect to a custom image of your choice. - Note that this choice only has effect for images which are blocked as images, i.e. - whose URLs match both a <literal><ulink - url="../user-manual/actions-file.html#HANDLE-AS-IMAGE">handle-as-image</ulink></literal> - <emphasis>and</emphasis> <literal><ulink - url="../user-manual/actions-file.html#BLOCK">block</ulink></literal> action. -</para> -<para> - If you want to see nothing, then change the <ulink - url="../user-manual/actions-file.html#SET-IMAGE-BLOCKER"><literal>set-image-blocker</literal> - action</ulink> to <quote>blank</quote>. This can be done by editing the - <filename>user.action</filename> file, or through the <ulink - url="http://config.privoxy.org/show-status%22%3Eweb-based actions file editor</ulink>. -</para> - -</sect2> - -<sect2 renderas="sect3"> -<title id="whyseeum">Why would anybody want to see a checkerboard pattern?</title> -<para> - Remember that <link linkend="whatsanad">telling which image is an ad and which - isn't</link>, is an educated guess. While we hope that the standard configuration - is rather smart, it will make occasional mistakes. The checkerboard image is visually - decent, and it shows you where images have been blocked, which can be very - helpful in case some navigation aid or otherwise innocent image was - erroneously blocked. It is recommended for new users so they can - <quote>see</quote> what is happening. Some people might also enjoy seeing how - many banners they <emphasis>don't</emphasis> have to see. -</para> - -</sect2> - -<sect2 renderas="sect3"> -<title id="blockedbytext">I see some images being replaced with text -instead of the checkerboard image. Why and how do I get rid of this?</title> -<para> - This happens when the banners are not embedded in the HTML code of the - page itself, but in separate HTML (sub)documents that are loaded into (i)frames - or (i)layers, and these external HTML documents are blocked. Being non-images - they get replaced by a substitute HTML page rather than a substitute image, - which wouldn't work out technically, since the browser expects and accepts - only HTML when it has requested an HTML document. -</para> -<para> - The substitute page adapts to the available space and shows itself as a - miniature two-liner if loaded into small frames, or full-blown with a - large red "BLOCKED" banner if space allows. -</para> -<para> - If you prefer the banners to be blocked by images, you must see to it that - the HTML documents in which they are embedded are not blocked. Clicking - the <quote>See why</quote> link offered in the substitute page will show - you which rule blocked the page. After changing the rule and un-blocking - the HTML documents, the browser will try to load the actual banner images - and the usual image blocking will (hopefully!) kick in. -</para> -</sect2> - - -<sect2 renderas="sect3" id="srvany"> -<title>Can Privoxy run as a service -on Win2K/NT/XP?</title> -<para> -<![%p-newstuff;[ - Yes. Version 3.0.5 introduces full <application>Windows</application> service - functionality. See <ulink url="../user-manual/installation.html#installation-pack-win"> - the <citetitle>User Manual</citetitle></ulink> for details on how to install and configure - <application>Privoxy</application> as a service. -</para> -<para> - Earlier ]]>3.x versions could run as a system service using <command>srvany.exe</command>. - See the discussion at <ulink - url="http://sourceforge.net/tracker/?func=detail&atid=361118&aid=485617&a...</ulink>, - for details, and a sample configuration. -</para> -</sect2> - - -<sect2 renderas="sect3" id="otherproxy"> -<title>How can I make Privoxy work with other -proxies like Squid or Tor?</title> -<para> - This can be done and is often useful to combine the benefits of - <application>Privoxy</application> with those of a another proxy. - See the <ulink - url="../user-manual/config.html#FORWARDING">forwarding chapter</ulink> - in the <ulink url="../user-manual/index.html">User Manual</ulink> which - describes how to do this, and the <link linkend="TOR"> - How do I use Privoxy together with - Tor</link> section below. -</para> -</sect2> - -<sect2 renderas="sect3" id="port-80"> -<title>Can I just set Privoxy to use port 80 -and thus avoid individual browser configuration?</title> - -<para> - No, its more complicated than that. This only works with special kinds - of proxies known as <quote>intercepting</quote> proxies (see below). -</para> - -</sect2> - -<sect2 renderas="sect3" id="transparent"> -<title>Can Privoxy run as a <quote>transparent -</quote> proxy?</title> -<para> - The whole idea of Privoxy is to modify client requests - and server responses in all sorts of ways and therefore - it's not a transparent proxy as described in - <ulink url="http://tools.ietf.org/html/rfc2616">RFC 2616</ulink>. -</para> -<para> - However, some people say <quote>transparent proxy</quote> when they - mean <quote>intercepting proxy</quote>. If you are one of them, - please read the <ulink url="#intercepting">next entry</ulink>. -</para> - -</sect2> - -<sect2 renderas="sect3" id="intercepting"> -<title>Can Privoxy run as a <quote>intercepting</quote> proxy?</title> -<para> - <application>Privoxy</application> can't intercept traffic itself, - but it can handle requests that where intercepted and redirected - with a packet filter (like <application>PF</application> or - <application>iptables</application>), as long as the <literal>Host</literal> - header is present. - </para> -<para> - As the <literal>Host</literal> header is required by HTTP/1.1 and as most - web sites rely on it anyway, this limitation shouldn't be a problem. -</para> -<para> - Please refer to your packet filter's documentation to learn how to - intercept and redirect traffic into <application>Privoxy</application>. - Afterward you just have to configure <application>Privoxy</application> to - <ulink url="../user-manual/config.html#ACCEPT-INTERCEPTED-REQUESTS">accept - intercepted requests</ulink>. -</para> - -</sect2> - -<sect2 renderas="sect3" id="outlook"> -<title>How can I configure Privoxy for use with Outlook?</title> -<para> - Versions of <application>Outlook</application> prior to Office 2007, use - <application>Internet Explorer</application> components to both render HTML, - and fetch any HTTP requests that may be embedded in an HTML email. So however - you have <application>Privoxy</application> configured to work with IE, this - configuration should automatically be shared, at least with older version of - Internet Explorer. -</para> -<para> - Starting with Office 2007, Microsoft is instead using the MS-Word rendering - engine with Outlook. It is unknown whether this can be configured to use a - proxy. - <!-- FIXME HB 2009-02-15 --> -</para> -</sect2> - -<sect2 renderas="sect3" id="outlook-more"> -<title>How can I have separate rules just for HTML mail?</title> -<para> - The short answer is, you can't. <application>Privoxy</application> has no way - of knowing which particular application makes a request, so there is no way to - distinguish between web pages and HTML mail. - <application>Privoxy</application> just blindly proxies all requests. In the - case of <application>Outlook Express</application> (see above), OE uses - IE anyway, and there is no way for <application>Privoxy</application> to ever - be able to distinguish between them (nor could any other proxy type application for - that matter). -</para> -<para> - For a good discussion of some of the issues involved (including privacy and - security issues), see - <ulink url="http://sourceforge.net/tracker/?func=detail&atid=211118&aid=629518&group_id=11118">http://sourceforge.net/tracker/?func=detail&atid=211118&aid=629518&a...</ulink>. -</para> -</sect2> - -<sect2 renderas="sect3" id="sneaky-cookies"> -<title>I sometimes notice cookies sneaking through. How?</title> -<para> - <ulink - url="http://en.wikipedia.org/wiki/Browser_cookie%22%3ECookies</ulink> can be - set in several ways. The classic method is via the - <literal>Set-Cookie</literal> HTTP header. This is straightforward, and an - easy one to manipulate, such as the &my-app; concept of - <ulink url="../user-manual/actions-file.html#SESSION-COOKIES-ONLY">session-cookies-only</ulink>. - There is also the possibility of using - <ulink url="http://en.wikipedia.org/wiki/Javascript">Javascript</ulink> to - set cookies (&my-app; calls these <literal>content-cookies</literal>). This - is trickier because the syntax can vary widely, and thus requires a certain - amount of guesswork. It is not realistic to catch all of these short of - disabling Javascript, which would break many sites. And lastly, if the - cookies are embedded in a HTTPS/SSL secure session via Javascript, they are beyond - <application>Privoxy's</application> reach. -</para> -<para> - All in all, &my-app; can help manage cookies in general, can help minimize - the loss of privacy posed by cookies, but can't realistically stop all - cookies. -</para> -</sect2> - -<sect2 renderas="sect3" id="evil-cookies"> -<title>Are all cookies bad? Why?</title> -<para> - No, in fact there are many beneficial uses of - <ulink - url="http://en.wikipedia.org/wiki/Browser_cookie%22%3Ecookies</ulink>. Cookies are just a - method that browsers can use to store data between pages, or between browser - sessions. Sometimes there is a good reason for this, and the user's life is a - bit easier as a result. But there is a long history of some websites taking - advantage of this layer of trust, and using the data they glean from you and - your browsing habits for their own purposes, and maybe to your potential - detriment. Such sites are using you and storing their data on your system. - That is why the privacy conscious watch from whom those cookies come, and why - they really <emphasis>need</emphasis> to be there. -</para> -<para> - See the - <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">Wikipedia cookie - definition</ulink> for more. -</para> -</sect2> - -<sect2 renderas="sect3" id="allow-cookies"> -<title>How can I allow permanent cookies for my trusted sites?</title> - -<para> - There are several actions that relate to cookies. The default behavior is to - allow only <quote>session cookies</quote>, which means the cookies only last - for the current browser session. This eliminates most kinds of abuse related - to cookies. But there may be cases where you want cookies to last. -</para> -<para> - To disable all cookie actions, so that cookies are allowed unrestricted, - both in and out, for <literal>example.com</literal>: -</para> -<para> - <screen> - { -crunch-incoming-cookies -crunch-outgoing-cookies -session-cookies-only -filter{content-cookies} } - .example.com</screen> -</para> -<para> - Place the above in <filename>user.action</filename>. Note that some of these may - be off by default anyway, so this might be redundant, but there is no harm - being explicit in what you want to happen. <filename>user.action</filename> - includes an alias for this situation, called - <literal>allow-all-cookies</literal>. -</para> -</sect2> - -<sect2 renderas="sect3" id="multiples"> -<title>Can I have separate configurations for different users?</title> -<para> - Each instance of <application>Privoxy</application> has its own - configuration, including such attributes as the TCP port that it listens on. - What you can do is run multiple instances of <application>Privoxy</application>, each with - a unique - <ulink url="../user-manual/config.html#LISTEN-ADDRESS">listen-address</ulink> - configuration setting, and configuration path, and then - each of these can have their own configurations. Think of it as per-port - configuration. -</para> -<para> - Simple enough for a few users, but for large installations, consider having - groups of users that might share like configurations. -</para> -</sect2> - -<sect2 renderas="sect3" id="whitelists"> -<title>Can I set-up Privoxy as a whitelist of -<quote>good</quote> sites?</title> -<para> - Sure. There are a couple of things you can do for simple white-listing. - Here's one real easy one: -</para> - <screen> - ############################################################ - # Blacklist - ############################################################ - { <ulink url="../user-manual/actions-file.html#BLOCK">+block</ulink> } - / # Block *all* URLs - - ############################################################ - # Whitelist - ############################################################ - { <ulink url="../user-manual/actions-file.html#BLOCK">-block</ulink> } - kids.example.com - toys.example.com - games.example.com</screen> -<para> - This allows access to only those three sites by first blocking all URLs, and - then subsequently allowing three specific exceptions. -</para> -<para> - Another approach is <application>Privoxy's</application> - <literal>trustfile</literal> concept, which incorporates the notion of - <quote>trusted referrers</quote>. See the <ulink - url="../user-manual/config.html#TRUSTFILE">Trust documentation</ulink> - for details. -</para> -<para> - These are fairly simple approaches and are not completely foolproof. There - are various other configuration options that should be disabled (described - elsewhere here and in <ulink url="../user-manual/">the User Manual</ulink>) - so that users can't modify their own configuration and easily circumvent the - whitelist. -</para> -</sect2> - -<sect2 renderas="sect3" id="no-adblock"> -<title>How can I turn off ad-blocking?</title> -<para> - Ad blocking is achieved through a complex application of various &my-app; - <ulink url="../user-manual/actions-file.html">actions</ulink>. These - actions are deployed against simple images, banners, flash animations, - text pages, JavaScript, pop-ups and pop-unders, etc., so its not as simple as - just turning one or two actions off. The various actions that make up - &my-app; ad blocking are hard-coded into the default configuration files. It - has been assumed that everyone using &my-app; is interested in this - particular feature. - </para> - <para> - If you want to do without this, there are several approaches you can take: - You can manually undo the many block rules in - <filename>default.action</filename>. Or even easier, just create your own - <filename>default.action</filename> file from scratch without the many ad - blocking rules, and corresponding exceptions. Or lastly, if you are not - concerned about the additional blocks that are done for privacy reasons, you - can very easily over-ride <emphasis>all</emphasis> blocking with the - following very simple rule in your <filename>user.action</filename>: - </para> - <para> - <screen> - # Unblock everybody, everywhere - { <ulink url="../user-manual/actions-file.html#BLOCK">-block</ulink> } - / # UN-Block *all* URLs</screen> -</para> -<para> - Or even a more comprehensive reversing of various ad related actions: -</para> -<para> - <screen> - # Unblock everybody, everywhere, and turn off appropriate filtering, etc - { <ulink url="../user-manual/actions-file.html#BLOCK">-block</ulink> \ - <ulink url="../user-manual/actions-file.html#FILTER-BANNERS-BY-SIZE">-filter{banners-by-size}</ulink> \ - <ulink url="../user-manual/actions-file.html#FILTER-BANNERS-BY-LINK">-filter{banners-by-link}</ulink> \ - <literal>allow-popups</literal> \ - } - / # UN-Block *all* URLs and allow ads</screen> -</para> -<para> - This last <quote>action</quote> in this compound statement, - <literal>allow-popups</literal>, is an <ulink - url="../user-manual/actions-file.html#ALIASES">alias</ulink> that disables - various pop-up blocking features. -</para> -</sect2> - -<sect2 renderas="sect3" id="templates"> -<title>How can I have custom template pages, like the -<emphasis>BLOCKED</emphasis> page?</title> -<para> - &my-app; <quote>templates</quote> are specialized text files utilized by - &my-app; for various purposes and can easily be modified using any text - editor. All the template pages are installed in a sub-directory appropriately - named: <filename>templates</filename>. Knowing something about HTML syntax - will of course be helpful. -</para> -<para> - Be forewarned that the default templates are subject to being overwritten - during upgrades. You can, however, create completely new templates, - place them in another directory and specify the alternate path in the main - <filename>config</filename>. For details, have a look at the <ulink - url="../user-manual/config.html#templdir">templdir</ulink> option. -</para> -</sect2> - -<sect2 renderas="sect3" id="blockall"> -<title>How can I remove the <quote>Go There Anyway</quote> link from -the <emphasis>BLOCKED</emphasis> page?</title> -<para> - There is more than one way to do it (although Perl is not involved). -</para> -<para> - Editing the BLOCKED template page (see above) may dissuade some users, but - this method is easily circumvented. Where you need this level of control, you - might want to build &my-app; from source, and disable various features that are - available as compile-time options. You should - <command>configure</command> the sources as follows: -</para> -<para> - <screen> - ./configure --disable-toggle --disable-editor --disable-force</screen> -</para> -<para> - This will create an executable with hard-coded security features so that - &my-app; does not allow easy bypassing of blocked sites, or changing the - current configuration via any connected user's web browser. -</para> -<para> - Finally, all of these features can also be toggled on/off via options in - <application>Privoxy's</application> main <ulink - url="../user-manual/config.html#ACCESS-CONTROL">config</ulink> file which - means you don't have to recompile anything. -</para> -</sect2> - -</sect1> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect1 id="misc"><title>Miscellaneous</title> - -<sect2 renderas="sect3"> -<title id="slowsme">How much does Privoxy slow my browsing down? This -has to add extra time to browsing.</title> -<para> - How much of an impact depends on many things, including the CPU of the host - system, how aggressive the configuration is, which specific actions are being triggered, - the size of the page, the bandwidth of the connection, etc. -</para> -<para> - Overall, 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 typically being - retrieved and displayed. The actual processing time required by - <application>Privoxy</application> itself for each page, is relatively small - in the overall scheme of things, and happens very quickly. This is typically - more than offset by time saved not downloading and rendering ad images and - other junk content (if ad blocking is being used). -</para> - -<para> - <quote>Filtering</quote> content via the <literal><ulink - url="../user-manual/actions-file.html#FILTER">filter</ulink></literal> or - <literal><ulink - url="../user-manual/actions-file.html#DEANIMATE-GIFS">deanimate-gifs</ulink></literal> - actions may cause a perceived slowdown, since the entire document - needs to be buffered before displaying. And on very large documents, - filtering may have some measurable impact. How much depends on the page size, - the actual definition of the filter(s), etc. See below. Most other actions - have little to no impact on speed. -</para> -<para> - Also, when filtering is enabled but zlib support isn't available, compression - is often disabled (see <ulink - url="../user-manual/actions-file.html#PREVENT-COMPRESSION">prevent-compression</ulink>). - This can have an impact on speed as well, although it's probably smaller than - you might think. Again, the page size, etc. will determine how much of an impact. -</para> - -</sect2> - - -<sect2 renderas="sect3" id="loadingtimes"><title>I notice considerable -delays in page requests. What's wrong?</title> -<para> - If you use any <literal><ulink - url="../user-manual/actions-file.html#FILTER">filter</ulink></literal> action, - such as filtering banners by size, web-bugs etc, or the <literal><ulink - url="../user-manual/actions-file.html#DEANIMATE-GIFS">deanimate-gifs</ulink></literal> - action, the entire document must be loaded into memory in order for the filtering - mechanism to work, and nothing is sent to the browser during this time. -</para> -<para> - The loading time typically does not really change much 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". This effect is - more noticeable on slower dialup connections. Extremely large documents - may have some impact on the time to load the page where there is filtering - being done. But overall, the difference should be very minimal. If there is a - big impact, then probably some other situation is contributing (like - anti-virus software). - </para> -<para> - Filtering is automatically disabled for inappropriate MIME types. But note - that if the web server mis-reports the MIME type, then content that should - not be filtered, could be. <application>Privoxy</application> only knows how - to differentiate filterable content because of the MIME type as reported by - the server, or because of some configuration setting that enables/disables - filtering. -</para> -</sect2> - -<sect2 renderas="sect3" id="configurl"><title>What are "http://config.privoxy.org/" and -"http://p.p/%22?</title> -<para> - <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink> is the - address of <application>Privoxy</application>'s built-in user interface, and - <ulink url="http://p.p/">http://p.p/</ulink> is a shortcut for it. -</para> -<para> - Since <application>Privoxy</application> sits between your web browser and the Internet, - it can simply intercept requests for these addresses and answer them with its built-in - <quote>web server</quote>. -</para> -<para> - This also makes for a good test for your browser configuration: If entering the - URL <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink> - takes you to a page saying <quote>This is Privoxy ...</quote>, everything is OK. - If you get a page saying <quote>Privoxy is not working</quote> instead, then - your browser didn't use <application>Privoxy</application> for the request, - hence it could not be intercepted, and you have accessed the <emphasis>real</emphasis> - web site at config.privoxy.org. -</para> - -</sect2> - -<!-- - out of date 09/02/06 HB -<sect2 renderas="sect3" id="blocklist"><title>Do you still maintain the blocklists?</title> - <para> - No. The patterns for blocking now reside (among other things) in the <ulink - url="../user-manual/actions-file.html">actions files</ulink>, which are - actively maintained instead. See next question ... -</para> -</sect2> ---> -<sect2 renderas="sect3" id="newads"><title>How can I submit new ads, or report -problems?</title> -<para> -Please see the <link linkend="contact">Contact section</link> for -various ways to interact with the developers. -</para> - -</sect2> - -<sect2 renderas="sect3" id="newads2"><title>If I do submit missed ads, will -they be included in future updates?</title> -<para> - Whether such submissions are eventually included in the - <filename>default.action</filename> configuration file depends on how - significant the issue is. We of course want to address any potential - problem with major, high-profile sites such as <citetitle>Google</citetitle>, - <citetitle>Yahoo</citetitle>, etc. Any site with global or regional reach, - has a good chance of being a candidate. But at the other end of the spectrum - are any number of smaller, low-profile sites such as for local clubs or - schools. Since their reach and impact are much less, they are best handled by - inclusion in the user's <filename>user.action</filename>, and thus would be - unlikely to be included. -</para> - -</sect2> - - -<sect2 renderas="sect3" id="noonecares"><title>Why doesn't anyone answer my support -request?</title> -<para> -Rest assured that it has been read and considered. Why it is not answered, -could be for various reasons, including no one has a good answer for it, no -one has had time to yet investigate it thoroughly, it has been reported -numerous times already, or because not enough information was provided to help -us help you. Your efforts are not wasted, and we do appreciate them. -</para> - -</sect2> - - -<sect2 renderas="sect3" id="ip"><title>How can I hide my IP address?</title> -<para> - If you run both the browser and &my-app; locally, you cannot hide your IP - address with <application>Privoxy</application> or ultimately any other - software alone. The server needs to know your IP address so that it knows - where to send the responses back. -</para> -<para> - There are many publicly usable "anonymous" proxies out there, which - provide a further level of indirection between you and the web server. -</para> -<para> - However, these proxies are called "anonymous" because you don't need - to authenticate, not because they would offer any real anonymity. - Most of them will log your IP address and make it available to the - authorities in case you violate the law of the country they run in. In fact - you can't even rule out that some of them only exist to *collect* information - on (those suspicious) people with a more than average preference for privacy. -</para> -<para> - If you want to hide your IP address from most adversaries, - you should consider chaining <application>Privoxy</application> - with <ulink url="https://www.torproject.org/">Tor</ulink>. - The configuration details can be found in - <ulink url="#TOR">How do I use <application>Privoxy</application> together - with <application>Tor</application> section</ulink> - just below. -</para> -</sect2> - -<sect2 renderas="sect3"> -<title id="anonforsure">Can Privoxy guarantee I am anonymous?</title> -<para> - No. Your chances of remaining anonymous are improved, but unless you - <ulink url="#TOR">chain <application>Privoxy</application> with <application>Tor</application></ulink> - or a similar proxy and know what you're doing when it comes to configuring - the rest of your system, you should assume that everything you do - on the Web can be traced back to you. -</para> -<para> - <application>Privoxy</application> can remove various information about you, - and allows <emphasis>you</emphasis> more freedom to decide which sites - you can trust, and what details you want to reveal. But it neither - hides your IP address, nor can it guarantee that the rest of the system - behaves correctly. There are several possibilities how a web sites can find - out who you are, even if you are using a strict <application>Privoxy</application> - configuration and chained it with <application>Tor</application>. -</para> -<para> - Most of <application>Privoxy's</application> privacy-enhancing features can be easily subverted - by an insecure browser configuration, therefore you should use a browser that can - be configured to only execute code from trusted sites, and be careful which sites you trust. - For example there is no point in having <application>Privoxy</application> - modify the User-Agent header, if websites can get all the information they want - through JavaScript, ActiveX, Flash, Java etc. -</para> -<para> - A few browsers disclose the user's email address in certain situations, such - as when transferring a file by FTP. <application>Privoxy</application> - does not filter FTP. If you need this feature, or are concerned about the - mail handler of your browser disclosing your email address, you might - consider products such as <application>NSClean</application>. -</para> -<para> - Browsers available only as binaries could use non-standard headers to give - out any information they can have access to: see the manufacturer's license - agreement. It's impossible to anticipate and prevent every breach of privacy - that might occur. The professionally paranoid prefer browsers available as - source code, because anticipating their behavior is easier. Trust the source, - Luke! -</para> - -</sect2> - -<sect2 renderas="sect3"> -<title id="proxytest">A test site says I am not using a Proxy.</title> -<para> - Good! Actually, they are probably testing for some other kinds of proxies. - Hiding yourself completely would require additional steps. -</para> -</sect2> - -<sect2 renderas="sect3" id="tor"><title>How do I use Privoxy - together with Tor?</title> -<para> - Before you configure <application>Privoxy</application> to use - <ulink url="https://www.torproject.org/">Tor</ulink>, - please follow the <citetitle>User Manual</citetitle> chapters - <ulink url="../user-manual/installation.html">2. Installation</ulink> and - <ulink url="../user-manual/startup.html">5. Startup</ulink> to make sure - <application>Privoxy</application> itself is setup correctly. -</para> -<para> - If it is, refer to <ulink url="https://www.torproject.org/documentation.html">Tor's - extensive documentation</ulink> to learn how to install <application>Tor</application>, - and make sure <application>Tor</application>'s logfile says that - <quote>Tor has successfully opened a circuit</quote> and it - <quote>looks like client functionality is working</quote>. -</para> -<para> - If either <application>Tor</application> or <application>Privoxy</application> - isn't working, their combination most likely will neither. Testing them on their - own will also help you to direct problem reports to the right audience. - If <application>Privoxy</application> isn't working, don't bother the - <application>Tor</application> developers. If <application>Tor</application> - isn't working, don't send bug reports to the <application>Privoxy</application> Team. -</para> -<para> - If you verified that <application>Privoxy</application> and <application>Tor</application> - are working, it is time to connect them. As far as <application>Privoxy</application> - is concerned, <application>Tor</application> is just another proxy that can be reached - by socks4 or socks4a. Most likely you are interested in <application>Tor</application> - to increase your anonymity level, therefore you should use socks4a, to make sure DNS requests are - done through <application>Tor</application> and thus invisible to your local network. -</para> - -<![%p-newstuff;[ -<para> - Since <application>Privoxy</application> 3.0.5, its - <ulink url="../user-manual/config.html">main configuration file</ulink> - is already prepared for <application>Tor</application>, if you are using a - default <application>Tor</application> configuration and run it on the same - system as &my-app;, you just have to edit the - <ulink url="../user-manual/config.html#FORWARDING">forwarding section</ulink> - and uncomment the line: -</para> -<para> - <screen> -# forward-socks4a / 127.0.0.1:9050 . - </screen> -</para> -<para> - This is enough to reach the Internet, but additionally you might want to - uncomment the following forward rules, to make sure your local network is still - reachable through Privoxy: -</para> -<para> - <screen> -# forward 192.168.*.*/ . -# forward 10.*.*.*/ . -# forward 127.*.*.*/ . - </screen> -</para> -<para> - Unencrypted connections to systems in these address ranges will - be as (un)secure as the local network is, but the alternative is - that your browser can't reach the network at all. Then again, - that may actually be desired and if you don't know for sure - that your browser has to be able to reach the local network, - there's no reason to allow it. -</para> -<para> - If you want your browser to be able to reach servers in your local - network by using their names, you will need additional exceptions - that look like this: -</para> -<para> - <screen> -# forward localhost/ . - </screen> -</para> -<para> - Save the modified configuration file and open - <ulink url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status/</ulink> - in your browser, confirm that <application>Privoxy</application> has reloaded its configuration - and that there are no other forward lines, unless you know that you need them. If everything looks good, - refer to - <ulink url="https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#IsMyConnectionPrivate">Tor - Faq 4.2</ulink> to learn how to verify that you are really using <application>Tor</application>. -</para> -<para> - Afterward, please take the time to at least skim through the rest - of <application>Tor's</application> documentation. Make sure you understand - what <application>Tor</application> does, why it is no replacement for - application level security, and why you probably don't want to - use it for unencrypted logins. -</para> ]]> -</sect2> - -<sect2 renderas="sect3"> -<title id="sitebreak">Might some things break because header information or -content is being altered?</title> - -<para> - Definitely. It is common for sites to use browser type, browser version, - HTTP header content, and various other techniques in order to dynamically - decide what to display and how to display it. What you see, and what I see, - might be very different. There are many, many ways that this can be handled, - so having hard and fast rules, is tricky. -</para> - -<para> - The <quote>User-Agent</quote> is sometimes used in this way to identify - the browser, and adjust content accordingly. -</para> - -<para> - Also, different browsers use different encodings of non-English - characters, certain web servers convert pages on-the-fly according to the - User Agent header. Giving a <quote>User Agent</quote> with the wrong - operating system or browser manufacturer causes some sites in these languages - to be garbled; Surfers to Eastern European sites should change it to - something closer. And then some page access counters work by looking at the - <quote>Referer</quote> header; they may fail or break if unavailable. The - weather maps of Intellicast have been blocked by their server when no - <quote>Referer</quote> or cookie is provided, is another example. (But you - can forge both headers without giving information away). There are - many other ways things can go wrong when trying to fool a web server. The - results of which could inadvertently cause pages to load incorrectly, - partially, or even not at all. And there may be no obvious clues as to just - what went wrong, or why. Nowhere will there be a message that says - <quote><emphasis>Turn off <literal>fast-redirects</literal> or else!</emphasis> - </quote> -</para> - -<para> - Similar thoughts apply to modifying JavaScript, and, to a lesser degree, - HTML elements. -</para> - -<para> - If you have problems with a site, you will have to adjust your configuration - accordingly. Cookies are probably the most likely adjustment that may - be required, but by no means the only one. -</para> - -</sect2> - - -<sect2 renderas="sect3"> -<title id="caching">Can Privoxy act as a <quote>caching</quote> proxy to -speed up web browsing?</title> -<para> - No, it does not have this ability at all. You want something like - <ulink url="http://www.squid-cache.org/">Squid</ulink> or - <ulink url="http://www.pps.jussieu.fr/~jch/software/polipo/">Polipo</ulink> for this. - And, yes, before you ask, <application>Privoxy</application> can co-exist - with other kinds of proxies like <application>Squid</application>. - See the <ulink url="../user-manual/config.html#FORWARDING">forwarding - chapter</ulink> in the <ulink url="../user-manual/index.html">user - manual</ulink> for details. -</para> -</sect2> - -<sect2 renderas="sect3"> -<title id="firewall">What about as a firewall? Can Privoxy protect me?</title> -<para> - Not in the way you mean, or in the way some firewall vendors claim they can. - <application>Privoxy</application> can help protect your privacy, but can't - protect your system from intrusion attempts. It is, of course, perfectly possible - to use <emphasis>both</emphasis>. -</para> -</sect2> - -<sect2 renderas="sect3"> -<title id="wasted">I have large empty spaces / a checkerboard pattern now where -ads used to be. Why?</title> -<para> - It is technically possible to eliminate banners and ads in a way that frees - their allocated page space. This could easily be done by blocking with - <application>Privoxy's</application> filters, - and eliminating the <emphasis>entire</emphasis> image references from the - HTML page source. -</para> -<para> - But, this would consume considerably more CPU resources (IOW, slow things - down), would likely destroy the layout of some web pages which rely on the - banners utilizing a certain amount of page space, and might fail in other - cases, where the screen space is reserved (e.g. by HTML tables for instance). - Also, making ads and banners disappear without any trace complicates - troubleshooting, and would sooner or later be problematic. -</para> -<para> - The better alternative is to instead let them stay, and block the resulting - requests for the banners themselves as is now the case. This leaves either - empty space, or the familiar checkerboard pattern. -</para> -<para> - So the developers won't support this in the default configuration, but you - can of course define appropriate filters yourself to achieve this. -</para> -</sect2> - -<sect2 renderas="sect3"> -<title id="ssl">How can Privoxy filter Secure (HTTPS) URLs?</title> -<para> - Since secure HTTP connections are encrypted SSL sessions between your browser - and the secure site, and are meant to be reliably <emphasis>secure</emphasis>, - there is little that <application>Privoxy</application> can do but hand the raw - gibberish data though from one end to the other unprocessed. -</para> -<para> - The only exception to this is blocking by host patterns, as the client needs - to tell <application>Privoxy</application> the name of the remote server, - so that <application>Privoxy</application> can establish the connection. - If that name matches a host-only pattern, the connection will be blocked. -</para> -<para> - As far as ad blocking is concerned, this is less of a restriction than it may - seem, since ad sources are often identifiable by the host name, and often - the banners to be placed in an encrypted page come unencrypted nonetheless - for efficiency reasons, which exposes them to the full power of - <application>Privoxy</application>'s ad blocking. -</para> -<para> - <quote>Content cookies</quote> (those that are embedded in the actual HTML or - JS page content, see <literal><ulink - url="../user-manual/actions-file.html#FILTER-CONTENT-COOKIES">filter{content-cookies}</ulink></literal>), - in an SSL transaction will be impossible to block under these conditions. - Fortunately, this does not seem to be a very common scenario since most - cookies come by traditional means. -</para> - -</sect2> - -<sect2 renderas="sect3"> -<title id="secure">Privoxy runs as a <quote>server</quote>. How -secure is it? Do I need to take any special precautions?</title> -<para> - On Unix-like systems, <application>Privoxy</application> can run as a non-privileged - user, which is how we recommend it be run. Also, by default - <application>Privoxy</application> listens to requests from <quote>localhost</quote> - only. -</para> -<para> - The server aspect of <application>Privoxy</application> is not itself directly - exposed to the Internet in this configuration. If you want to have - <application>Privoxy</application> serve as a LAN proxy, this will have to - be opened up to allow for LAN requests. In this case, we'd recommend - you specify only the LAN gateway address, e.g. 192.168.1.1, in the main - <application>Privoxy</application> configuration file and check all <ulink - url="../user-manual/config.html#ACCESS-CONTROL">access control and security - options</ulink>. All LAN hosts can then use this as their proxy address - in the browser proxy configuration, but <application>Privoxy</application> - will not listen on any external interfaces. ACLs can be defined in addition, - and using a firewall is always good too. Better safe than sorry. -</para> - -</sect2> - -<sect2 renderas="sect3" id="turnoff"> -<title>Can I temporarily disable Privoxy?</title> -<para> - &my-app; doesn't have a transparent proxy mode, - but you can toggle off blocking and content filtering. -</para> -<para> - The easiest way to do that is to point your browser - to the remote toggle URL: <ulink - url="http://config.privoxy.org/toggle%22%3Ehttp://config.privoxy.org/toggle</ulink>. -</para> -<para> - See the <ulink url="../user-manual/appendix.html#BOOKMARKLETS">Bookmarklets section</ulink> - of the <citetitle>User Manual</citetitle> for an easy way to access this - feature. Note that this is a feature that may need to be enabled in the main - <filename>config</filename> file. -</para> -</sect2> - - -<sect2 renderas="sect3" id="reallyoff"> -<title>When <quote>disabled</quote> is Privoxy totally -out of the picture?</title> -<para> - No, this just means all optional filtering and actions are disabled. - <application>Privoxy</application> is still acting as a proxy, but just - doing less of the things that <application>Privoxy</application> would - normally be expected to do. It is still a <quote>middle-man</quote> in - the interaction between your browser and web sites. See below to bypass - the proxy. -</para> -</sect2> - -<sect2 renderas="sect3" id="turnoff2"> -<title>How can I tell Privoxy to totally ignore certain sites?</title> -<para> - Bypassing a proxy, or proxying based on arbitrary criteria, is purely a browser - configuration issue, not a &my-app; issue. Modern browsers typically do have - settings for not proxying certain sites. Check your browser's help files. -</para> -</sect2> - - -<sect2 renderas="sect3" id="crunch"> -<title>My logs show Privoxy <quote>crunches</quote> -ads, but also its own internal CGI pages. What is a <quote>crunch</quote>?</title> -<para> - A <quote>crunch</quote> simply means <application>Privoxy</application> intercepted - <emphasis>something</emphasis>, nothing more. Often this is indeed ads or - banners, but <application>Privoxy</application> uses the same mechanism for - trapping requests for its own internal pages. For instance, a request for - <application>Privoxy's</application> configuration page at: <ulink - url="http://config.privoxy.org%22%3Ehttp://config.privoxy.org</ulink>, is - intercepted (i.e. it does not go out to the 'net), and the familiar CGI - configuration is returned to the browser, and the log consequently will show - a <quote>crunch</quote>. -</para> -<para> - Since version 3.0.7, Privoxy will also log the crunch reason. - If you are using an older version you might want to upgrade. -</para> -</sect2> - -<sect2 renderas="sect3" id="downloads"> -<title>Can Privoxy effect files that I download -from a webserver? FTP server?</title> -<para> - From the webserver's perspective, there is no difference between - viewing a document (i.e. a page), and downloading a file. The same is true of - <application>Privoxy</application>. If there is a match for a <literal><ulink - url="../user-manual/actions-file.html#BLOCK">block</ulink></literal> pattern, - it will still be blocked, and of course this is obvious. - </para> - <para> - Filtering is potentially more of a concern since the results are not always - so obvious, and the effects of filtering are there whether the file is simply - viewed, or downloaded. And potentially whether the content is some obnoxious - advertisement, or Mr. Jimmy's latest/greatest source code jewel. Of course, - one of these presumably is <quote>bad</quote> content that we don't want, and - the other is <quote>good</quote> content that we do want. - <application>Privoxy</application> is blind to the differences, and can only - distinguish <quote>good from bad</quote> by the configuration parameters - <emphasis>we</emphasis> give it. -</para> -<para> - <application>Privoxy</application> knows the differences in files according - to the <quote>Content Type</quote> as reported by the webserver. If this is - reported accurately (e.g. <quote>application/zip</quote> for a zip archive), - then <application>Privoxy</application> knows to ignore these where - appropriate. <application>Privoxy</application> potentially can filter HTML - as well as plain text documents, subject to configuration parameters of - course. Also, documents that are of an unknown type (generally assumed to be - <quote>text/plain</quote>) can be filtered, as will those that might be - incorrectly reported by the webserver. If such a file is a downloaded file - that is intended to be saved to disk, then any content that might have been - altered by filtering, will be saved too, for these (probably rare) cases. -</para> -<para> - Note that versions later than 3.0.2 do NOT filter document types reported as - <quote>text/plain</quote>. Prior to this, <application>Privoxy</application> - did filter this document type. -</para> -<para> - In short, filtering is <quote>ON</quote> if a) the content type as reported - by the webserver is appropriate <emphasis>and</emphasis> b) the configuration - allows it (or at least does not disallow it). That's it. There is no magic - cookie anywhere to say this is <quote>good</quote> and this is - <quote>bad</quote>. It's the configuration that lets it all happen or not. -</para> -<para> - If you download text files, you probably do not want these to be filtered, - particularly if the content is source code, or other critical content. Source - code sometimes might be mistaken for Javascript (i.e. the kind that might - open a pop-up window). It is recommended to turn off filtering for download - sites (particularly if the content may be plain text files and you are using - version 3.0.2 or earlier) in your <filename>user.action</filename> file. And - also, for any site or page where making <emphasis>any</emphasis> changes at - all to the content is to be avoided. -</para> -<para> - <application>Privoxy</application> does not do FTP at all, only HTTP - and HTTPS (SSL) protocols. -</para> -</sect2> - -<sect2 renderas="sect3" id="downloads2"> -<title>I just downloaded a Perl script, and Privoxy -altered it! Yikes, what is wrong!</title> -<para> - Please read above. -</para> -</sect2> - -<sect2 renderas="sect3" id="hostsfile"> -<title>Should I continue to use a <quote>HOSTS</quote> file for ad-blocking?</title> -<para> - One time-tested technique to defeat common ads is to trick the local DNS - system by giving a phony IP address for the ad generator in the local - <filename>HOSTS</filename> file, typically using <literal>127.0.0.1</literal>, aka - <literal>localhost</literal>. This effectively blocks the ad. -</para> -<para> - There is no reason to use this technique in conjunction with - <application>Privoxy</application>. <application>Privoxy</application> - does essentially the same thing, much more elegantly and with much more - flexibility. A large <filename>HOSTS</filename> file, in fact, not only - duplicates effort, but may get in the way and seriously slow down your system. - It is recommended to remove such entries from your <filename>HOSTS</filename> file. If you think - your hosts list is neglected by <application>Privoxy's </application> - configuration, consider adding your list to your <filename>user.action</filename> file: -</para> -<para> - <screen> - { +block } - www.ad.example1.com - ad.example2.com - ads.galore.example.com - etc.example.com</screen> -</para> -</sect2> - -<sect2 renderas="sect3" id="seealso"> -<title>Where can I find more information about Privoxy -and related issues?</title> -<!-- Include seealso.sgml boilerplate: --> - &seealso; -<!-- end boilerplate --> - -<!-- -<para> - Please see the - <ulink url="../user-manual/seealso.html">user-manual</ulink> for - others references. -</para> ---> -</sect2> - -<sect2 renderas="sect3" id="microsuck"> -<title>I've noticed that Privoxy changes <quote>Microsoft</quote> to -<quote>MicroSuck</quote>! Why are you manipulating my browsing?</title> - -<para> - We're not. The text substitutions that you are seeing are disabled - in the default configuration as shipped. You have either manually - activated the <quote><literal>fun</literal></quote> filter which - is clearly labeled <quote>Text replacements for subversive browsing - fun!</quote> or you are using an older Privoxy version and have implicitly - activated it by choosing the <quote>Advanced</quote> profile in the - web-based editor. Please upgrade. -</para> -</sect2> - -<sect2 renderas="sect3" id="valid"> -<title>Does Privoxy produce <quote>valid</quote> HTML (or XHTML)?</title> - -<para> - Privoxy generates HTML in both its own <quote>templates</quote>, and possibly - whenever there are text substitutions via a &my-app; filter. While this - should always conform to the HTML 4.01 specifications, it has not been - validated against this or any other standard. -</para> -</sect2> - - -</sect1> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect1 id="trouble"> -<title>Troubleshooting</title> - -<sect2 renderas="sect3"> -<title id="refused">I cannot connect to any websites. Or, I am getting -<quote>connection refused</quote> message with every web page. Why?</title> -<para> - There are several possibilities: -</para> -<para> -<itemizedlist> -<listitem><para> -<application>Privoxy</application> is not running. Solution: verify - that &my-app; is installed correctly, has not crashed, and is indeed running. - Turn on <application>Privoxy's</application> logging, and look at the logs to see what they say. -</para></listitem> - <listitem><para>Or your browser is configured for a different port than what - <application>Privoxy</application> is using. Solution: verify that &my-app; - and your browser are set to the same port (<literal>listen-address</literal>). -</para></listitem> - <listitem><para>Or if using a forwarding rule, you have a configuration problem or a - problem with a host in the forwarding chain. Solution: temporarily alter your - configuration and take the forwarders out of the equation. -</para></listitem> - <listitem><para> - Or you have a firewall that is interfering and blocking you. Solution: - try disabling or removing the firewall as a simple test. - </para></listitem> -</itemizedlist> -</para> - -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 renderas="sect3" id="error503"> -<title>Why am I getting a 503 Error (WSAECONNREFUSED) on every page?</title> - <para> - More than likely this is a problem with your TCP/IP networking. ZoneAlarm has - been reported to cause this symptom -- even if not running! The solution is - to either fight the ZA configuration, or uninstall ZoneAlarm, and then find - something better behaved in its place. Other personal firewall type products - may cause similar type problems if not configured correctly. - </para> -</sect2> - -<sect2 renderas="sect3"> -<title id="flushit">I just added a new rule, but the steenkin ad is -still getting through. How?</title> -<para> - If the ad had been displayed before you added its URL, it will probably be - held in the browser's cache for some time, so it will be displayed without - the need for any request to the server, and <application>Privoxy</application> - will not be involved. Flush the browser's caches, and then try again. -</para> - -<para> - If this doesn't help, you probably have an error in the rule you - applied. Try pasting the full URL of the offending ad into <ulink - url="http://config.privoxy.org/show-url-info%22%3Ehttp://config.privoxy.org/show-...</ulink> - and see if it really matches your new rule. Blocking ads is like blocking - spam: a lot of tinkering is required to stay ahead of the game. And - remember you need to block the URL of the ad in question, which may be - entirely different from the site URL itself. Most ads are hosted on different - servers than the main site itself. If you right-click on the ad, you should - be able to get all the relevant information you need. Alternately, you can - find the correct URL by looking at <application>Privoxy's</application> logs - (you may need to enable logging in the main config file if its disabled). -</para> -<para> - Below is a slightly modified real-life log snippet that originates with one - requested URL: <literal>www.example.com</literal> (name of site was changed - for this example, the number of requests is real). You can see in this the - complexity of what goes into making up this one <quote>page</quote>. There - are eight different domains involved here, with thirty two separate URLs - requested in all, making up all manner of images, Shockwave Flash, - JavaScript, CSS stylesheets, scripts, and other related content. Some of this - content is obviously <quote>good</quote> or <quote>bad</quote>, but not all. - Many of the more questionable looking requests, are going to outside domains - that seem to be identifying themselves with suspicious looking names, making - our job a little easier. &my-app; has <quote>crunched</quote> (meaning caught - and BLOCKED) quite a few items in this example, but perhaps missed a few as well. -</para> -<para> -<screen> -<![CDATA[ -Request: www.example.com/ -Request: www.example.com/favicon.ico -Request: img.example.com/main.css -Request: img.example.com/sr.js -Request: example.betamarker.com/example.html -Request: www.lik-sang.com/Banners/bestsellers/skyscraper.php?likref=BSellers -Request: img.example.com/pb.png -Request: www.google-analytics.com/urchin.js crunch! (Blocked) -Request: www.advertising-department.com/ats/switch.ps.php?26856 crunch! (Blocked) -Request: img.example.com/p.gif -Request: www.popuptraffic.com/assign.php?l=example&mode=behind crunch! (Blocked) -Request: www.popuptraffic.com/scripts/popup.php?hid=5c3cf&tmpl=PBa.tmpl crunch! (Blocked) -Request: www.popuptraffic.com/assign.php?l=example crunch! (Blocked) -Request: www.lik-sang.com/Banners/best_sellers/best_sellers.css -Request: www.adtrak.net/adx.js crunch! (Blocked) -Request: img.example.com/hbg.gif -Request: img.example.com/example.jpg -Request: img.example.com/mt.png -Request: img.example.com/mm.png -Request: img.example.com/mb.png -Request: www.popuptraffic.com/scripts/popup.php?hid=a71b91fa5&tmpl=Ua.tmp crunch! (Blocked) -Request: www.example.com/tracker.js -Request: www.lik-sang.com/Banners/best_sellers/lsi_head.gif -Request: www.adtrak.net/adjs.php?n=020548130&what=zone:61 crunch! (Blocked) -Request: www.adtrak.net/adjs.php?n=463594413&what=zone:58&source=Ua crunch! (Blocked) -Request: www.lik-sang.com/Banners/best_sellers/bottomani.swf -Request: mmm.elitemediagroup.net/install.php?allowpop=no&popupmincook=0&allowsp2=1 crunch! (Blocked) -Request: www.example.com/tracker.js?screen=1400x1050&win=962x693 -Request: www.adtrak.net/adlog.php?bannerid=1309&clientid=439&zoneid=61 crunch! (Blocked) -Request: 66.70.21.80/scripts/click.php?hid=5c3cf599a9efd0320d26&si -Request: 66.70.21.80/img/pixel.gif -Request: www.adtrak.net/adlog.php?bannerid=1309&clientid=439&zoneid=58&source=Ua&block=86400 crunch! (Blocked) -Request: 66.70.21.80/scripts/click.php?hid=a71b9f6504b0c5681fa5&si=Ua -]]> -</screen> -</para> -<para> - Despite 12 out of 32 requests being blocked, the page looked, and seemed to - behave perfectly <quote>normal</quote> (minus some ads, of course). -</para> - -</sect2> - -<sect2 id="badsite" renderas="sect3"> -<title >One of my favorite sites does not work with Privoxy. -What can I do?</title> - -<para> - First verify that it is indeed a <application>Privoxy</application> problem, - by toggling off <application>Privoxy</application> through <ulink - url="http://config.privoxy.org/toggle%22%3Ehttp://config.privoxy.org/toggle</ulink> - (the toggle feature may need to be enabled in the main - <filename>config</filename>), - and then shift-reloading the problem page (i.e. holding down the shift key - while clicking reload. Alternatively, flush your browser's disk and memory - caches). -</para> - -<para> - If the problem went away, we know we have a configuration related problem. - Now go to <ulink - url="http://config.privoxy.org/show-url-info%22%3Ehttp://config.privoxy.org/show-...</ulink> - and paste the full URL of the page in question into the prompt. See which - actions are being applied to the URL, and which matches in which actions - files are responsible for that. It might be helpful also to look at your logs - for this site too, to see what else might be happening (note: logging may need - to be enabled in the main config file). Many sites are - complex and require a number of related pages to help present their content. - Look at what else might be used by the page in question, and what of that - might be <emphasis>required</emphasis>. - Now, armed with this information, go to - <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink> - and select the appropriate actions files for editing. </para> -<para> - You can now either look for a section which disables the actions that - you suspect to cause the problem and add a pattern for your site there, - or make up a completely new section for your site. In any case, the recommended - way is to disable only the prime suspect, reload the problem page, and only - if the problem persists, disable more and more actions until you have - identified the culprit. You may or may not want to turn the other actions - on again. Remember to flush your browser's caches in between any such changes! -</para> -<para> - Alternately, if you are comfortable with a text editor, you can accomplish - the same thing by editing the appropriate actions file. Probably the easiest - way to deal with such problems when editing by hand is to add your - site to a <literal>{ fragile }</literal> section in <filename>user.action</filename>, - which is an alias that turns off most <quote>dangerous</quote> - actions, but is also likely to turn off more actions then needed, and thus lower - your privacy and protection more than necessary, -</para> -<para> - Troubleshooting actions is discussed in more detail in the <ulink - url="../user-manual/appendix.html#ACTIONSANAT">User Manual appendix, - Troubleshooting: the Anatomy of an Action</ulink>. - There is also an <ulink - url="../user-manual/actions-file.html#ACT-EXAMPLES">actions tutorial</ulink> - with general configuration information and examples. -</para> -<para> - As a last resort, you can always see if your browser has a setting that will - bypass the proxy setting for selective sites. Modern browsers can do this. -</para> - -</sect2> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="dun" renderas="sect3"> -<title>After installing Privoxy, I have to log in -every time I start IE. What gives?</title> - -<para> - This is a quirk that effects the installation of - <application>Privoxy</application>, in conjunction with Internet Explorer and - Internet Connection Sharing on Windows 2000 and Windows XP. The symptoms may - appear to be corrupted or invalid DUN settings, or passwords. -</para> - -<para> - When setting up an NT based Windows system with - <application>Privoxy</application> you may find that things do not seem to be - doing what you expect. When you set your system up you will probably have set - up Internet Connection Sharing (ICS) with Dial up Networking (DUN) when - logged in with administrator privileges. You will probably have made this DUN - connection available to other accounts that you may have set-up on your - system. E.g. Mum or Dad sets up the system and makes accounts suitably - configured for the kids. -</para> - -<para> - When setting up <application>Privoxy</application> in this environment you - will have to alter the proxy set-up of Internet Explorer (IE) for the - specific DUN connection on which you wish to use - <application>Privoxy</application>. When you do this the ICS DUN set-up - becomes user specific. In this instance you will see no difference if you - change the DUN connection under the account used to set-up the connection. - However when you do this from another user you will notice that the DUN - connection changes to make available to "Me only". You will also find that - you have to store the password under each different user! -</para> - -<para> - The reason for this is that each user's set-up for IE is user specific. Each - set-up DUN connection and each LAN connection in IE store the settings for - each user individually. As such this enforces individual configurations - rather than common ones. Hence the first time you use a DUN connection after - re-booting your system it may not perform as you expect, and prompt you for - the password. Just set and save the password again and all should be OK. -</para> - -<para> -[Thanks to Ray Griffith for this submission.] -</para> -</sect2> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="ftp" renderas="sect3"> -<title>I cannot connect to any FTP sites. Privoxy - is blocking me.</title> - <para> - <application>Privoxy</application> cannot act as a proxy for FTP traffic, - so do not configure your browser to use <application>Privoxy</application> - as an FTP proxy. The same is true for <emphasis>any protocol other than HTTP - or HTTPS (SSL)</emphasis>. - </para> - <para> - Most browsers understand FTP as well as HTTP. If you connect to a site, with - a URL like <literal>ftp://ftp.example.com</literal>, your browser is making - an FTP connection, and not a HTTP connection. So while your browser may - speak FTP, <application>Privoxy</application> does not, and cannot proxy - such traffic. - </para> - <para> - To complicate matters, some systems may have a generic <quote>proxy</quote> - setting, which will enable various protocols, including - <emphasis>both</emphasis> HTTP and FTP proxying! So it is possible to - accidentally enable FTP proxying in these cases. And of course, if this - happens, <application>Privoxy</application> will indeed cause problems since - it does not know FTP. <![%p-newstuff;[Newer version will give a sane error - message if a FTP connection is attempted.]]> Just disable the FTP setting - and all will be well again. - </para> - <para> - Will <application>Privoxy</application> ever proxy FTP traffic? Unlikely. - There just is not much reason, and the work to make this happen is more than - it may seem. - </para> -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="macosxie" renderas="sect3"> -<title>In Mac OS X, I can't configure Microsoft Internet Explorer to use - Privoxy as the HTTP proxy.</title> - <para> - Microsoft Internet Explorer (in versions like 5.1) respects system-wide - network settings. In order to change the HTTP proxy, open System - Preferences, and click on the Network icon. In the settings pane that - comes up, click on the Proxies tab. Ensure the "Web Proxy (HTTP)" checkbox - is checked and enter <literal>127.0.0.1</literal> in the entry field. - Enter <literal>8118</literal> in the Port field. The next time you start - IE, it should reflect these values. - </para> -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 renderas="sect3" id="macosxuninstall"> -<title>In Mac OS X, I dragged the Privoxy folder to the trash in order to - uninstall it. Now the finder tells me I don't have sufficient privileges to - empty the trash.</title> - <para> - Note: This ONLY applies to privoxy 3.0.6 and earlier. - </para> - <para> - Just dragging the <application>Privoxy</application> folder to the trash is - not enough to delete it. <application>Privoxy</application> supplies an - <application>uninstall.command</application> file that takes care of - these details. Open the trash, drag the <application>uninstall.command</application> - file out of the trash and double-click on it. You will be prompted for - confirmation and the administration password. - </para> - <para> - The trash may still appear full after this command; emptying the trash - from the desktop should make it appear empty again. - </para> -</sect2> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 renderas="sect3" id="macosximages"> -<title>In Mac OS X Panther (10.3), images often fail to load and/or I - experience random delays in page loading. I'm using - <literal>localhost</literal> as my browser's proxy setting.</title> - <para> - We believe this is due to an IPv6-related bug in Mac OS X, but don't fully - understand the issue yet. In any case, changing the proxy setting to - <literal>127.0.0.1</literal> instead of <literal>localhost</literal> - works around the problem. - </para> -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<!-- XXX: Is this still relevant now that we have gzip support? --> -<sect2 renderas="sect3" id="blankpage"> -<title>I get a completely blank page at one site. <quote>View Source</quote> - shows only: <markup><![CDATA[<html><body></body></html>]]></markup>. Without - Privoxy the page loads fine.</title> - <para> - Chances are that the site suffers from a bug in - <ulink url="http://www.php.net/"><application>PHP</application></ulink>, - which results in empty pages being sent if the client explicitly requests - an uncompressed page, like <application>Privoxy</application> does. - This bug has been fixed in PHP 4.2.3. - </para> - <para> - To find out if this is in fact the source of the problem, try adding - the site to a <literal>-prevent-compression</literal> section in - <filename>user.action</filename>: - </para> - <screen> - # Make exceptions for ill-behaved sites: - # - {-prevent-compression} - .example.com</screen> - <para> - If that works, you may also want to report the problem to the - site's webmasters, telling them to use zlib.output_compression - instead of ob_gzhandler in their PHP applications (workaround) - or upgrade to PHP 4.2.3 or later (fix). - </para> -</sect2> - -<sect2 renderas="sect3" id="nohostname"> -<title>My logs show many <quote>Unable to get my own hostname</quote> lines. -Why?</title> -<para> - <application>Privoxy</application> tries to get the hostname of the system - its running on from the IP address of the system interface it is bound to - (from the <filename>config</filename> file - <emphasis>listen-address</emphasis> setting). If the system cannot supply - this information, <application>Privoxy</application> logs this condition. -</para> -<para> - Typically, this would be considered a minor system configuration error. It is - not a fatal error to <application>Privoxy</application> however, but may - result in a much slower response from <application>Privoxy</application> on - some platforms due to DNS timeouts. -</para> -<para> - This can be caused by a problem with the local <filename>hosts</filename> - file. If this file has been changed from the original, try reverting it to - see if that helps. Make sure whatever name(s) are used for the local system, - that they resolve both ways. -</para> -<para> - You should also be able to work around the problem with the - <ulink url="../user-manual/config.html#HOSTNAME">hostname option</ulink>. -</para> -</sect2> - -<sect2 renderas="sect3" id="inuse"> -<title>When I try to launch Privoxy, I get an -error message <quote>port 8118 is already in use</quote> (or similar wording). -Why?</title> -<para> - Port 8118 is <application>Privoxy's</application> default TCP - <quote>listening</quote> port. Typically this message would mean that there - is already one instance of <application>Privoxy</application> running, and - your system is actually trying to start a second - <application>Privoxy</application> on the same port, which will not work. - (You can have multiple instances but they must be assigned different ports.) - How and why this might happen varies from platform to platform, but you need - to check your installation and start-up procedures. -</para> -</sect2> - -<sect2 renderas="sect3" id="demoronizer"> -<title> - Pages with UTF-8 fonts are garbled. -</title> -<para> - This is caused by the <quote>demoronizer</quote> filter. You should either - upgrade <application>Privoxy</application>, or at least upgrade to the most - recent <filename>default.action</filename> file available from <ulink - url="http://sourceforge.net/project/showfiles.php?group_id=11118%22%3ESourceForge</ulink>. - Or you can simply disable the demoronizer filter. -</para> -</sect2> - -<sect2 renderas="sect3" id="demoronizer2"> -<title> - Why are binary files (such as images) corrupted when Privoxy - is used? -</title> -<para> - This may also be caused by the <quote>demoronizer</quote> filter, - in conjunction with a web server that is misreporting the content type. Binary - files are exempted from <application>Privoxy's</application> filtering - (unless the web server by mistake says the file is something else). Either - upgrade <application>Privoxy</application>, or go to the most recent - <filename>default.action</filename> file available from <ulink - url="http://sourceforge.net/project/showfiles.php?group_id=11118%22%3ESourceForge</ulink>. -</para> -</sect2> - -<sect2 renderas="sect3" id="demoronizer3"> -<title> - What is the <quote>demoronizer</quote> and why is it there? -</title> -<para> - The original demoronizer was a Perl script that cleaned up HTML pages which - were created with certain Microsoft products. MS has used proprietary extensions - to standardized font encodings (ISO 8859-1), which has caused problems for pages - that are viewed with non-Microsoft products (and are expecting to see a - standard set of fonts). The demoronizer corrected these errors so the pages - displayed correctly. <application>Privoxy</application> borrowed from this - script, introducing a filter based on the original demoronizer, which in turn could - correct these errors on the fly. -</para> -<para> - But this is only needed in some situations, and will cause serious problems in some - other situations. -</para> -<para> - If you are using Microsoft products, you do not need it. If you need to view - pages with UTF-8 characters (such as Cyrillic or Chinese), then it will - cause corruption of the fonts, and thus <emphasis>should not be on</emphasis>. -</para> -<para> - On the other hand, if you use non-Microsoft products, and you occasionally - notice weird characters on pages, you might want to try it. -</para> -</sect2> - -<sect2 renderas="sect3" id="windowopen"> -<title> - Why do I keep seeing <quote>PrivoxyWindowOpen()</quote> in raw source code? -</title> -<para> - <application>Privoxy</application> is attempting to disable malicious - <ulink url="http://en.wikipedia.org/wiki/Javascript">Javascript</ulink> - in this case, with the <literal>unsolicited-popups</literal> - filter. <application>Privoxy</application> cannot tell very well - <quote>good</quote> code snippets from <quote>bad</quote> code snippets. -</para> -<para> - If you see this in HTML source, and the page displays without problems, then - this is good, and likely some pop-up window was disabled. If you see this - where it is causing a problem, such as a downloaded program source code file, - then you should set an exception for this site or page such that the - integrity of the page stays in tact by disabling all filtering. -</para> -</sect2> - -<sect2 renderas="sect3" id="dnserrors"> -<title> - I am getting too many DNS errors like <quote>404 No Such Domain</quote>. Why - can't Privoxy do this better? -</title> -<para> - There are potentially several factors here. First of all, the DNS resolution - is done by the underlying operating system -- not - <application>Privoxy</application> itself. <application>Privoxy</application> - merely initiates the process and hands it off, and then later reports - whatever the outcome was and tries to give a coherent message if there seems - to be a problem. In some cases, this might otherwise be mitigated by the - browser itself which might try some work-arounds and alternate approaches (e.g - adding <quote>www.</quote> to the URL). -</para> -<para> - In other cases, if <application>Privoxy</application> is being chained - with another proxy, this could complicate the issue, and cause undue - delays and timeouts. In the case of a <quote>socks4a</quote> proxy, the socks - server handles all the DNS. <application>Privoxy</application> would just be - the <quote>messenger</quote> which is reporting whatever problem occurred - downstream, and not the root cause of the error. -</para> -<![%p-newstuff;[ -<para> - In any case, versions newer than 3.0.3 include various improvements to help - <application>Privoxy</application> better handle these cases. -</para>]]> -</sect2> - -<sect2 renderas="sect3" id="allcpu"> -<title> - At one site Privoxy just hangs, and starts taking - all CPU. Why is this? -</title> -<para> - This is probably a manifestation of the <quote>100% cpu</quote> problem that - occurs on pages containing many (thousands upon thousands) of blank lines. The blank lines - are in the raw HTML source of the page, and the browser just ignores them. But the - pattern matching in <application>Privoxy's</application> page filtering - mechanism is trying to match against absurdly long strings and this becomes - very CPU-intensive, taking a long, long time to complete. -</para> -<para> - Until a better solution comes along, disable filtering on these pages, - particularly the <literal>js-annoyances</literal> and - <literal>unsolicited-popups</literal> filters. If you run into this problem - with a recent &my-app; version, please send a problem report. -</para> -</sect2> - -<sect2 renderas="sect3" id="slowcrawl"> -<title>I just installed Privoxy, and all my -browsing has slowed to a crawl. What gives? </title> -<para> - This should not happen, and for the overwhelming number of users world-wide, - it does not happen. I would suspect some inadvertent interaction of software - components such as anti-virus software, spyware protectors, personal - firewalls or similar components. Try disabling (or uninstalling) these one - at a time and see if that helps. Either way, if you are using a - recent &my-app; version, please report the problem. -</para> -</sect2> - -<sect2 renderas="sect3" id="preventcomp"> -<title>Why do my filters work on some sites but not on others? </title> -<para> - It's probably due to compression. It is a common practice for web servers to - send their content <quote>compressed</quote> in order to speed things up, and - then let the browser <quote>uncompress</quote> them. When compiled with zlib support - &my-app; can decompress content before filtering, otherwise you may want to enable -<ulink - url="../user-manual/actions-file.html#PREVENT-COMPRESSION">prevent-compression</ulink>. -</para> -<para> - As of &my-app; 3.0.9, zlib support is enabled in the default builds. -</para> -</sect2> - - -<sect2 renderas="sect3" id="ssl-warnings"> -<title>On some HTTPS sites my browser warns me about unauthenticated content, - the URL bar doesn't get highlighted and the lock symbol appears to be broken. - What's going on?</title> -<para> - Probably the browser is requesting ads through HTTPS and &my-app; - is blocking the requests. Privoxy's error messages are delivered - unencrypted and while it's obvious for the browser that the HTTPS - request is already blocked by the proxy, some warn about unauthenticated - content anyway. -</para> -<para> - To work around the problem you can redirect those requests to an invalid - local address instead of blocking them. While the redirects aren't - encrypted either, many browsers don't care. They simply follow the - redirect, fail to reach a server and display an error message instead - of the ad. -</para> -<para> - To do that, enable logging to figure out which requests get blocked by - &my-app; and add the hosts (no path patterns) to a section like this: -</para> -<para> -<screen> -<![CDATA[ -{+redirect{http://127.0.0.1:0/} -block -limit-connect} -.ivwbox.de:443/ -]]> -</screen> -</para> -<para> - Additionally you have to configure your browser to contact - <quote>127.0.0.1:0</quote> directly (instead of through &my-app;). -</para> -<para> - To add a proxy exception in <application>Mozilla Firefox</application> - open the <quote>Preferences</quote>, click the <quote>Settings</quote> - button located on the <quote>Network</quote> tab in the <quote>Advanced</quote> - section, and add <quote>127.0.0.1:0</quote> in the <quote>No Proxy for:</quote> - field. -</para> -</sect2> - - -<sect2 renderas="sect3" id="se-linux"> -<title>I get selinux error messages. How can I fix this?</title> -<para> - Please report the problem to the creator of your selinux policies. -</para> -<para> - The problem is that some selinux policy writers aren't familiar - with the application they are trying to <quote>secure</quote> and - thus create policies that make no sense. -</para> -<para> - In <application>Privoxy's</application> case the problem usually - is that the policy only allows outgoing connections for certain - destination ports (e.g. 80 and 443). While this may cover the - standard ports, websites occasionally use other ports as well. - This isn't a security problem and therefore <application>Privoxy's</application> - default configuration doesn't block these requests. -</para> -<para> - If you really want to block these ports (and don't be able - to load websites that don't use standard ports), you should - configure Privoxy to block these ports as well, so it doesn't - trigger the selinux warnings. -</para> -</sect2> - - -<sect2 renderas="sect3" id="gentoo-ricers"> -<title>I compiled &my-app; with Gentoo's portage and it appears to be very slow. Why?</title> -<para> - Probably you unintentionally compiled &my-app; without threading support - in which case requests have to be serialized and only one can be served - at the same time. -</para> -<para> - Check your <quote>USE</quote> flags and make sure they include - <quote>threads</quote>. If they don't, add the flag and rebuild &my-app;. -</para> -<para> - If you compiled &my-app; with threading support (on POSIX-based systems), - the <quote>Conditional #defines</quote> section on <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink> - will list <quote>FEATURE_PTHREAD</quote> as <quote>enabled</quote>. -</para> -</sect2> - - -</sect1> - - <!-- ~~~~~ New section ~~~~~ --> - <sect1 id="contact"><title>Contacting the developers, Bug Reporting and Feature Requests</title> -<!-- Include contacting.sgml --> - &contacting; -<!-- end contacting --> - </sect1> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="copyright"><title>Privoxy Copyright, License and History</title> - - <!-- Include copyright.sgml --> - ©right; - <!-- end --> - - - <para> - Portions of this document are <quote>borrowed</quote> from the original - <application>Junkbuster</application> (tm) FAQ, and modified as - appropriate for <application>Privoxy</application>. - </para> - - <!-- ~~~~~ New section ~~~~~ --> - <sect2><title>License</title> - <!-- Include copyright.sgml: --> - &license; - <!-- end copyright --> - </sect2> - <!-- ~ End section ~ --> - - <!-- ~~~~~ New section ~~~~~ --> - <sect2><title>History</title> - <!-- Include history.sgml --> - &history; - <!-- end --> - </sect2> - - </sect1> - <!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<!-- -<sect1 id="seealso"><title>See also</title> ---> -<!-- Include seealso.sgml --> -<!-- - &see; ---> -<!-- end --> -<!-- -</sect1> ---> - -<!-- hhmts end --> - <!-- - Tue 09/11/01 06:38:14 PM EST: Test SGML doc by Hal Burgiss. - - 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., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -$Log: faq.sgml,v $ -Revision 2.58 2009/03/21 12:27:44 fabiankeil -Turn the donation entry title into a question, -also rephrase the content a bit. - -Revision 2.57 2009/03/19 19:07:49 fabiankeil -First draft of a "Donating" entry. To be polished tomorrow. - -Revision 2.56 2009/02/19 17:05:05 fabiankeil -Explain slowness when build with Gentoo's portage. - -Revision 2.55 2009/02/19 02:20:21 hal9 -Make some links in seealso conditional. Man page is now privoxy only links. - -Revision 2.54 2009/02/15 20:47:12 hal9 -Fix small typo. - -Revision 2.53 2009/02/15 20:46:13 hal9 -Update Outlook HTML rendering engine comments re: Office 2007. - -Revision 2.52 2009/02/14 10:27:52 fabiankeil -Finish last paragraph in the selinux entry which -I unintentionally committed with the last commit. - -Revision 2.51 2009/02/12 16:08:26 fabiankeil -Declare the code stable. - -Revision 2.50 2009/02/11 18:13:36 fabiankeil -State the obvious. - -Revision 2.49 2009/02/10 16:30:20 fabiankeil -Add a workaround for "unauthenticated content" warnings on HTTPS sites. - -Revision 2.48 2009/01/13 16:50:35 fabiankeil -The standard.action file is gone. - -Revision 2.47 2008/11/24 18:29:39 fabiankeil -Two changes suggested by Roger Dingledine: -- Use https://www.torproject.org/ in section 4.7, too. -- Replace the Tor wiki URL in section 4.10 with one - with a more useful anchor name. - -Revision 2.46 2008/08/30 15:37:35 fabiankeil -Update entities. - -Revision 2.45 2008/08/16 08:51:28 fabiankeil -Update version-related entities. - -Revision 2.44 2008/06/19 01:41:36 hal9 -Add short note about zlib being enabled in 3.0.9 - -Revision 2.43 2008/06/14 13:21:25 fabiankeil -Prepare for the upcoming 3.0.9 beta release. - -Revision 2.42 2008/06/07 13:11:15 fabiankeil -- Note that the "100% cpu problem" is worth - reporting if it happens with a recent release. -- Mention the hostname option as a workaround for - the "can't get my own hostname" issue. -- The profile formerly known as "Adventuresome" - is called "Advanced" now. -- Some white-space fixes. - -Revision 2.41 2008/06/06 15:32:09 fabiankeil -- Minor rewordings. -- Don't claim that all the old Junkbuster features remain. - Some of them have been removed or replaced with better ones. - -Revision 2.40 2008/02/22 05:54:27 markm68k -updates for mac os x - -Revision 2.39 2008/02/03 21:37:41 hal9 -Apply patch from Mark: s/OSX/OS X/ - -Revision 2.38 2008/01/19 17:52:39 hal9 -Re-commit to fix various minor issues for new release. - -Revision 2.37 2008/01/19 15:03:05 hal9 -Doc sources tagged for 3.0.8 release. - -Revision 2.36 2008/01/17 01:49:51 hal9 -Change copyright notice for docs s/2007/2008/. All these will be rebuilt soon -enough. - -Revision 2.35 2007/11/19 17:57:59 fabiankeil -A bunch of rewordings, minor updates and fixes. - -Revision 2.34 2007/11/19 02:38:11 hal9 -Minor revisions and rebuild - -Revision 2.33 2007/11/15 03:30:20 hal9 -Results of spell check. - -Revision 2.32 2007/11/13 03:03:42 hal9 -Various changes to reflect new features and revised configuration for the -upcoming release. - -Revision 2.31 2007/11/05 02:34:53 hal9 -Various changes in preparation for the upcoming release. Much yet to be done. - -Revision 2.30 2007/11/04 15:16:40 hal9 -Fix one silly typo. - -Revision 2.29 2007/11/04 15:12:47 hal9 -Various minor adjustments. - -Revision 2.28 2007/10/27 15:14:16 fabiankeil -Change Tor links to use the new domain torproject.org. - -Revision 2.27 2007/10/22 19:47:05 fabiankeil -- Bump version and copyright. -- Adjust Tor section to make it clear that forward exceptions - aren't required and may not even be desired. -- A bunch of other minor rewordings. -- Fix markup problems Roland noticed (hopefully without adding new ones). - -Revision 2.26 2007/08/05 15:37:55 fabiankeil -- Don't claim that thousands of people read our code. -- Specify the GPL version and link to GPLv2 instead of v3. -- Note that configuration syntax may change between releases. -- Mention zlib support. -- Answer the "transparent proxy" question properly. -- Add "intercepting proxy" entry. -- Mention Polipo. -- Rephrase some other sentences for various reasons. - -Revision 2.25 2007/07/18 11:00:34 hal9 -Add misc note about valid mark-up in Privoxy. - -Revision 2.24 2006/11/14 01:57:46 hal9 -Dump all docs prior to 3.0.6 release. Various minor changes to faq and user -manual. - -Revision 2.23 2006/10/21 22:19:52 hal9 -Two new FAQs, a rewrite or two, and some touch ups. - -Revision 2.22 2006/10/14 20:33:10 hal9 -Three new FAQ's re: templates and blocking, and various minor touch-ups/improvements. - -Revision 2.21 2006/10/03 14:40:51 fabiankeil -Added links from the Tor faq to the -configuration chapter in the User Manual. - -Revision 2.20 2006/09/26 10:12:37 fabiankeil -Spelling fix. - -Revision 2.19 2006/09/22 10:54:32 hal9 -Change references to 3.0.4 to 3.0.5 and minor adjustments. - -Revision 2.18 2006/09/22 01:27:55 hal9 -Final commit of probably various minor changes here and there. Unless -something changes this should be ready for pending release. - -Revision 2.17 2006/09/17 14:56:32 hal9 -This includes yet several more new FAQs, some improved wording, enhanced -mark-up, various hyper links to wikipedia to explain key terminology to the -uninitiated, etc. This is ready for release IMO pending final tagging of cvs -and Privoxy version stamping. - -Revision 2.16 2006/09/10 15:30:46 hal9 -Spell check. - -Revision 2.15 2006/09/08 23:05:07 hal9 -Fix broken links. Add faq on hosts files. Move most of new windows service -feature to user manual and reference in faq. Various other small changes. - -Revision 2.14 2006/09/05 13:25:12 david__schmidt -Add Windows service invocation stuff (duplicated) in FAQ and in user manual under Windows startup. One probably ought to reference the other. - -Revision 2.13 2006/09/04 19:20:33 fabiankeil -Adjusted anonymity related sections to match reality. -Added a section about using Privoxy with Tor. - -Revision 2.12 2006/09/03 14:15:30 hal9 -Various updates, including 7 or 8 new FAQs, and updates/changes to various -other ones to better reflect improvements, additions and changes for the -upcoming release. This is close to final form for 3.0.4 IMHO. - -Revision 2.11 2006/07/18 14:48:50 david__schmidt -Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -with what was really the latest development (the v_3_0_branch branch) - -Revision 1.61.2.41 2004/04/05 13:44:05 oes -Fixed allow-all-cookies alias name; closes SR #929746 - -Revision 1.61.2.40 2004/01/30 17:00:33 oes -Added Mac OS X Panther problem - -Revision 1.61.2.39 2004/01/29 22:53:08 hal9 -Minor changes for exempting docs of text/plain. Change copyright date. - -Revision 1.61.2.38 2003/12/10 03:39:45 hal9 -Added FAQs for: demoronizer, related problems and why its included. Also, -port 8118 already in use questions, and PrivoxyWindowOpen() questions. All in -troubleshooting section. - -Revision 1.61.2.37 2003/10/17 11:01:50 oes -Added Q&A for "not being used" page problem - -Revision 1.61.2.36 2003/06/26 23:49:20 hal9 -More on the filter/source code problem. - -Revision 1.61.2.35 2003/06/26 13:38:08 hal9 -Add FAQ on whether configuring Privoxy is necessary or not. - -Revision 1.61.2.34 2003/06/26 03:00:03 hal9 -Sorry, found another copyright date. - -Revision 1.61.2.33 2003/06/26 02:57:05 hal9 -Fix typo (finally!) and very minor modifications. - -Revision 1.61.2.32 2003/06/26 02:52:04 hal9 -Test, no changes. - -Revision 1.61.2.31 2003/06/25 01:27:51 hal9 -Fix copyright, and a few nits. - -Revision 1.61.2.30 2003/06/25 01:13:52 hal9 -Add: - - - FAQ on "Unable to get my own hostname" - - Another one on filtering effects on text files. - -Revision 1.61.2.29 2003/06/15 21:32:58 hal9 -Add to the 4.17 (filtering effects on downloaded files). - -Revision 1.61.2.28 2003/03/18 19:37:21 oes -s/Advanced|Radical/Adventuresome/g to avoid complaints re fun filter - -Revision 1.61.2.27 2002/12/01 06:31:58 hal9 -Add faq on win32 error 503 due to ZoneAlarm. - -Revision 1.61.2.26 2002/11/17 06:41:06 hal9 -Move default profiles table from FAQ to U-M, and other minor related changes. -Add faq on cookies. - -Revision 1.61.2.25 2002/10/29 03:21:50 hal9 -Add 3 Q/A's relating to HTML in email. Other minor touchups. - -Revision 1.61.2.24 2002/10/15 12:50:22 oes -s/Advanced/Radical/ (stupid me) - -Revision 1.61.2.23 2002/10/15 12:38:56 oes -Added Microsuck faq; more detail for PHP problem - -Revision 1.61.2.22 2002/10/12 01:13:13 hal9 -Updates for demoronizer, more commentary on Radical profile, and update on -the srvany.exe/icon fix. - -Revision 1.61.2.21 2002/10/10 04:09:35 hal9 -s/Advanced/Radical/ and added very brief note. - -Revision 1.61.2.20 2002/09/26 01:22:45 hal9 -Small additions for LAN setup, content-cookies/SSL, and FTP non-support. - -Revision 1.61.2.19 2002/08/25 23:31:56 hal9 -Fix one grammatical error. Add brief FAQ relating to tranparent proxies (ie -port 80 setting). Add FAQ on effects of Privoxy on downloaded files -(especially filtering). - -Revision 1.61.2.18 2002/08/14 16:39:37 hal9 -Fix wrong tag on FAQ addition. - -Revision 1.61.2.17 2002/08/14 00:01:18 hal9 -Add a crunch FAQ. - -Revision 1.61.2.16 2002/08/13 00:10:38 hal9 -Add faq to troubleshooting re: blank page syndrome, ie {-prevent-compression}. - -Revision 1.61.2.15 2002/08/10 11:34:22 oes -Add disclaimer about probably being out-of-date - -Revision 1.61.2.14 2002/08/07 02:53:43 hal9 -Fix some minor markup errors, and move one Mac OS X Q/A to troubleshooting section. - -Revision 1.61.2.13 2002/08/06 11:55:32 oes -Added missing close tag - -Revision 1.61.2.12 2002/08/06 11:43:46 david__schmidt -Updated Mac OS X uninstall FAQ... we have an uninstall script now. - -Revision 1.61.2.11 2002/08/06 08:54:03 oes -Style police: Fixed formatting details - -Revision 1.61.2.10 2002/08/02 14:00:25 david__schmidt -Made the Mac OS X removal commands far less dangerous - -Revision 1.61.2.9 2002/08/02 13:14:45 oes -Added warning about sudo rm -r for Mac OS X deinstallation; moved this item to install section - -Revision 1.61.2.8 2002/08/02 02:01:42 david__schmidt -Add FAQ item for MSIE on Mac OS X HTTP proxy confusion - -Revision 1.61.2.7 2002/08/02 01:46:01 david__schmidt -Added FAQ item for Mac OS X uninstall woes - -Revision 1.61.2.6 2002/07/30 20:04:56 hal9 -Fix typo: 'schould'. - -Revision 1.61.2.5 2002/07/26 15:22:58 oes -- Updated to reflect changes in standard.action -- Added info on where to get updated actions files - -Revision 1.61.2.4 2002/07/25 21:42:29 hal9 -Add brief notes on not proxying non-HTTP protocols. - -Revision 1.61.2.3 2002/06/09 16:36:33 hal9 -Clarifications on filtering and MIME. Hardcode 'latest release' in index.html. - -Revision 1.61.2.2 2002/06/06 02:51:34 hal9 -Fix typo in URL http:/config.privoxy.org - -Revision 1.61.2.1 2002/06/05 23:10:43 hal9 -Add new FAQ re: DUN/IE. Change release date from May to June :) - -Revision 1.61 2002/05/25 12:37:25 hal9 -Various minor changes and edits. - -Revision 1.60 2002/05/22 17:17:48 oes -Proofread & added more links into u-m - -Revision 1.59 2002/05/15 04:03:30 hal9 -Fix ulink -> link markup. - -Revision 1.58 2002/05/10 01:48:20 hal9 -This is mostly proposed copyright/licensing additions and changes. Docs -are still GPL, but licensing and copyright are more visible. Also, copyright -changed in doc header comments (eliminate references to JB except FAQ). - -Revision 1.57 2002/05/05 20:26:02 hal9 -Sorting out license vs copyright in these docs. - -Revision 1.56 2002/05/04 08:44:44 swa -bumped version - -Revision 1.55 2002/05/04 00:41:56 hal9 --Remove TOC/first page kludge in favor of proper handling via dsl file. - -Revision 1.54 2002/05/03 05:06:44 hal9 -Add brief Q/A on transparent proxies. - -Revision 1.53 2002/05/03 01:34:52 hal9 -Fix section numbering for new sections (due to TOC kludge). - -Revision 1.52 2002/04/29 03:08:43 hal9 --Added new Q/A on new actions file set up (pointer to u-m) --Fixed a few broken links and converted old actions as a result of - recent changes. - -Revision 1.51 2002/04/26 17:24:31 swa -bookmarks cleaned, changed structure of user manual, screen and programlisting cleanups, and numerous other changes that I forgot - -Revision 1.50 2002/04/26 05:25:23 hal9 -Mass commit to catch a few scattered fixes. - -Revision 1.49 2002/04/12 10:10:18 swa -version update - -Revision 1.48 2002/04/10 18:45:15 swa -generated - -Revision 1.47 2002/04/10 04:05:32 hal9 -More on BML, etc. - -Revision 1.45 2002/04/08 22:59:26 hal9 -Version update. Spell chkconfig correctly :) - -Revision 1.44 2002/04/07 21:24:29 hal9 -Touch up on name change. - -Revision 1.43 2002/04/04 21:59:53 hal9 -Added NT/W2K service/icon situation. - -Revision 1.42 2002/04/04 18:46:47 swa -consistent look. reuse of copyright, history et. al. - -Revision 1.41 2002/04/04 06:48:37 hal9 -Structural changes to allow for conditional inclusion/exclusion of content -based on entity toggles, e.g. 'entity % p-not-stable "INCLUDE"'. And -definition of internal entities, e.g. 'entity p-version "2.9.13"' that will -eventually be set by Makefile. -More boilerplate text for use across multiple docs. - -Revision 1.40 2002/04/03 04:22:03 hal9 -Fixed several typos. - -Revision 1.39 2002/04/03 03:53:03 hal9 -Revert some changes, and then make some news, to layout, and appearance. - -Revision 1.38 2002/04/02 03:49:10 hal9 -Major changes to doc structure and layout. Sections are not automatically -numbered now. TOC is on page by itself. - -Revision 1.37 2002/04/01 16:24:07 hal9 --Rework of supported Q/A. --Set up entities to include boilerplate text. - -Revision 1.36 2002/03/31 23:18:47 hal9 -More on dealing with BLOCKED. - -Revision 1.35 2002/03/30 04:14:19 hal9 -Fix privoxy.org/config links. - -Revision 1.34 2002/03/29 04:35:56 hal9 -Touch ups. - -Revision 1.33 2002/03/29 01:31:48 hal9 -Several new Q/A's and other touch ups. - -Revision 1.32 2002/03/27 00:57:03 hal9 -Touch ups for name change. - -Revision 1.31 2002/03/26 22:29:55 swa -we have a new homepage! - -Revision 1.30 2002/03/25 16:39:22 hal9 -A few new sections. Made all links relative to user-manual. - -Revision 1.29 2002/03/25 05:23:57 hal9 -Moved section, and touch ups. - -Revision 1.28 2002/03/25 04:27:33 hal9 -New section related to name change. - -Revision 1.25 2002/03/24 16:08:08 swa -we are too lazy to make a block-built -privoxy logo. hence removed the option. - -Revision 1.24 2002/03/24 15:46:20 swa -name change related issue. - -Revision 1.23 2002/03/24 12:33:01 swa -more additions. - -Revision 1.22 2002/03/24 11:51:00 swa -name change. changed filenames. - -Revision 1.21 2002/03/24 11:01:06 swa -name change - -Revision 1.20 2002/03/23 15:13:11 swa -renamed every reference to the old name with foobar. -fixed "application foobar application" tag, fixed -"the foobar" with "foobar". left junkbustser in cvs -comments and remarks to history untouched. - -Revision 1.19 2002/03/21 17:01:54 hal9 -Some touch ups. - -Revision 1.18 2002/03/18 16:40:31 hal9 -More additions. - -Revision 1.17 2002/03/18 03:53:53 hal9 -Some new additions. - -Revision 1.16 2002/03/17 21:32:56 hal9 -A few more additions. - -Revision 1.15 2002/03/17 07:25:59 hal9 -Correcting some of my typos, and some additions. - -Revision 1.14 2002/03/17 02:39:13 hal9 -A little more added ... - -Revision 1.13 2002/03/17 00:22:20 hal9 -Adding new stuff, and trying to incorporate stuff from old faq. - -Revision 1.12 2002/03/11 20:13:21 swa -typo - -Revision 1.11 2002/03/11 18:42:27 swa -new section - -Revision 1.10 2002/03/11 13:13:27 swa -correct feedback channels - -Revision 1.9 2002/03/10 23:34:04 swa -more info on not hiding ip address - -Revision 1.8 2002/03/09 15:55:48 swa -added default config section - -Revision 1.7 2002/03/07 18:16:55 swa -looks better - -Revision 1.6 2002/03/07 13:16:31 oes -Committing changes by Stefan - -Revision 1.5 2002/03/02 15:50:04 swa -2.9.11 version. more input for docs. - -Revision 1.4 2002/02/24 14:34:24 jongfoster -Formatting changes. Now changing the doctype to DocBook XML 4.1 -will work - no other changes are needed. - -Revision 1.3 2001/09/23 10:13:48 swa -upload process established. run make webserver and -the documentation is moved to the webserver. documents -are now linked correctly. - -Revision 1.2 2001/09/13 15:20:17 swa -merged standards into developer manual - -Revision 1.1 2001/09/12 15:36:41 swa -source files for junkbuster documentation - -Revision 1.3 2001/09/10 17:43:59 swa -first proposal of a structure. - -Revision 1.2 2001/06/13 14:28:31 swa -docs should have an author. - -Revision 1.1 2001/06/13 14:20:37 swa -first import of project's documentation for the webserver. - ---> - -</article> diff --git a/external/privoxy/doc/source/history.sgml b/external/privoxy/doc/source/history.sgml deleted file mode 100644 index 9e8b2fa..0000000 --- a/external/privoxy/doc/source/history.sgml +++ /dev/null @@ -1,71 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/history.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: history.sgml,v 2.7 2009/02/22 11:05:21 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - user-manual - developer-manual - faq - webserver/index.sgml - ---> - -<para> - A long time ago, there was the - <ulink url="http://www.junkbusters.com/ijb.html"><application>Internet Junkbuster</application></ulink>, - by Anonymous Coders and <ulink url="http://www.junkbusters.com/">Junkbusters - Corporation</ulink>. This saved many users a lot of pain in the early days of - web advertising and user tracking. -</para> - -<para> - But the web, its protocols and standards, and with it, the techniques for - forcing ads on users, give up autonomy over their browsing, and - for tracking them, keeps evolving. Unfortunately, the <application>Internet - Junkbuster</application> did not. Version 2.0.2, published in 1998, was - (and is) the last official - <ulink url="http://www.junkbusters.com/ijbdist.html#release">release</ulink> - available from <ulink url="http://www.junkbusters.com">Junkbusters Corporation</ulink>. - Fortunately, it had been released under the GNU - <ulink url="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GPL</ulink>, - which allowed further development by others. -</para> - -<para> - So Stefan Waldherr started maintaining an improved version of the - software, to which eventually a number of people contributed patches. - It could already replace banners with a transparent image, and had a first - version of pop-up killing, but it was still very closely based on the - original, with all its limitations, such as the lack of HTTP/1.1 support, - flexible per-site configuration, or content modification. The last release - from this effort was version 2.0.2-10, published in 2000. -</para> - -<para> - Then, some - <ulink url="http://www.privoxy.org/user-manual/copyright.html#AUTHORS">developers</ulink> - picked up the thread, and started turning the software inside out, upside down, - and then reassembled it, adding many - <ulink url="http://www.privoxy.org/user-manual/introduction.html#FEATURES">new - features</ulink> along the way. -</para> - -<para> - The result of this is <application>Privoxy</application>, whose first - stable version, 3.0, was released August, 2002. - <!-- Cautious!!!!!!!!! ;) --> -</para> diff --git a/external/privoxy/doc/source/install.sgml b/external/privoxy/doc/source/install.sgml deleted file mode 100644 index bba9ccc..0000000 --- a/external/privoxy/doc/source/install.sgml +++ /dev/null @@ -1,106 +0,0 @@ -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ -<!entity % dummy "IGNORE"> -<!entity buildsource SYSTEM "buildsource.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-stable "INCLUDE"> -<!entity % p-not-stable "IGNORE"> -<!entity % p-alpha "IGNORE"> -<!entity % p-beta "IGNORE"> -<!entity % p-text "INCLUDE"> <!-- define we are a text only doc --> -<!entity % p-doc "IGNORE"> <!-- and never a text doc --> -<!entity % p-readme "INCLUDE"> <!-- This is now in INSTALL --> -]> -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/install.sgml,v $ - - Purpose : INSTALL file for Privoxy - - $Id: install.sgml,v 2.11 2009/02/12 16:08:26 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. You have been warned! - Failure to abide by this rule will result in the revocation of your license - to live a peaceful existence! - ======================================================================== - - =================================================================== - READ: Document Note: This file generates the INSTALL file in the top level - source directory. It is generated as only a plain text file. The current - markup is not suitable for other formats. Build from Makefile with 'make - dok-readme'. - =================================================================== - ---> -<article id="index"> -<artheader> -<![%dummy;[ - <para> - <comment> - This is here to keep vim syntax file from breaking :/ - If I knew enough to fix it, I would. - PLEASE DO NOT REMOVE! HB: hal@foobox.net - </comment> - </para> -]]> -<abstract> -<para> - <literal> - <msgtext> - <literallayout> -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/doc/source/install.sgml,v $ - * - * Purpose : INSTALL file to help with installing from source. - * - * Copyright : Written by and Copyright (C) 2001-2009 the - * 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/licenses/old-licenses/gpl-2.0.html - * or write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA - * - *********************************************************************/ - </literallayout> - </msgtext> - </literal> -</para> - - </abstract> -</artheader> - -<para> - <msgtext> -<!-- ~~~~~ New section ~~~~~ --> -<!-- include buildsource.sgml boilerplate: --> - &buildsource; -<!-- end boilderplate --> - </msgtext> -</para> - - -</article> diff --git a/external/privoxy/doc/source/ldp.dsl.in b/external/privoxy/doc/source/ldp.dsl.in deleted file mode 100644 index a86de0d..0000000 --- a/external/privoxy/doc/source/ldp.dsl.in +++ /dev/null @@ -1,420 +0,0 @@ -<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [ -<!ENTITY % html "IGNORE"> -<![%html;[ -<!ENTITY % print "IGNORE"> -<!ENTITY docbook.dsl SYSTEM "@DKPREFIX@/html/docbook.dsl" CDATA dsssl> -]]> -<!ENTITY % print "INCLUDE"> -<![%print;[ -<!ENTITY docbook.dsl SYSTEM "@DKPREFIX@/print/docbook.dsl" CDATA dsssl> -]]> -]> - -<!-- - -;; borrowed from the LDP stylesheet, with modifications, HB. -;; Added support for css 03/20/02, and other mods. - ---> - -<style-sheet> - -<style-specification id="print" use="docbook"> -<style-specification-body> - -;; ============================== -;; customize the print stylesheet -;; ============================== -;; -;; see http://docbook.sourceforge.net/projects/dsssl/doc/print.html -;; - -(define %indent-screen-lines% - ;; Indent lines in a 'Screen'? - #t) - -(define %callout-fancy-bug% - ;; Use fancy callout bugs? - #t) - -(define %chap-app-running-heads% - ;; Generate running headers and footers on chapter-level elements? - #t) - -(define %chap-app-running-head-autolabel% - ;; Put chapter labels in running heads? - #t) - -;; 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 %shade-verbatim% -;; #t) - -(define %section-autolabel% #t) - ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.) - -;; 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) - -;; swa1 - -(define %generate-part-toc% - #f) - -(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 %generate-part-toc-on-titlepage% - ;; Should the Part TOC appear on the Part title page? - #f) - -;;Do you want a separate page for the title? -(define %generate-article-titlepage-on-separate-page% - #t) - -;;Do you want the article toc on the titlepage or separate? -(define %generate-article-toc-on-titlepage% - #f) - -;;Titlepage Separate? -;; This is the one that makes TOC only on first page!! hal. -(define (chunk-skip-first-element-list) - '()) - -(define %body-start-indent% - ;; Default indent of body text - 2pi) - -(define %para-indent-firstpara% - ;; First line start-indent for the first paragraph - 0pt) - -;; swa2 - -(define %para-indent% - ;; First line start-indent for paragraphs (other than the first) - 0pt) - -(define %block-start-indent% - ;; Extra start-indent for block-elements - 2pt) - -;;Define distance between paragraphs -(define %para-sep% - (/ %bf-size% 2.0)) - -;; with swa2 no effects - -;; swa3 - -;;Define distance between block elements (figures, tables, etc.). -(define %block-sep% - (* %para-sep% 1.0)) -;; (* %para-sep% 2.0)) - -(define %hyphenation% - ;; Allow automatic hyphenation? - #t) - -(define %left-margin% 5pi) -(define %right-margin% 5pi) -(define %top-margin% 5pi) -(define %bottom-margin% 5pi) -(define %footer-margin% 2pi) -(define %header-margin% 2pi) - -(define %line-spacing-factor% 1.3) - ;; Factor used to calculate leading - ;; The leading is calculated by multiplying the current font size by the - ;; '%line-spacing-factor%'. For example, if the font size is 10pt and - ;; the '%line-spacing-factor%' is 1.1, then the text will be - ;; printed "10-on-11". - -(define %head-before-factor% - ;; Factor used to calculate space above a title - ;; The space before a title is calculated by multiplying the font size - ;; used in the title by the '%head-before-factor%'. -;; 0.75) - 0.5) - -(define %head-after-factor% - ;; Factor used to calculate space below a title - ;; The space after a title is calculated by multiplying the font size used - ;; in the title by the '%head-after-factor%'. - 0.5) - -(define %input-whitespace-treatment% 'collapse) - -(define ($generate-article-lot-list$) - ;; Which Lists of Titles should be produced for Articles? - (list )) - - -</style-specification-body> -</style-specification> - - -<!-- -;; =================================================== -;; customize the html stylesheet; borrowed from Cygnus -;; at http://sourceware.cygnus.com/ (cygnus-both.dsl) -;; =================================================== ---> - -<style-specification id="html" use="docbook"> -<style-specification-body> - -;; 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) - -;; HB added next three statements 05/03/02. -;;Do you want a separate page for the title? -(define %generate-article-titlepage-on-separate-page% - #t) - -;;Do you want the article toc on the titlepage or separate? -(define %generate-article-toc-on-titlepage% - #t) - -;;Titlepage Separate? -;; This is the one that makes TOC only on first page!! hal. -(define (chunk-skip-first-element-list) - '()) - -(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% #t) - ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.) - -;; 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) - -;; HB added 2008-01-19 -(define %html-header-tags% - '(("META" ("HTTP-EQUIV" "Content-Type") ("CONTENT" "text/html; -charset=ISO-8859-1")))) - -</style-specification-body> -</style-specification> - - -<style-specification id="html-notoc" use="html"> -<style-specification-body> - -;; =================================================== -;; Vairant without TOC for the Homepage --oes 24/05/02 -;; =================================================== - -(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'. - #f) - -</style-specification-body> -</style-specification> - -<external-specification id="docbook" document="docbook.dsl"> - -</style-sheet> diff --git a/external/privoxy/doc/source/license.sgml b/external/privoxy/doc/source/license.sgml deleted file mode 100644 index b674770..0000000 --- a/external/privoxy/doc/source/license.sgml +++ /dev/null @@ -1,50 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/license.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: license.sgml,v 2.6 2008/05/23 15:09:48 fabiankeil Exp $ - - Copyright (C) 2001-2008 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - privoxy-man-page - user-manual - developer-manual - faq - webserver/index.sgml - ---> - -<para> - <application>Privoxy</application> is free software; you can - redistribute it and/or modify it under the terms of the - <citetitle>GNU General Public License</citetitle>, version 2, - as published by the Free Software Foundation. -</para> - -<para> - This program is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the <ulink - url="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html%22%3E - <citetitle>GNU General Public License</citetitle></ulink> for details. -</para> - -<para> - You should have received a copy of the <citetitle>GNU GPL</citetitle> - along with this program; if not, write to the <address> Free Software - Foundation, Inc. <street>51 Franklin Street, Fifth Floor</street> - <city>Boston</city>, <state>MA</state> <postcode>02110-1301</postcode> - <country>USA</country> </address> -</para> - diff --git a/external/privoxy/doc/source/newfeatures.sgml b/external/privoxy/doc/source/newfeatures.sgml deleted file mode 100644 index b1db531..0000000 --- a/external/privoxy/doc/source/newfeatures.sgml +++ /dev/null @@ -1,156 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/newfeatures.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: newfeatures.sgml,v 2.10 2009/02/14 17:37:13 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - user-manual - faq - ---> -<para> - <itemizedlist> - -<!-- - <listitem> - <para> - FIXME: complete the list of features. change the order: most important - features to the top of the list. prefix new features with "NEW". - </para> - </listitem> ---> - <listitem> - <para> - Can keep outgoing connections alive and reuse them later on. - </para> - </listitem> - - <listitem> - <para> - Supports tagging which allows to change the behaviour - based on client and server headers. - </para> - </listitem> - - <listitem> - <para> - Can be run as an "intercepting" proxy, which obviates the need to - configure browsers individually. - </para> - </listitem> - - <listitem> - <para> - Sophisticated actions and filters for manipulating both server and client - headers. - </para> - </listitem> - - <listitem> - <para> - Can be chained with other proxies. - </para> - </listitem> - - <listitem> - <para> - Integrated browser based configuration and control utility at <ulink - url="http://config.privoxy.org/%22%3Ehttp://config.privoxy.org/</ulink> - (shortcut: <ulink url="http://p.p/">http://p.p/</ulink>). Browser-based - tracing of rule and filter effects. Remote toggling. - </para> - </listitem> - - <listitem> - <para> - Web page filtering (text replacements, removes banners based on size, - invisible <quote>web-bugs</quote>, JavaScript and HTML annoyances, - pop-up windows, etc.) - </para> - </listitem> - - <listitem> - <para> - Modularized configuration that allows for standard settings and - user settings to reside in separate files, so that installing updated - actions files won't overwrite individual user settings. - </para> - </listitem> - - <listitem> - <para> - Support for Perl Compatible Regular Expressions in the configuration files, and - a more sophisticated and flexible configuration syntax. - </para> - </listitem> - - <listitem> - <para> - Improved cookie management features (e.g. session based cookies). - </para> -</listitem> - - <listitem> - <para> - GIF de-animation. - </para> - </listitem> - - <listitem> - <para> - Bypass many click-tracking scripts (avoids script redirection). - </para> - </listitem> - - <listitem> - <para> - Multi-threaded (POSIX and native threads). - </para> - </listitem> - - <listitem> - <para> - User-customizable HTML templates for most proxy-generated pages (e.g. "blocked" page). - </para> - </listitem> - - <listitem> - <para> - Auto-detection and re-reading of config file changes. - </para> - </listitem> - - <listitem> - <para> - Improved signal handling, and a true daemon mode (Unix). - </para> -</listitem> - - <listitem> - <para> - Every feature now controllable on a per-site or per-location basis, configuration - more powerful and versatile over-all. - </para> -</listitem> - - <listitem> - <para> - Many smaller new features added, limitations and bugs removed. - </para> -</listitem> - - </itemizedlist> -</para> diff --git a/external/privoxy/doc/source/p-authors.sgml b/external/privoxy/doc/source/p-authors.sgml deleted file mode 100644 index b8eb1ca..0000000 --- a/external/privoxy/doc/source/p-authors.sgml +++ /dev/null @@ -1,159 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/p-authors.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: p-authors.sgml,v 2.34 2009/02/08 18:13:26 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - privoxy-man-page - AUTHORS - user-manual - ---> -<![%p-authors-formal;[ -<para> -Current Privoxy Team: -</para> -]]> - -<literallayout> - Fabian Keil, lead developer - David Schmidt, developer -<![%p-authors-formal;[ -]]> - - Hal Burgiss - Mark Miller - Gerry Murphy - Lee Rian - Roland Rosenfeld - Jörg Strohmayer -<![%p-authors-formal;[ -</literallayout> - -<para> - Former Privoxy Team Members: -</para> - -<literallayout> - Johny Agotnes - Rodrigo Barbosa - Moritz Barsnick - Ian Cummings - Brian Dessent - Jon Foster - Karsten Hopp - Alexander Lazic - Daniel Leite - Gábor Lipták - Adam Lock - Guy Laroche - Justin McMurtry - Andreas Oesterhelt - Haroon Rafique - Georg Sauthoff - Thomas Steudten - Rodney Stromlund - Sviatoslav Sviridov - Sarantis Paskalis - Stefan Waldherr -]]> -</literallayout> -<![%p-authors-formal;[ -<para> - Thanks to the many people who have tested Privoxy, reported bugs, provided - patches, made suggestions or contributed in some way. These include (in - alphabetical order): -</para> -<literallayout> - Ken Arromdee - Devin Bayer - Gergely Bor - Reiner Buehl - Andrew J. Caines - Clifford Caoile - Frédéric Crozat - Michael T. Davis - Mattes Dolak - Matthias Drochner - Peter E. - Florian Effenberger - Markus Elfring - Dean Gaudet - Stephen Gildea - Daniel Griscom - Felix Gröbert - Aaron Hamid - Darel Henman - Magnus Holmgren - Eric M. Hopper - Ralf Horstmann - Stefan Huehner - Peter Hyman - Derek Jennings - Petr Kadlec - David Laight - Bert van Leeuwen - Don Libes - Paul Lieverse - Toby Lyward - Wil Mahan - Jindrich Makovicka - David Mediavilla - Raphael Moll - Amuro Namie - Adam Piggott - Dan Price - Roberto Ragusa - Félix Rauch - Maynard Riley - Chung-chieh Shan - Spinor S. - Bart Schelstraete - Oliver Stoeneberg - Peter Thoenen - Martin Thomas - Bobby G. Vinyard - Jochen Voss - Glenn Washburn - Song Weijia - Jörg Weinmann - Darren Wiebe - Anduin Withers - Oliver Yeoh - Jamie Zawinski -</literallayout> - -<para> - Privoxy is based in part on code originally developed by - Junkbusters Corp. and Anonymous Coders. -</para> - -<para> - Privoxy heavily relies on Philip Hazel's PCRE. -</para> - -<para> - The code to filter compressed content makes use of zlib - which is written by Jean-loup Gailly and Mark Adler. -</para> - -<para> - On systems that lack snprintf(), Privoxy is using a version - written by Mark Martinec. On systems that lack strptime(), - Privoxy is using the one from the GNU C Library written - by Ulrich Drepper. -</para> -]]> diff --git a/external/privoxy/doc/source/p-config.sgml b/external/privoxy/doc/source/p-config.sgml deleted file mode 100644 index 3b59fbf..0000000 --- a/external/privoxy/doc/source/p-config.sgml +++ /dev/null @@ -1,2756 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/p-config.sgml,v $ - - Purpose : Used with other docs and files only. - - $Id: p-config.sgml,v 2.41 2009/02/19 16:59:41 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. - ======================================================================== - - - This file contains all the config file comments and options. It used to - build both the user-manual config sections, and all of config (yes, the main - config file) itself. - - Rationale: This is broken up into two files since a file with a prolog - (DTD, etc) cannot be sourced as a secondary file. config.sgml is basically - a wrapper for this file. - - IMPORTANT: - - OPTIONS: The actual options are included in this file and prefixed with - '@@', and processed by the Makefile to strip the '@@'. Default options - that should appear commented out should be listed as: '@@#OPTION'. - Otherwise, as '@@OPTION'. Example: - - @@listen-address 127.0.0.1:8118 - - The Makefile does significant other processing too. The final results - should be checked to make sure that the perl processing does not - fubar something!!! Makefile processing requires w3m, fmt (shell line - formatter), and perl. - - - This file is included into: - - user-manual.sgml - config (the actual Privoxy config file) - ---> - -<![%user-man;[ -<!-- This part only goes into user-manual --> -<sect1 id="config"> -<title>The Main Configuration File</title> - -<para> - Again, the main configuration file is named <filename>config</filename> on - Linux/Unix/BSD and OS/2, and <filename>config.txt</filename> on Windows. - Configuration lines consist of an initial keyword followed by a list of - values, all separated by whitespace (any number of spaces or tabs). For - example: -</para> - -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>confdir /etc/privoxy</emphasis></literallayout> - </msgtext> - </literal> -</para> - -<para> - Assigns the value <literal>/etc/privoxy</literal> to the option - <literal>confdir</literal> and thus indicates that the configuration - directory is named <quote>/etc/privoxy/</quote>. -</para> - -<para> - All options in the config file except for <literal>confdir</literal> and - <literal>logdir</literal> are optional. Watch out in the below description - for what happens if you leave them unset. -</para> - -<para> - The main config file controls all aspects of <application>Privoxy</application>'s - operation that are not location dependent (i.e. they apply universally, no matter - where you may be surfing). -</para> - -]]> - - -<![%config-file;[ -<!-- This part only goes into the config file --> -<sect1 id="config"> -<title> - @@TITLE<!-- between the @@ is stripped by Makefile -->@@ - Sample Configuration File for Privoxy v&p-version; -</title> -<para> - $Id: p-config.sgml,v 2.41 2009/02/19 16:59:41 fabiankeil Exp $ -</para> -<para> -Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ -</para> - -<para> - <literallayout> -################################################################# - # - Table of Contents # - # - I. INTRODUCTION # - II. FORMAT OF THE CONFIGURATION FILE # - # - 1. LOCAL SET-UP DOCUMENTATION # - 2. CONFIGURATION AND LOG FILE LOCATIONS # - 3. DEBUGGING # - 4. ACCESS CONTROL AND SECURITY # - 5. FORWARDING # - 6. WINDOWS GUI OPTIONS # - # -################################################################# - </literallayout> -</para> - -<literallayout>I. INTRODUCTION - =============== <!-- fuck this madness --></literallayout> - -<para> - This file holds Privoxy's main configuration. Privoxy detects - configuration changes automatically, so you don't have to restart it - unless you want to load a different configuration file. -</para> -<para> - The configuration will be reloaded with the first request after the - change was done, this request itself will still use the old configuration, - though. In other words: it takes two requests before you see the result of - your changes. Requests that are dropped due to ACL don't trigger reloads. -</para> -<para> - When starting Privoxy on Unix systems, give the location of this - file as last argument. On Windows systems, Privoxy will look for - this file with the name 'config.txt' in the current working directory - of the Privoxy process. -</para> - -<para> - <literallayout><!-- funky spacing --> - -II. FORMAT OF THE CONFIGURATION FILE -====================================</literallayout> -</para> -<para> - Configuration lines consist of an initial keyword followed by a list - of values, all separated by whitespace (any number of spaces or - tabs). For example, -</para> -<para> - actionsfile default.action -</para> -<para> - Indicates that the actionsfile is named 'default.action'. -</para> -<para> - The '#' indicates a comment. Any part of a line following a '#' is - ignored, except if the '#' is preceded by a ''. -</para> -<para> - 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. Removing - the # again is called "uncommenting". -</para> -<para> - Note that commenting out an option and leaving it at its default - are two completely different things! Most options behave very - differently when unset. See the "Effect if unset" explanation - in each option's description for details. -</para> -<para> - Long lines can be continued on the next line by using a `' as - the last character. -</para> - -]]> - -<!-- ************************************************ --> -<!-- The following is common to both outputs (mostly) --> -<!-- ************************************************ --> - - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="local-set-up"> -<title>Local Set-up Documentation</title> - - <para> - If you intend to operate <application>Privoxy</application> for more users - than just yourself, it might be a good idea to let them know how to reach - you, what you block and why you do that, your policies, etc. - </para> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="user-manual"><title>user-manual</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Location of the <application>Privoxy</application> User Manual. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>A fully qualified URI</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - <ulink url="http://www.privoxy.org/user-manual/">http://www.privoxy.org/<replaceable class="parameter">version</replaceable>/user-manual/</ulink> - will be used, where <replaceable class="parameter">version</replaceable> is the <application>Privoxy</application> version. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The User Manual URI is the single best source of information on - <application>Privoxy</application>, and is used for help links from some - of the internal CGI pages. The manual itself is normally packaged with the - binary distributions, so you probably want to set this to a locally - installed copy. - </para> - <para> - Examples: - </para> - <!-- - <para> - Unix, in local filesystem (may not work with all browsers): - </para> - <para> - <screen> user-manual file:///usr/share/doc/privoxy-&p-version;/user-manual/</screen> - </para> - <para> - Windows, in local filesystem, <emphasis>must</emphasis> use forward slash notation: - </para> - <para> - <screen> user-manual file:/c:/some-dir/privoxy-&p-version;/user-manual/</screen> - </para> - <para> - Windows, UNC notation (with forward slashes): - </para> - <para> - <screen> user-manual file://///some-server/some-path/privoxy-&p-version;/user-manual/</screen> - </para> - --> - <para> - The best all purpose solution is simply to put the full local - <literal>PATH</literal> to where the <citetitle>User Manual</citetitle> is - located: - </para> - <para> - <screen> user-manual /usr/share/doc/privoxy/user-manual</screen> - </para> - <para> - The User Manual is then available to anyone with access to - <application>Privoxy</application>, by following the built-in URL: - <literal>http://config.privoxy.org/user-manual/</literal> - (or the shortcut: <literal>http://p.p/user-manual/</literal>). - </para> - <para> - If the documentation is not on the local system, it can be accessed - from a remote server, as: - </para> - <para> - <screen> user-manual http://example.com/privoxy/user-manual/</screen> - </para> - <![%user-man;[ - <!-- this gets hammered in conversion to config. Text repeated below. --> - <warning> - <para> - If set, this option should be <emphasis>the first option in the config - file</emphasis>, because it is used while the config file is being read - on start-up. - </para> - </warning> - ]]> - - <![%config-file;[ - <!-- alternate --> - <para> - WARNING!!! - </para> - <blockquote> - <para> - If set, this option should be the first option in the config - file, because it is used while the config file is being read. - </para> - </blockquote> - ]]> - - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#user-manual http://www.privoxy.org/user-manual/</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="trust-info-url"><title>trust-info-url</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - A URL to be displayed in the error page that users will see if access to an untrusted page is denied. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>URL</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - No links are displayed on the "untrusted" error page. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The value of this option only matters if the experimental trust mechanism has been - activated. (See <link linkend="trustfile"><emphasis>trustfile</emphasis></link> below.) - </para> - <para> - If you use the trust mechanism, it is a good idea to write up some on-line - documentation about your trust policy and to specify the URL(s) here. - Use multiple times for multiple URLs. - </para> - <para> - The URL(s) should be added to the trustfile as well, so users don't end up - locked out from the information on why they were locked out in the first place! - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#trust-info-url http://www.example.com/why_we_block.html</literallayout>]]> -<![%config-file;[<literallayout>@@#trust-info-url http://www.example.com/what_we_allow.html</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="admin-address"><title>admin-address</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - An email address to reach the <application>Privoxy</application> administrator. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Email address</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - No email address is displayed on error pages and the CGI user interface. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - If both <literal>admin-address</literal> and <literal>proxy-info-url</literal> - are unset, the whole "Local Privoxy Support" box on all generated pages will - not be shown. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#admin-address privoxy-admin@example.com</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="proxy-info-url"><title>proxy-info-url</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - A URL to documentation about the local <application>Privoxy</application> setup, - configuration or policies. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>URL</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - No link to local documentation is displayed on error pages and the CGI user interface. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - If both <literal>admin-address</literal> and <literal>proxy-info-url</literal> - are unset, the whole "Local Privoxy Support" box on all generated pages will - not be shown. - </para> - <para> - This URL shouldn't be blocked ;-) - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#proxy-info-url http://www.example.com/proxy-service.html</literallayout>]]> -</sect3> - -</sect2> -<!-- ~ End section ~ --> - - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="conf-log-loc"> -<title>Configuration and Log File Locations</title> - -<para> - <application>Privoxy</application> can (and normally does) use a number of - other files for additional configuration, help and logging. - This section of the configuration file tells <application>Privoxy</application> - where to find those other files. -</para> - -<para> - The user running <application>Privoxy</application>, must have read - permission for all configuration files, and write permission to any files - that would be modified, such as log files and actions files. -</para> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="confdir"><title>confdir</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para>The directory where the other configuration files are located.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Path name</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>/etc/privoxy (Unix) <emphasis>or</emphasis> <application>Privoxy</application> installation dir (Windows) </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para><emphasis>Mandatory</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - No trailing <quote><literal>/</literal></quote>, please. - </para> - <!-- - This is really outdated and not likely to happen. HB 09/20/06 - <para> - When development goes modular and multi-user, the blocker, filter, and - per-user config will be stored in subdirectories of <quote>confdir</quote>. - For now, the configuration directory structure is flat, except for - <filename>confdir/templates</filename>, where the HTML templates for CGI - output reside (e.g. <application>Privoxy's</application> 404 error page). - </para> - --> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@confdir .</literallayout>]]> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="templdir"><title>templdir</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para>An alternative directory where the templates are loaded from.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Path name</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>unset</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para>The templates are assumed to be located in confdir/template.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - <application>Privoxy's</application> original templates are usually - overwritten with each update. Use this option to relocate customized - templates that should be kept. As template variables might change - between updates, you shouldn't expect templates to work with - <application>Privoxy</application> releases other than the one - they were part of, though. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#templdir .</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="logdir"><title>logdir</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - The directory where all logging takes place - (i.e. where the <filename>logfile</filename> is located). - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Path name</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>/var/log/privoxy (Unix) <emphasis>or</emphasis> <application>Privoxy</application> installation dir (Windows) </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para><emphasis>Mandatory</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - No trailing <quote><literal>/</literal></quote>, please. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@logdir .</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="actionsfile"><title> -actionsfile -</title> -<anchor id="default.action"> -<anchor id="standard.action"> -<anchor id="user.action"> -<!-- Note: slightly modified this section 04/28/02, hal. See NOTE. --> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - The <link linkend="actions-file">actions file(s)</link> to use - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Complete file name, relative to <literal>confdir</literal></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default values:</term> - <listitem> - <simplelist> - <member> - <msgtext><literallayout> match-all.action # Actions that are applied to all sites and maybe overruled later on.</literallayout></msgtext> - </member> - <member> - <msgtext><literallayout> default.action # Main actions file</literallayout></msgtext> - </member> - <member> - <msgtext><literallayout> user.action # User customizations</literallayout></msgtext> - </member> - </simplelist> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - No actions are taken at all. More or less neutral proxying. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Multiple <literal>actionsfile</literal> lines are permitted, and are in fact recommended! - </para> - <para> - The default values are <filename>default.action</filename>, which is the - <quote>main</quote> actions file maintained by the developers, and - <filename>user.action</filename>, where you can make your personal additions. - </para> - <para> - Actions files contain all the per site and per URL configuration for - ad blocking, cookie management, privacy considerations, etc. - There is no point in using <application>Privoxy</application> without at - least one actions file. - </para> - <para> - Note that since Privoxy 3.0.7, the complete filename, including the <quote>.action</quote> - extension has to be specified. The syntax change was necessary to be consistent - with the other file options and to allow previously forbidden characters. - </para> - </listitem> - </varlistentry> -</variablelist> - -<!-- NOTE: alternate markup to make a simpler list doesn't work due to --> -<!-- html -> text conversion, blah --> -<![%config-file;[<literallayout>@@actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.</literallayout>]]> -<![%config-file;[<literallayout>@@actionsfile default.action # Main actions file</literallayout>]]> -<!-- - XXX: Like user.filter, user.action should probably be commented out - by default as not all packages install it into the default directory. - fk 2007-11-07 ---> -<![%config-file;[<literallayout>@@actionsfile user.action # User customizations</literallayout>]]> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="filterfile"><title>filterfile</title> -<anchor id="default.filter"> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - The <link linkend="filter-file">filter file(s)</link> to use - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>File name, relative to <literal>confdir</literal></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>default.filter (Unix) <emphasis>or</emphasis> default.filter.txt (Windows)</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - No textual content filtering takes place, i.e. all - <literal>+<link linkend="filter">filter</link>{<replaceable class="parameter">name</replaceable>}</literal> - actions in the actions files are turned neutral. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Multiple <literal>filterfile</literal> lines are permitted. - </para> - <para> - The <link linkend="filter-file">filter files</link> contain content modification - rules that use <link linkend="regex">regular expressions</link>. These rules permit - powerful changes on the content of Web pages, and optionally the headers - as well, e.g., you could try to disable your favorite JavaScript annoyances, - re-write the actual displayed text, or just have some fun - playing buzzword bingo with web pages. - </para> - <para> - The - <literal>+<link linkend="filter">filter</link>{<replaceable class="parameter">name</replaceable>}</literal> - actions rely on the relevant filter (<replaceable class="parameter">name</replaceable>) - to be defined in a filter file! - </para> - <para> - A pre-defined filter file called <filename>default.filter</filename> that contains - a number of useful filters for common problems is included in the distribution. - See the section on the <literal><link linkend="filter">filter</link></literal> - action for a list. - </para> - <para> - It is recommended to place any locally adapted filters into a separate - file, such as <filename>user.filter</filename>. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@filterfile default.filter</literallayout>]]> -<![%config-file;[<literallayout>@@#filterfile user.filter # User customizations</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="logfile"><title>logfile</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - The log file to use - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>File name, relative to <literal>logdir</literal></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset (commented out)</emphasis>. When activated: logfile (Unix) <emphasis>or</emphasis> privoxy.log (Windows).</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - No logfile is written. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The logfile is where all logging and error messages are written. The level - of detail and number of messages are set with the <literal>debug</literal> - option (see below). The logfile can be useful for tracking down a problem with - <application>Privoxy</application> (e.g., it's not blocking an ad you - think it should block) and it can help you to monitor what your browser - is doing. - </para> - <para> - Depending on the debug options below, the logfile may be a privacy risk - if third parties can get access to it. As most users will never look - at it, <application>Privoxy</application> 3.0.7 and later only log fatal - errors by default. - </para> - <para> - For most troubleshooting purposes, you will have to change that, - please refer to the debugging section for details. - </para> - <para> - Your logfile will grow indefinitely, and you will probably want to - periodically remove it. On Unix systems, you can do this with a cron job - (see <quote>man cron</quote>). For Red Hat based Linux distributions, a - <command>logrotate</command> script has been included. - </para> - <para> - Any log files must be writable by whatever user <application>Privoxy</application> - is being run as (on Unix, default user id is <quote>privoxy</quote>). - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@logfile logfile</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="trustfile"><title>trustfile</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - The name of the trust file to use - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>File name, relative to <literal>confdir</literal></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset (commented out)</emphasis>. When activated: trust (Unix) <emphasis>or</emphasis> trust.txt (Windows)</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - The entire trust mechanism is disabled. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The trust mechanism is an experimental feature for building white-lists and should - be used with care. It is <emphasis>NOT</emphasis> recommended for the casual user. - </para> - <para> - If you specify a trust file, <application>Privoxy</application> will only allow - access to sites that are specified in the trustfile. Sites can be listed - in one of two ways: - </para> - <para> - Prepending a <literal>~</literal> character limits access to this site - only (and any sub-paths within this site), e.g. - <literal>~www.example.com</literal> allows access to - <literal>~www.example.com/features/news.html</literal>, etc. - </para> - <para> - Or, you can designate sites as <emphasis>trusted referrers</emphasis>, by - prepending the name with a <literal>+</literal> character. The effect is that - access to untrusted sites will be granted -- but only if a link from this - trusted referrer was used to get there. The link target will then be added - to the <quote>trustfile</quote> so that future, direct accesses will be - granted. Sites added via this mechanism do not become trusted referrers - themselves (i.e. they are added with a <literal>~</literal> designation). - There is a limit of 512 such entries, after which new entries will not be - made. - </para> - <para> - If you use the <literal>+</literal> operator in the trust file, it may grow - considerably over time. - </para> - <para> - It is recommended that <application>Privoxy</application> be compiled with - the <literal>--disable-force</literal>, <literal>--disable-toggle</literal> and - <literal> --disable-editor</literal> options, if this feature is to be - used. - </para> - <para> - Possible applications include limiting Internet access for children. - </para> - - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#trustfile trust</literallayout>]]> -</sect3> -</sect2> - -<!-- ~ End section ~ --> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="debugging"> -<title>Debugging</title> - - <para> - These options are mainly useful when tracing a problem. - Note that you might also want to invoke - <application>Privoxy</application> with the <literal>--no-daemon</literal> - command line option when debugging. - </para> - -<sect3 renderas="sect4" id="debug"><title>debug</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Key values that determine what information gets logged. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Integer values</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>0 (i.e.: only fatal errors (that cause Privoxy to exit) are logged)</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Default value is used (see above). - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The available debug levels are: - </para> - <para> - <programlisting> - debug 1 # Log the destination for each request &my-app; let through. See also debug 1024. - debug 2 # show each connection status - debug 4 # show I/O status - debug 8 # show header parsing - debug 16 # log all data written to the network into the logfile - debug 32 # debug force feature - debug 64 # debug regular expression filters - debug 128 # debug redirects - debug 256 # debug GIF de-animation - debug 512 # Common Log Format - debug 1024 # Log the destination for requests &my-app; didn't let through, and the reason why. - debug 2048 # CGI user interface - debug 4096 # Startup banner and warnings. - debug 8192 # Non-fatal errors -</programlisting> - </para> - <para> - To select multiple debug levels, you can either add them or use - multiple <literal>debug</literal> lines. - </para> - <para> - A debug level of 1 is informative because it will show you each request - as it happens. <emphasis>1, 4096 and 8192 are recommended</emphasis> - so that you will notice when things go wrong. The other levels are - probably only of interest if you are hunting down a specific problem. - They can produce a hell of an output (especially 16). - <!-- LOL --> - </para> - <para> - &my-app; used to ship with the debug levels recommended above enabled by - default, but due to privacy concerns 3.0.7 and later are configured to - only log fatal errors. - </para> - <para> - If you are used to the more verbose settings, simply enable the debug lines - below again. - </para> - <para> - If you want to use pure CLF (Common Log Format), you should set <quote>debug - 512</quote> <emphasis>ONLY</emphasis> and not enable anything else. - </para> - <para> - <application>Privoxy</application> has a hard-coded limit for the - length of log messages. If it's reached, messages are logged truncated - and marked with <quote>... [too long, truncated]</quote>. - </para> - <para> - Please don't file any support requests without trying to reproduce - the problem with increased debug level first. Once you read the log - messages, you may even be able to solve the problem on your own. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#debug 1 # Log the destination for each request &my-app; let through.</literallayout>]]> -<![%config-file;[<literallayout>@@#debug 1024 # Log the destination for requests &my-app; didn't let through, and the reason why.</literallayout>]]> -<![%config-file;[<literallayout>@@#debug 4096 # Startup banner and warnings</literallayout>]]> -<![%config-file;[<literallayout>@@#debug 8192 # Non-fatal errors</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="single-threaded"><title>single-threaded</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether to run only one server thread. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para><emphasis>None</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Multi-threaded (or, where unavailable: forked) operation, i.e. the ability to - serve multiple requests simultaneously. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This option is only there for debugging purposes. - <emphasis>It will drastically reduce performance.</emphasis> - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#single-threaded</literallayout>]]> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="hostname"><title>hostname</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - The hostname shown on the CGI pages. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Text</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - The hostname provided by the operating system is used. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - On some misconfigured systems resolving the hostname fails or - takes too much time and slows Privoxy down. Setting a fixed hostname - works around the problem. - </para> - <para> - In other circumstances it might be desirable to show a hostname - other than the one returned by the operating system. For example - if the system has several different hostnames and you don't want - to use the first one. - </para> - <para> - Note that Privoxy does not validate the specified hostname value. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@#hostname hostname.example.org</literallayout>]]> -</sect3> - -</sect2> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="access-control"> -<title>Access Control and Security</title> - - <para> - This section of the config file controls the security-relevant aspects - of <application>Privoxy</application>'s configuration. - </para> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="listen-address"><title>listen-address</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - The IP address and TCP port on which <application>Privoxy</application> will - listen for client requests. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>[<replaceable class="parameter">IP-Address</replaceable>]:<replaceable class="parameter">Port</replaceable></para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Default value:</term> - <listitem> - <para>127.0.0.1:8118</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Bind to 127.0.0.1 (localhost), port 8118. This is suitable and recommended for - home users who run <application>Privoxy</application> on the same machine as - their browser. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - You will need to configure your browser(s) to this proxy address and port. - </para> - <para> - If you already have another service running on port 8118, or if you want to - serve requests from other machines (e.g. on your local network) as well, you - will need to override the default. - </para> - <para> - If you leave out the IP address, <application>Privoxy</application> will - bind to all interfaces (addresses) on your machine and may become reachable - from the Internet. In that case, consider using <link - linkend="acls">access control lists</link> (ACL's, see below), and/or - a firewall. - </para> - <para> - If you open <application>Privoxy</application> to untrusted users, you will - also want to make sure that the following actions are disabled: <literal><link - linkend="enable-edit-actions">enable-edit-actions</link></literal> and - <literal><link linkend="enable-remote-toggle">enable-remote-toggle</link></literal> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Example:</term> - <listitem> - <para> - Suppose you are running <application>Privoxy</application> on - a machine which has the address 192.168.0.1 on your local private network - (192.168.0.0) and has another outside connection with a different address. - You want it to serve requests from inside only: - </para> - <para> - <programlisting> - listen-address 192.168.0.1:8118 -</programlisting> - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@listen-address 127.0.0.1:8118</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="toggle"><title>toggle</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Initial state of "toggle" status - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>1 or 0</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>1</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Act as if toggled on - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - If set to 0, <application>Privoxy</application> will start in - <quote>toggled off</quote> mode, i.e. mostly behave like a normal, - content-neutral proxy with both ad blocking and content filtering - disabled. See <literal>enable-remote-toggle</literal> below. -<!-- - This is not really useful - anymore, since toggling is much easier via <ulink - url="http://config.privoxy.org/toggle%22%3Ethe web interface</ulink> than via - editing the <filename>conf</filename> file. - - Remote toggling is now disabled by default. fk 2007-11-07) ---> - </para> - <para> - The windows version will only display the toggle icon in the system tray - if this option is present. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@toggle 1</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="enable-remote-toggle"><title>enable-remote-toggle</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether or not the <ulink url="http://config.privoxy.org/toggle">web-based toggle - feature</ulink> may be used - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>0 or 1</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>0</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - The web-based toggle feature is disabled. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - When toggled off, <application>Privoxy</application> mostly acts like a normal, - content-neutral proxy, i.e. doesn't block ads or filter content. - </para> - <para> - Access to the toggle feature can <emphasis>not</emphasis> be - controlled separately by <quote>ACLs</quote> or HTTP authentication, - so that everybody who can access <application>Privoxy</application> (see - <quote>ACLs</quote> and <literal>listen-address</literal> above) can - toggle it for all users. So this option is <emphasis>not recommended</emphasis> - for multi-user environments with untrusted users. - </para> - <para> - Note that malicious client side code (e.g Java) is also - capable of using this option. - </para> - <para> - As a lot of <application>Privoxy</application> users don't read - documentation, this feature is disabled by default. - </para> - <para> - Note that you must have compiled <application>Privoxy</application> with - support for this feature, otherwise this option has no effect. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@enable-remote-toggle 0</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="enable-remote-http-toggle"><title>enable-remote-http-toggle</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether or not Privoxy recognizes special HTTP headers to change its behaviour. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>0 or 1</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>0</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Privoxy ignores special HTTP headers. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - When toggled on, the client can change <application>Privoxy's</application> - behaviour by setting special HTTP headers. Currently the only supported - special header is <quote>X-Filter: No</quote>, to disable filtering for - the ongoing request, even if it is enabled in one of the action files. - </para> - <para> - This feature is disabled by default. If you are using - <application>Privoxy</application> in a environment with trusted clients, - you may enable this feature at your discretion. Note that malicious client - side code (e.g Java) is also capable of using this feature. - </para> - <para> - This option will be removed in future releases as it has been obsoleted - by the more general header taggers. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@enable-remote-http-toggle 0</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="enable-edit-actions"><title>enable-edit-actions</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether or not the <ulink url="http://config.privoxy.org/show-status">web-based actions - file editor</ulink> may be used - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>0 or 1</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>0</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - The web-based actions file editor is disabled. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Access to the editor can <emphasis>not</emphasis> be - controlled separately by <quote>ACLs</quote> or HTTP authentication, - so that everybody who can access <application>Privoxy</application> (see - <quote>ACLs</quote> and <literal>listen-address</literal> above) can - modify its configuration for all users. - </para> - <para> - This option is <emphasis>not recommended</emphasis> for environments - with untrusted users and as a lot of <application>Privoxy</application> - users don't read documentation, this feature is disabled by default. - </para> - <para> - Note that malicious client side code (e.g Java) is also - capable of using the actions editor and you shouldn't enable - this options unless you understand the consequences and are - sure your browser is configured correctly. - </para> - <para> - Note that you must have compiled <application>Privoxy</application> with - support for this feature, otherwise this option has no effect. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@enable-edit-actions 0</literallayout>]]> -</sect3> - - -<sect3 renderas="sect4" id="enforce-blocks"><title>enforce-blocks</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether the user is allowed to ignore blocks and can <quote>go there anyway</quote>. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable>0 or 1</replaceable> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>0</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Blocks are not enforced. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - <application>Privoxy</application> is mainly used to block and filter - requests as a service to the user, for example to block ads and other - junk that clogs the pipes. <application>Privoxy's</application> configuration - isn't perfect and sometimes innocent pages are blocked. In this situation it - makes sense to allow the user to enforce the request and have - <application>Privoxy</application> ignore the block. - </para> - <para> - In the default configuration <application>Privoxy's</application> - <quote>Blocked</quote> page contains a <quote>go there anyway</quote> - link to adds a special string (the force prefix) to the request URL. - If that link is used, <application>Privoxy</application> will - detect the force prefix, remove it again and let the request pass. - </para> - <para> - Of course <application>Privoxy</application> can also be used to enforce - a network policy. In that case the user obviously should not be able to - bypass any blocks, and that's what the <quote>enforce-blocks</quote> - option is for. If it's enabled, <application>Privoxy</application> hides - the <quote>go there anyway</quote> link. If the user adds the force - prefix by hand, it will not be accepted and the circumvention attempt - is logged. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - enforce-blocks 1 - </para> - </listitem> - </varlistentry> -</variablelist> -<![%config-file;[<literallayout>@@enforce-blocks 0</literallayout>]]> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="acls"><title> -ACLs: permit-access and deny-access</title> -<anchor id="permit-access"> -<anchor id="deny-access"> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Who can access what. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable class="parameter">src_addr</replaceable>[/<replaceable class="parameter">src_masklen</replaceable>] - [<replaceable class="parameter">dst_addr</replaceable>[/<replaceable class="parameter">dst_masklen</replaceable>]] - </para> - <para> - Where <replaceable class="parameter">src_addr</replaceable> and - <replaceable class="parameter">dst_addr</replaceable> are IP addresses in dotted decimal notation or valid - DNS names, and <replaceable class="parameter">src_masklen</replaceable> and - <replaceable class="parameter">dst_masklen</replaceable> are subnet masks in CIDR notation, i.e. integer - values from 2 to 30 representing the length (in bits) of the network address. The masks and the whole - destination part are optional. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Don't restrict access further than implied by <literal>listen-address</literal> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Access controls are included at the request of ISPs and systems - administrators, and <emphasis>are not usually needed by individual users</emphasis>. - For a typical home user, it will normally suffice to ensure that - <application>Privoxy</application> only listens on the localhost - (127.0.0.1) or internal (home) network address by means of the - <link linkend="listen-address"><emphasis>listen-address</emphasis></link> - option. - </para> - <para> - Please see the warnings in the FAQ that <application>Privoxy</application> - is not intended to be a substitute for a firewall or to encourage anyone - to defer addressing basic security weaknesses. - </para> - <para> - Multiple ACL lines are OK. - If any ACLs are specified, <application>Privoxy</application> only talks - to IP addresses that match at least one <literal>permit-access</literal> line - and don't match any subsequent <literal>deny-access</literal> line. In other words, the - last match wins, with the default being <literal>deny-access</literal>. - </para> - <para> - If <application>Privoxy</application> is using a forwarder (see <literal>forward</literal> below) - for a particular destination URL, the <replaceable class="parameter">dst_addr</replaceable> - that is examined is the address of the forwarder and <emphasis>NOT</emphasis> the address - of the ultimate target. This is necessary because it may be impossible for the local - <application>Privoxy</application> to determine the IP address of the - ultimate target (that's often what gateways are used for). - </para> - <para> - You should prefer using IP addresses over DNS names, because the address lookups take - time. All DNS names must resolve! You can <emphasis>not</emphasis> use domain patterns - like <quote>*.org</quote> or partial domain names. If a DNS name resolves to multiple - IP addresses, only the first one is used. - </para> - <para> - Denying access to particular sites by ACL may have undesired side effects - if the site in question is hosted on a machine which also hosts other sites - (most sites are). - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - Explicitly define the default behavior if no ACL and - <literal>listen-address</literal> are set: <quote>localhost</quote> - is OK. The absence of a <replaceable class="parameter">dst_addr</replaceable> implies that - <emphasis>all</emphasis> destination addresses are OK: - </para> - <para> - <screen> - permit-access localhost -</screen> - </para> - <para> - Allow any host on the same class C subnet as www.privoxy.org access to - nothing but www.example.com (or other domains hosted on the same system): - </para> - <para> - <screen> - permit-access www.privoxy.org/24 www.example.com/32 -</screen> - </para> - <para> - Allow access from any host on the 26-bit subnet 192.168.45.64 to anywhere, - with the exception that 192.168.45.73 may not access the IP address behind - www.dirty-stuff.example.com: - </para> - <para> - <screen> - permit-access 192.168.45.64/26 - deny-access 192.168.45.73 www.dirty-stuff.example.com -</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="buffer-limit"><title>buffer-limit</title> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Maximum size of the buffer for content filtering. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para>Size in Kbytes</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>4096</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Use a 4MB (4096 KB) limit. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - For content filtering, i.e. the <literal>+filter</literal> and - <literal>+deanimate-gif</literal> actions, it is necessary that - <application>Privoxy</application> buffers the entire document body. - This can be potentially dangerous, since a server could just keep sending - data indefinitely and wait for your RAM to exhaust -- with nasty consequences. - Hence this option. - </para> - <para> - When a document buffer size reaches the <literal>buffer-limit</literal>, it is - flushed to the client unfiltered and no further attempt to - filter the rest of the document is made. Remember that there may be multiple threads - running, which might require up to <literal>buffer-limit</literal> Kbytes - <emphasis>each</emphasis>, unless you have enabled <quote>single-threaded</quote> - above. - </para> - </listitem> - </varlistentry> -</variablelist> - -<![%config-file;[<literallayout>@@buffer-limit 4096</literallayout>]]> -</sect3> - -</sect2> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="forwarding"> -<title>Forwarding</title> - -<para> - This feature allows routing of HTTP requests through a chain of - multiple proxies. -</para> -<para> - Forwarding can be used to chain Privoxy with a caching proxy to speed - up browsing. Using a parent proxy may also be necessary if the machine - that <application>Privoxy</application> runs on has no direct Internet access. -</para> -<para> - Note that parent proxies can severely decrease your privacy level. - For example a parent proxy could add your IP address to the request - headers and if it's a caching proxy it may add the <quote>Etag</quote> - header to revalidation requests again, even though you configured Privoxy - to remove it. It may also ignore Privoxy's header time randomization and use the - original values which could be used by the server as cookie replacement - to track your steps between visits. -</para> - -<para> - Also specified here are SOCKS proxies. <application>Privoxy</application> - supports the SOCKS 4 and SOCKS 4A protocols. -</para> - -<sect3 renderas="sect4" id="forward"><title>forward</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - To which parent HTTP proxy specific requests should be routed. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable class="parameter">target_pattern</replaceable> - <replaceable class="parameter">http_parent</replaceable>[:<replaceable class="parameter">port</replaceable>] - </para> - <para> - where <replaceable class="parameter">target_pattern</replaceable> is a <link linkend="af-patterns">URL pattern</link> - that specifies to which requests (i.e. URLs) this forward rule shall apply. Use <literal>/</literal> to - denote <quote>all URLs</quote>. - <replaceable class="parameter">http_parent</replaceable>[:<replaceable class="parameter">port</replaceable>] - is the DNS name or IP address of the parent HTTP proxy through which the requests should be forwarded, - optionally followed by its listening port (default: 8080). - Use a single dot (<literal>.</literal>) to denote <quote>no forwarding</quote>. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Don't use parent HTTP proxies. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - If <replaceable class="parameter">http_parent</replaceable> is <quote>.</quote>, then requests are not - forwarded to another HTTP proxy but are made directly to the web servers. - </para> - <para> - Multiple lines are OK, they are checked in sequence, and the last match wins. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - Everything goes to an example parent proxy, except SSL on port 443 (which it doesn't handle): - </para> - <para> - <screen> - forward / parent-proxy.example.org:8080 - forward :443 . -</screen> - </para> - <para> - Everything goes to our example ISP's caching proxy, except for requests - to that ISP's sites: - </para> - <para> - <screen> - forward / caching-proxy.isp.example.net:8000 - forward .isp.example.net . -</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="socks"><title> -forward-socks4, forward-socks4a and forward-socks5</title> -<anchor id="forward-socks4"> -<anchor id="forward-socks4a"> - -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Through which SOCKS proxy (and optionally to which parent HTTP proxy) specific requests should be routed. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable class="parameter">target_pattern</replaceable> - <replaceable class="parameter">socks_proxy</replaceable>[:<replaceable class="parameter">port</replaceable>] - <replaceable class="parameter">http_parent</replaceable>[:<replaceable class="parameter">port</replaceable>] - </para> - <para> - where <replaceable class="parameter">target_pattern</replaceable> is a - <link linkend="af-patterns">URL pattern</link> that specifies to which - requests (i.e. URLs) this forward rule shall apply. Use <literal>/</literal> to - denote <quote>all URLs</quote>. <replaceable class="parameter">http_parent</replaceable> - and <replaceable class="parameter">socks_proxy</replaceable> - are IP addresses in dotted decimal notation or valid DNS names - (<replaceable class="parameter">http_parent</replaceable> - may be <quote>.</quote> to denote <quote>no HTTP forwarding</quote>), and the optional - <replaceable class="parameter">port</replaceable> parameters are TCP ports, - i.e. integer values from 1 to 65535 - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>Unset</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Don't use SOCKS proxies. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Multiple lines are OK, they are checked in sequence, and the last match wins. - </para> - <para> - The difference between <literal>forward-socks4</literal> and <literal>forward-socks4a</literal> - is that in the SOCKS 4A protocol, the DNS resolution of the target hostname happens on the SOCKS - server, while in SOCKS 4 it happens locally. - </para> - <para> - With <literal>forward-socks5</literal> the DNS resolution will happen on the remote server as well. - </para> - <para> - If <replaceable class="parameter">http_parent</replaceable> is <quote>.</quote>, then requests are not - forwarded to another HTTP proxy but are made (HTTP-wise) directly to the web servers, albeit through - a SOCKS proxy. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - From the company example.com, direct connections are made to all - <quote>internal</quote> domains, but everything outbound goes through - their ISP's proxy by way of example.com's corporate SOCKS 4A gateway to - the Internet. - </para> - <para> - <screen> - forward-socks4a / socks-gw.example.com:1080 www-cache.isp.example.net:8080 - forward .example.com . -</screen> - </para> - <para> - A rule that uses a SOCKS 4 gateway for all destinations but no HTTP parent looks like this: - </para> - <para> - <screen> - forward-socks4 / socks-gw.example.com:1080 . -</screen> - </para> - - <para> - To chain Privoxy and Tor, both running on the same system, you would use - something like: - </para> - <para> - <screen> - forward-socks4a / 127.0.0.1:9050 . -</screen> - </para> - - <para> - The public <application>Tor</application> network can't be used to - reach your local network, if you need to access local servers you - therefore might want to make some exceptions: - </para> - <para> - <screen> - forward 192.168.*.*/ . - forward 10.*.*.*/ . - forward 127.*.*.*/ . -</screen> - </para> - <para> - Unencrypted connections to systems in these address ranges will - be as (un)secure as the local network is, but the alternative is that you - can't reach the local network through <application>Privoxy</application> - at all. Of course this may actually be desired and there is no reason - to make these exceptions if you aren't sure you need them. - </para> - <para> - If you also want to be able to reach servers in your local network by - using their names, you will need additional exceptions that look like - this: - </para> - <para> - <screen> - forward localhost/ . -</screen> - </para> - - </listitem> - </varlistentry> -</variablelist> -</sect3> - -<![%user-man;[ <!-- not included in config due to length --> -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="advanced-forwarding-examples"><title>Advanced Forwarding Examples</title> - -<para> - If you have links to multiple ISPs that provide various special content - only to their subscribers, you can configure multiple <application>Privoxies</application> - which have connections to the respective ISPs to act as forwarders to each other, so that - <emphasis>your</emphasis> users can see the internal content of all ISPs. -</para> - -<para> - Assume that host-a has a PPP connection to isp-a.example.net. And host-b has a PPP connection to - isp-b.example.org. Both run <application>Privoxy</application>. Their forwarding - configuration can look like this: -</para> - -<para> - host-a: -</para> - -<para> - <screen> - forward / . - forward .isp-b.example.net host-b:8118 -</screen> -</para> - -<para> - host-b: -</para> - -<para> - <screen> - forward / . - forward .isp-a.example.org host-a:8118 -</screen> -</para> - -<para> - Now, your users can set their browser's proxy to use either - host-a or host-b and be able to browse the internal content - of both isp-a and isp-b. -</para> - -<para> - If you intend to chain <application>Privoxy</application> and - <application>squid</application> locally, then chaining as - <literal>browser -> squid -> privoxy</literal> is the recommended way. -</para> - -<para> - Assuming that <application>Privoxy</application> and <application>squid</application> - run on the same box, your <application>squid</application> configuration could then look like this: -</para> - -<para> - <screen> - # Define Privoxy as parent proxy (without ICP) - cache_peer 127.0.0.1 parent 8118 7 no-query - - # Define ACL for protocol FTP - acl ftp proto FTP - - # Do not forward FTP requests to Privoxy - always_direct allow ftp - - # Forward all the rest to Privoxy - never_direct allow all</screen> -</para> - -<para> - You would then need to change your browser's proxy settings to <application>squid</application>'s address and port. - Squid normally uses port 3128. If unsure consult <literal>http_port</literal> in <filename>squid.conf</filename>. -</para> - -<para> - You could just as well decide to only forward requests you suspect - of leading to Windows executables through a virus-scanning parent proxy, - say, on <literal>antivir.example.com</literal>, port 8010: -</para> - -<para> - <screen> - forward / . - forward /.*.(exe|com|dll|zip)$ antivir.example.com:8010</screen> -</para> - -</sect3> -]]> - -<sect3 renderas="sect4" id="forwarded-connect-retries"><title>forwarded-connect-retries</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - How often Privoxy retries if a forwarded connection request fails. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable class="parameter">Number of retries.</replaceable> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>0</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Connections forwarded through other proxies are treated like direct connections and no retry attempts are made. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - <replaceable class="parameter">forwarded-connect-retries</replaceable> is mainly interesting - for socks4a connections, where <application>Privoxy</application> can't detect why the connections failed. - The connection might have failed because of a DNS timeout in which case a retry makes sense, - but it might also have failed because the server doesn't exist or isn't reachable. In this - case the retry will just delay the appearance of Privoxy's error message. - </para> - <para> - Note that in the context of this option, <quote>forwarded connections</quote> includes all connections - that Privoxy forwards through other proxies. This option is not limited to the HTTP CONNECT method. - </para> - <para> - Only use this option, if you are getting lots of forwarding-related error messages - that go away when you try again manually. Start with a small value and check Privoxy's - logfile from time to time, to see how many retries are usually needed. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - forwarded-connect-retries 1 - </para> - </listitem> - </varlistentry> -</variablelist> -<![%config-file;[<literallayout>@@forwarded-connect-retries 0</literallayout>]]> -</sect3> - -<sect3 renderas="sect4" id="accept-intercepted-requests"><title>accept-intercepted-requests</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether intercepted requests should be treated as valid. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable>0 or 1</replaceable> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>0</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Only proxy requests are accepted, intercepted requests are treated as invalid. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - If you don't trust your clients and want to force them - to use <application>Privoxy</application>, enable this - option and configure your packet filter to redirect outgoing - HTTP connections into <application>Privoxy</application>. - </para> - <para> - Make sure that <application>Privoxy's</application> own requests - aren't redirected as well. Additionally take care that - <application>Privoxy</application> can't intentionally connect - to itself, otherwise you could run into redirection loops if - <application>Privoxy's</application> listening port is reachable - by the outside or an attacker has access to the pages you visit. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - accept-intercepted-requests 1 - </para> - </listitem> - </varlistentry> -</variablelist> -<![%config-file;[<literallayout>@@accept-intercepted-requests 0</literallayout>]]> -</sect3> - -<sect3 renderas="sect4" id="allow-cgi-request-crunching"><title>allow-cgi-request-crunching</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether requests to <application>Privoxy's</application> CGI pages can be blocked or redirected. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable>0 or 1</replaceable> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>0</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - <application>Privoxy</application> ignores block and redirect actions for its CGI pages. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - By default <application>Privoxy</application> ignores block or redirect actions - for its CGI pages. Intercepting these requests can be useful in multi-user - setups to implement fine-grained access control, but it can also render the complete - web interface useless and make debugging problems painful if done without care. - </para> - <para> - Don't enable this option unless you're sure that you really need it. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - allow-cgi-request-crunching 1 - </para> - </listitem> - </varlistentry> -</variablelist> -<![%config-file;[<literallayout>@@allow-cgi-request-crunching 0</literallayout>]]> -</sect3> - -<sect3 renderas="sect4" id="split-large-forms"><title>split-large-forms</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Whether the CGI interface should stay compatible with broken HTTP clients. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable>0 or 1</replaceable> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para><emphasis>0</emphasis></para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - The CGI form generate long GET URLs. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - <application>Privoxy's</application> CGI forms can lead to - rather long URLs. This isn't a problem as far as the HTTP - standard is concerned, but it can confuse clients with arbitrary - URL length limitations. - </para> - <para> - Enabling split-large-forms causes <application>Privoxy</application> - to divide big forms into smaller ones to keep the URL length down. - It makes editing a lot less convenient and you can no longer - submit all changes at once, but at least it works around this - browser bug. - </para> - <para> - If you don't notice any editing problems, there is no reason - to enable this option, but if one of the submit buttons appears - to be broken, you should give it a try. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - split-large-forms 1 - </para> - </listitem> - </varlistentry> -</variablelist> -<![%config-file;[<literallayout>@@split-large-forms 0</literallayout>]]> -</sect3> - -<sect3 renderas="sect4" id="keep-alive-timeout"><title>keep-alive-timeout</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Number of seconds after which an open connection will no longer be reused. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable>Time in seconds.</replaceable> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>None</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - Connections are not reused. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This option has no effect if <application>Privoxy</application> - has been compiled without keep-alive support. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Note that reusing connections doesn't necessary cause speedups. - There are also a few privacy implications you should be aware of. - </para> - <para> - Outgoing connections are shared between clients (if there are more - than one) and closing the client that initiated the outgoing connection - does not affect the connection between &my-app; and the server unless - the client's request hasn't been completed yet. If the outgoing connection - is idle, it will not be closed until either <application>Privoxy's</application> - or the server's timeout is reached. While it's open, the server knows - that the system running &my-app; is still there. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - keep-alive-timeout 300 - </para> - </listitem> - </varlistentry> -</variablelist> -<![%config-file;[<literallayout>@@keep-alive-timeout 300</literallayout>]]> -</sect3> - - -<sect3 renderas="sect4" id="socket-timeout"><title>socket-timeout</title> -<variablelist> - <varlistentry> - <term>Specifies:</term> - <listitem> - <para> - Number of seconds after which a socket times out if - no data is received. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Type of value:</term> - <listitem> - <para> - <replaceable>Time in seconds.</replaceable> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Default value:</term> - <listitem> - <para>None</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Effect if unset:</term> - <listitem> - <para> - A default value of 300 seconds is used. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - For SOCKS requests the timeout currently doesn't start until - the SOCKS server accepted the request. This will be fixed in - the next release. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Examples:</term> - <listitem> - <para> - socket-timeout 300 - </para> - </listitem> - </varlistentry> -</variablelist> -<![%config-file;[<literallayout>@@socket-timeout 300</literallayout>]]> -</sect3> - - -</sect2> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="windows-gui"> -<title>Windows GUI Options</title> -<para> - <application>Privoxy</application> has a number of options specific to the - Windows GUI interface: -</para> - -<anchor id="activity-animation"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - If <quote>activity-animation</quote> is set to 1, the - <application>Privoxy</application> icon will animate when - <quote>Privoxy</quote> is active. To turn off, set to 0. -</para> - -<![%config-file;[<literallayout>@@#activity-animation 1</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>activity-animation 1</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="log-messages"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - If <quote>log-messages</quote> is set to 1, - <application>Privoxy</application> will log messages to the console - window: -</para> - -<![%config-file;[<literallayout>@@#log-messages 1</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>log-messages 1</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="log-buffer-size"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - If <quote>log-buffer-size</quote> is set to 1, the size of the log buffer, - i.e. the amount of memory used for the log messages displayed in the - console window, will be limited to <quote>log-max-lines</quote> (see below). -</para> - -<para> - Warning: Setting this to 0 will result in the buffer to grow infinitely and - eat up all your memory! -</para> - -<![%config-file;[<literallayout>@@#log-buffer-size 1</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>log-buffer-size 1</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="log-max-lines"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - <application>log-max-lines</application> is the maximum number of lines held - in the log buffer. See above. -</para> - -<![%config-file;[<literallayout>@@#log-max-lines 200</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>log-max-lines 200</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="log-highlight-messages"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - If <quote>log-highlight-messages</quote> is set to 1, - <application>Privoxy</application> will highlight portions of the log - messages with a bold-faced font: -</para> - -<![%config-file;[<literallayout>@@#log-highlight-messages 1</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>log-highlight-messages 1</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="log-font-name"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - The font used in the console window: -</para> - -<![%config-file;[<literallayout>@@#log-font-name Comic Sans MS</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>log-font-name Comic Sans MS</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="log-font-size"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - Font size used in the console window: -</para> - -<![%config-file;[<literallayout>@@#log-font-size 8</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>log-font-size 8</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="show-on-task-bar"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - <quote>show-on-task-bar</quote> controls whether or not - <application>Privoxy</application> will appear as a button on the Task bar - when minimized: -</para> - -<![%config-file;[<literallayout>@@#show-on-task-bar 0</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>show-on-task-bar 0</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="close-button-minimizes"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - If <quote>close-button-minimizes</quote> is set to 1, the Windows close - button will minimize <application>Privoxy</application> instead of closing - the program (close with the exit option on the File menu). -</para> - -<![%config-file;[<literallayout>@@#close-button-minimizes 1</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - <emphasis>close-button-minimizes 1</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -<anchor id="hide-console"> -<![%config-file;[<para>@@</para>]]> <!-- for spacing --> -<para> - The <quote>hide-console</quote> option is specific to the MS-Win console - version of <application>Privoxy</application>. If this option is used, - <application>Privoxy</application> will disconnect from and hide the - command console. -</para> - -<![%config-file;[<literallayout>@@#hide-console</literallayout>]]> -<![%user-man;[ -<para> - <literal> - <msgtext> - <literallayout> - #<emphasis>hide-console</emphasis> - </literallayout> - </msgtext> - </literal> -</para> -]]> - -</sect2> -</sect1> - -<!-- end config content common to both outputs --> - -<![%config-file;[ -<!-- These are dummy anchors to keep the processor quiet --> -<!-- when building config-file only (ie. they are used in u-m only) --> -<sect1 label=""> -<title></title> -<anchor id="filter"> -<anchor id="filter-file"> -<anchor id="regex"> -<anchor id="actions-file"> -<anchor id="af-patterns"> -</sect1> -]]> - -<!-- eof p-config.sgml --> diff --git a/external/privoxy/doc/source/privoxy-man-page.sgml b/external/privoxy/doc/source/privoxy-man-page.sgml deleted file mode 100644 index ea336e3..0000000 --- a/external/privoxy/doc/source/privoxy-man-page.sgml +++ /dev/null @@ -1,352 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/privoxy-man-page.sgml,v $ - - Purpose : Manual Page - This file belongs into - ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - - $Id: privoxy-man-page.sgml,v 2.29 2009/02/19 02:20:22 hal9 Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. - ======================================================================== - - Doc NOTES: This is some tricky markup! There are some quirks - to how this markup is handled. It is not always so co-operative. - Please don't change the markup unless you can verify the changes - will improve finished output! - - literallayout tags are particularly sensitive to where they are placed. - The 'replaceable' and 'command' tags are used here somewhat unconventionally, - since it seems to generate the proper formatting (at least for me :). - - Create man page: 'make man' - - Requires docbook2man (short perl script), see CVS - http://sources.redhat.com/docbook-tools/. Also requires openjade and SGMLSpm - perl module. - - For man page references, see: - http://www.linuxdoc.org/HOWTO/mini/DocBook-Install/using.html - http://docbook.org/tdg/en/html/ch02.html#making-refentry - ---> -<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN"[ -<!entity % dummy "IGNORE"> -<!entity p-intro SYSTEM "privoxy.sgml"> -<!entity seealso SYSTEM "seealso.sgml"> -<!entity copyright SYSTEM "copyright.sgml"> -<!entity license SYSTEM "license.sgml"> -<!entity authors SYSTEM "p-authors.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-not-stable "IGNORE"> -<!entity % p-stable "INCLUDE"> -<!entity % p-text "IGNORE"> <!-- define we are not a text only doc --> -<!entity % p-authors-formal "IGNORE"> <!-- exclude additional formating --> -<!entity my-copy "(C)"> <!-- db2man barfs on copyright symbol --> -<!entity % seealso-extra "IGNORE"> <!-- for excluding sections of seealso --> -]> - -<refentry id="privoxy"> -<refentryinfo> - <date>2009-02-15</date> -</refentryinfo> -<refmeta> - <refentrytitle>privoxy</refentrytitle> - <manvolnum>1</manvolnum> - <refmiscinfo> - Privoxy &p-version;<![%p-not-stable;[ &p-status;]]> - </refmiscinfo> -</refmeta> - -<refnamediv> - <refname><application>privoxy</application></refname> - <refpurpose>Privacy Enhancing Proxy</refpurpose> -</refnamediv> - -<refsynopsisdiv> - <cmdsynopsis> - <command>privoxy</command> - <arg><option>--help</option></arg> - <arg><option>--version</option></arg> - <arg><option>--no-daemon</option></arg> - <arg><option>--pidfile </option><replaceable class="parameter">pidfile</replaceable></arg> - <arg><option>--user </option><replaceable class="parameter">user[.group]</replaceable></arg> - <arg><option>--chroot</option></arg> - <arg><option>--pre-chroot-nslookup </option><replaceable class="parameter">hostname</replaceable></arg> - <arg><replaceable class="parameter">configfile</replaceable></arg> - </cmdsynopsis> - -</refsynopsisdiv> - - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Options</title> - <para> - <command>Privoxy</command> may be invoked with the following command line - options: - </para> - - <variablelist> - <varlistentry> - <term>--help</term> - <listitem> - <para> - Print brief usage info and exit. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>--version</term> - <listitem> - <para> - Print version info and exit. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>--no-daemon</term> - <listitem> - <para> - 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. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>--pidfile <replaceable class="parameter">pidfile</replaceable></term> - <listitem> - <para> - On startup, write the process ID to <replaceable class="parameter">pidfile</replaceable>. - Delete the <replaceable class="parameter">pidfile</replaceable> on exit. - Failure to create or delete the <replaceable class="parameter">pidfile</replaceable> - is non-fatal. If no <command>--pidfile</command> option is given, no PID file will be used. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>--user <replaceable class="parameter">user[.group]</replaceable></term> - <listitem> - <para> - <!-- Note: replaceable is maybe the wrong tag, but generates --> - <!-- correct looking man output. --> - After (optionally) writing the PID file, assume the user ID of - <replaceable class="parameter">user</replaceable> and the GID of - <replaceable class="parameter">group</replaceable>, or, if the optional - <replaceable class="parameter">group</replaceable> was not given, the default group of - <replaceable class="parameter">user</replaceable>. Exit if the privileges are not - sufficient to do so. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>--chroot</term> - <listitem> - <para> - Before changing to the user ID given in the --user option, chroot to - that user's home directory, i.e. make the kernel pretend to the - <command>Privoxy</command> process that the directory tree starts - there. If set up carefully, this can limit the impact of possible - vulnerabilities in <command>Privoxy</command> to the files contained in - that hierarchy. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>--pre-chroot-nslookup <replaceable class="parameter">hostname</replaceable></term> - <listitem> - <para> - Initialize the resolver library using <replaceable class="parameter">hostname</replaceable> - before chroot'ing. On some systems this reduces the number of files - that must be copied into the chroot tree. - </para> - </listitem> - </varlistentry> - </variablelist> - - <para> - If the <filename>configfile</filename> is not specified on the command line, - <command>Privoxy</command> will look for a file named - <filename>config</filename> in the current directory. If no - <filename>configfile</filename> is found, <command>Privoxy</command> will - fail to start. - </para> - -</refsect1> - - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Description</title> -<!-- Include privoxy.sgml boilerplate: --> - &p-intro; -<!-- end boilerplate --> -</refsect1> - - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Installation and Usage</title> -<para> - Browsers can either be individually configured to use - <command>Privoxy</command> as a HTTP proxy (recommended), - or <command>Privoxy</command> can be combined with a packet - filter to build an intercepting proxy - (see <filename>config</filename>). The default setting is for - localhost, on port 8118 (configurable in the main config file). To set the - HTTP proxy in Firefox, go through: <command>Tools</command>; - <command>Options</command>; <command>General</command>; - <command>Connection Settings</command>; - <command>Manual Proxy Configuration</command>. -</para> -<para> - For Internet Explorer, go through: <command>Tools</command>; - <command>Internet Properties</command>; <command>Connections</command>; - <command>LAN Settings</command>. -</para> -<para> - The Secure (SSL) Proxy should also be set to the same values, otherwise - https: URLs will not be proxied. Note: <command>Privoxy</command> can only - proxy HTTP and HTTPS traffic. Do not try it with FTP or other protocols. - HTTPS presents some limitations, and not all features will work with HTTPS - connections. -</para> - -<para> - For other browsers, check the documentation. -</para> -</refsect1> - - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Configuration</title> -<para> - <command>Privoxy</command> can be configured with the various configuration - files. The default configuration files are: <filename>config</filename>, - <filename>default.filter</filename>, <filename>default.action</filename> and - <filename>default.action</filename>. <filename>user.action</filename> should - be used for locally defined exceptions to the default rules in - <filename>match-all.action</filename> and <filename>default.action</filename>, - and <filename>user.filter</filename> for locally defined filters. These are - well commented. On Unix and Unix-like systems, these are located in - <filename>/etc/privoxy/</filename> by default. -</para> -<para> - <command>Privoxy</command> uses the concept of <command>actions</command> - in order to manipulate the data stream between the browser and remote sites. - There are various actions available with specific functions for such things - as blocking web sites, managing cookies, etc. These actions can be invoked - individually or combined, and used against individual URLs, or groups of URLs - that can be defined using wildcards and regular expressions. The result is - that the user has greatly enhanced control and freedom. -</para> -<para> - The actions list (ad blocks, etc) can also be configured with your - web browser at <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink> - (assuming the configuration allows it). - <command>Privoxy's</command> configuration parameters can also be viewed at - the same page. In addition, <command>Privoxy</command> can be toggled on/off. - This is an internal page, and does not require Internet access. -</para> -<para> - See the <ulink - url="http://www.privoxy.org/user-manual/%22%3E<citetitle>User Manual</citetitle></ulink> for a detailed - explanation of installation, general usage, all configuration options, new - features and notes on upgrading. -</para> -</refsect1> - - - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Files</title> -<!-- this is a cheesy way to do this, but WTF. --> -<literallayout> - <filename>/usr/sbin/privoxy</filename> - <filename>/etc/privoxy/config</filename> - <filename>/etc/privoxy/match-all.action</filename> - <filename>/etc/privoxy/default.action</filename> - <filename>/etc/privoxy/user.action</filename> - <filename>/etc/privoxy/default.filter</filename> - <filename>/etc/privoxy/user.filter</filename> - <filename>/etc/privoxy/trust</filename> - <filename>/etc/privoxy/templates/*</filename> - <filename>/var/log/privoxy/logfile</filename> -</literallayout> - -<para> - Various other files should be included, but may vary depending on platform - and build configuration. Additional documentation should be included in the local - documentation directory. -</para> - -</refsect1> - - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Signals</title> -<para> - <!-- command tag is used here to get proper looking format --> - <command>Privoxy</command> terminates on the <command>SIGINT</command>, - <command>SIGTERM</command> and <command>SIGABRT</command> signals. Log - rotation scripts may cause a re-opening of the logfile by sending a - <command>SIGHUP</command> to <command>Privoxy</command>. Note that unlike - other daemons, <command>Privoxy</command> does not need to be made aware of - config file changes by <command>SIGHUP</command> -- it will detect them - automatically. -</para> - -</refsect1> - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Notes</title> -<![%p-not-stable;[ -<para> - This is a &p-status; version of <command>Privoxy</command>. Not - all features are well tested. -</para>]]> -<para> - Please see the <citetitle>User Manual</citetitle> on how to contact the - developers, for feature requests, reporting problems, and other questions. -</para> - -</refsect1> - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>See Also</title> -<!-- Include seealso.sgml boilerplate: --> - &seealso; -<!-- end boilerplate --> -</refsect1> - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Development Team</title> -<!-- Include p-authors.sgml boilerplate: --> - &authors; -<!-- end boilerplate --> -</refsect1> - -<!-- ~~~~~ New section ~~~~~ --> -<refsect1><title>Copyright and License</title> - -<refsect2><title>Copyright</title> -<!-- Include copyright.sgml boilerplate: --> - ©right; -<!-- end boilerplate --> -</refsect2> - -<refsect2><title>License</title> -<!-- Include license.sgml boilerplate: --> - &license; -<!-- end boilerplate --> -</refsect2> -</refsect1> - -</refentry> diff --git a/external/privoxy/doc/source/privoxy.sgml b/external/privoxy/doc/source/privoxy.sgml deleted file mode 100644 index 1e4791f..0000000 --- a/external/privoxy/doc/source/privoxy.sgml +++ /dev/null @@ -1,44 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/privoxy.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: privoxy.sgml,v 2.9 2009/03/21 12:42:49 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - privoxy-man-page - user-manual - faq - developer-manual - README - webserver/index.sgml - ---> - -<para> - Privoxy is a non-caching web proxy with advanced filtering capabilities - for enhancing privacy, modifying web page data and HTTP headers, controlling - access, and removing ads and other obnoxious Internet junk. Privoxy has a - flexible configuration and can be customized to suit individual needs and tastes. - It has application for both stand-alone systems and multi-user networks. -</para> - -<para> - Privoxy is Free Software and licensed under the GPL2. -</para> - -<para> - Privoxy is an associated project of Software in the Public Interest (SPI). - <ulink url="http://www.privoxy.org/faq/general.html#DONATE">Donations are welcome</ulink>. -</para> diff --git a/external/privoxy/doc/source/readme.sgml b/external/privoxy/doc/source/readme.sgml deleted file mode 100644 index 3bbacf7..0000000 --- a/external/privoxy/doc/source/readme.sgml +++ /dev/null @@ -1,268 +0,0 @@ -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ -<!entity % dummy "IGNORE"> -<!entity supported SYSTEM "supported.sgml"> -<!entity p-intro SYSTEM "privoxy.sgml"> -<!entity contacting SYSTEM "contacting.sgml"> -<!entity buildsource SYSTEM "buildsource.sgml"> -<!entity p-version "3.0.12"> -<!entity p-status "stable"> -<!entity % p-not-stable "IGNORE"> -<!entity % p-stable "INCLUDE"> -<!entity % p-text "INCLUDE"> <!-- define we are a text only doc --> -<!entity % p-doc "IGNORE"> <!-- and never a text doc --> -<!entity % p-readme "INCLUDE"> <!-- all your README belong to us --> -]> -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/readme.sgml,v $ - - Purpose : README for Privoxy - - $Id: readme.sgml,v 2.26 2009/03/21 11:32:38 hal9 Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. You have been warned! - Failure to abide by this rule will result in the revocation of your license - to live a peaceful existence! - ======================================================================== - - =================================================================== - READ: Document Note: This file generates the README in the top level - source directory. It is generated as only a plain text file. The - current markup is not suitable for other formats. Build from - Makefile with 'make dok-readme'. - =================================================================== - - READ: - - ====================================================================== - NOTE: The left margin spacing is *important* when using 'literallayout' - WYSISWYG!!! Don't mess this up!!! Careful with linebreaks too, ie - the para tag forces a linebreak. Tags need to be carefully placed as a result - to avoid extra blank lines, etc. - ====================================================================== - - For stable releases, change - - entity % p-not-stable "INCLUDE" - - to - - entity % p-not-stable "IGNORE" - - in the DTD at the top. This will toggle various text 'off'. BOTH - MUST be toggled in this case or you will get both text referencing - stable and unstable versions. You only want one or the other! - ---> -<article id="index"> -<artheader> -<![%dummy;[ - <para> - <comment> - This is here to keep vim syntax file from breaking :/ - If I knew enough to fix it, I would. - PLEASE DO NOT REMOVE! HB: hal@foobox.net - </comment> - </para> -]]> -<abstract> -<para> - <literal> - <msgtext> - <literallayout> -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/doc/source/readme.sgml,v $ - * - * Purpose : README file to give a short intro. - * - * Copyright : Written by and Copyright (C) 2001-2009 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA - * - *********************************************************************/ -</literallayout> -</msgtext> -</literal> -</para> - -<para> - <!-- include some conditional text --> - This README is included with <![%p-not-stable;[ the development version of]]> - Privoxy &p-version;. See http://www.privoxy.org/ for more information. The current code maturity - level is <quote>&p-status;</quote><![%p-not-stable;[, but seems stable to us :)]]>. -</para> -</abstract> -</artheader> - -<!-- Include privoxy.sgml boilerplate: --> -&p-intro; -<!-- end boilerplate --> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="importantchanges" ><title>IMPORTANT CHANGES</title> -<para> - March 2009, Privoxy 3.0.12 is released. -</para> -<para> - This is primarily a bug fix release. See the "ChangeLog", and the "What's - New" section and the "Upgrader's Notes" in <citetitle>the User - Manual</citetitle> for details. -</para> - -<para> - February 2009, Privoxy 3.0.11 is released. -</para> -<para> - As usual there are changes that effect the configuration. See the "ChangeLog", - and the "What's New" section and the "Upgrader's Notes" in - <citetitle>the User Manual</citetitle> for details and specifics. -</para> -<para> - This is a stable release, and marks a departure for Privoxy development. -</para> -<para> - Previously, odd numbered releases were considered beta versions and - were only released at the end of the development cycle when the code - was already believed to be stable. Usually it was, so the stable release - contained pretty much the same code, but got a higher version number. - In the future we intend to release several snapshots between stable releases. - There will probably still be about two stable releases per year, - but hopefully about six snapshots instead of the two betas we have now. - The intentions is to make testing without CVS access easier. -</para> -</sect1> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="install" ><title>INSTALL</title> -<para> - See the <filename>INSTALL</filename> file in this directory, for installing - from raw source, and the <citetitle>User Manual</citetitle>, for all other - installation types. -</para> -</sect1> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="run"><title>RUN</title> -<para> - privoxy [--help] [--version] - [--no-daemon] [--pidfile PIDFILE] [--user USER[.GROUP]] [--chroot] [--pre-chroot-nslookup - HOSTNAME ][config_file] -</para> -<para> - See the man page or <citetitle>User Manual</citetitle> for an explanation of each option, and - other configuration and usage issues. -</para> -<para> - If no config_file is specified on the command line, Privoxy will look for a - file named 'config' in the current directory (except Win32 which will look - for 'config.txt'). If no config_file is found, Privoxy will fail to start. -</para> -<para> - Or for Red Hat and Fedora based distributions: /etc/rc.d/init.d/privoxy start -</para> -<para> - Or Debian and Ubuntu: /etc/init.d/privoxy start -</para> -</sect1> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="configuration"><title>CONFIGURATION</title> -<para> - See: 'config', 'default.action', 'user.action', 'default.filter', and - 'user.filter'. 'user.action' and 'user.filter' are for personal and local - configuration preferences. These are all well commented. Most of the magic is - in '*.action' files. 'user.action' should be used for any actions - customizations. On Unix-like systems, these files are typically installed in - /etc/privoxy. On Windows, then wherever the executable itself is installed. - There are many significant changes and advances from earlier versions. The - <citetitle>User Manual</citetitle> has an explanation of all configuration - options, and examples: http://www.privoxy.org/user-manual/. -</para> -<para> - Be sure to set your browser(s) for HTTP/HTTPS Proxy at <IP>:<Port>, or - whatever you specify in the config file under 'listen-address'. DEFAULT is - localhost:8118. Note that Privoxy ONLY proxies HTTP (and HTTPS) traffic. Do not try it - with FTP or other protocols for the simple reason it does not work. -</para> -<para> - The actions list can be configured via the web interface accessed via - http://p.p/, as well other options. -</para> -<![%p-not-stable;[ -<para> - All configuration files are subject to unannounced changes during the - development process. -</para> -]]> -</sect1> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="documentation"><title>DOCUMENTATION</title> -<para> - There should be documentation in the 'doc' subdirectory<![%p-not-stable;[, but it - may not be completed at this point]]>. In particular, see the - <citetitle>User Manual</citetitle> there, - the <citetitle>FAQ</citetitle>, and those interested in Privoxy development, should look at - <citetitle>developer-manual</citetitle>. -</para> -<para> - <![%p-not-stable;[ - 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. ]]>The source and configuration files are all well - commented. The main configuration files are: 'config', 'default.action', and - 'default.filter'<![%p-not-stable;[ in the top-level source directory]]>. -</para> - -<para> - Included documentation may vary according to platform and packager. All - documentation is posted on http://www.privoxy.org, in case you don't have it, - or can't find it. -</para> -</sect1> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="contact"><title>CONTACTING THE DEVELOPERS, BUG REPORTING AND FEATURE REQUESTS</title> -<!-- Include contacting.sgml boilerplate: --> - &contacting; -<!-- end boilerplate --> -</sect1> - -<!-- <para> --> -<!-- <LiteralLayout> --> -<!-- ------------------------------------------------------------------------- --> -<!-- ijbswa-developers@lists.sourceforge.net --> -<!-- </LiteralLayout> --> -<!-- </para> --> -<!-- <para> --> -<!-- $Id: readme.sgml,v 2.26 2009/03/21 11:32:38 hal9 Exp $ --> -<!-- </para> --> - -</article> diff --git a/external/privoxy/doc/source/seealso.sgml b/external/privoxy/doc/source/seealso.sgml deleted file mode 100644 index 087ebc5..0000000 --- a/external/privoxy/doc/source/seealso.sgml +++ /dev/null @@ -1,113 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/seealso.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: seealso.sgml,v 2.12 2009/02/23 10:42:58 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - privoxy-man-page - user-manual - faq - developer-manual - - NOTE: 04/05/02, HB Removed tags. They were causing docbook2man - to barf. - ---> - -<para> - Other references and sites of interest to <application>Privoxy</application> - users: -</para> - -<para> - <simplelist> - <member> - <ulink - url="http://www.privoxy.org/%22%3Ehttp://www.privoxy.org/</ulink>, - the <application>Privoxy</application> Home page. - </member> - </simplelist> - <simplelist> - <member> - <ulink - url="http://www.privoxy.org/faq/%22%3Ehttp://www.privoxy.org/faq/</ulink>, - the <application>Privoxy</application> FAQ. - </member> - </simplelist> - <simplelist> - <member> - <ulink - url="http://www.privoxy.org/developer-manual/%22%3Ehttp://www.privoxy.org/develop...</ulink>, - the <application>Privoxy</application> developer manual. - </member> - </simplelist> - <simplelist> - <member> - <ulink url="https://sourceforge.net/projects/ijbswa/">https://sourceforge.net/projects/ijbswa/</ulink>, - the Project Page for <application>Privoxy</application> on - <ulink url="http://sourceforge.net">SourceForge</ulink>. - </member> - </simplelist> - <simplelist> - <member> - <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>, - the web-based user interface. <application>Privoxy</application> must be - running for this to work. Shortcut: <ulink url="http://p.p/">http://p.p/</ulink> - </member> - </simplelist> - <simplelist> - <member> - <ulink url="https://sourceforge.net/tracker/?group_id=11118&atid=460288">https://sourceforge.net/tracker/?group_id=11118&atid=460288</ulink>, to submit <quote>misses</quote> and other - configuration related suggestions to the developers. - </member> - </simplelist> - <![%seealso-extra;[ - <!-- This part only goes into user-manual --> - <simplelist> - <member> - <ulink url="http://www.junkbusters.com/ht/en/cookies.html">http://www.junkbusters.com/ht/en/cookies.html</ulink>, - an explanation how cookies are used to track web users. - </member> - </simplelist> - <simplelist> - <member> - <ulink url="http://www.junkbusters.com/ijb.html">http://www.junkbusters.com/ijb.html</ulink>, - the original Internet Junkbuster. - </member> - </simplelist> - <simplelist> - <member> - <ulink url="http://www.squid-cache.org/">http://www.squid-cache.org/</ulink>, a popular - caching proxy, which is often used together with <application>Privoxy</application>. - </member> - </simplelist> - <simplelist> - <member> - <ulink url="http://www.pps.jussieu.fr/~jch/software/polipo/">http://www.pps.jussieu.fr/~jch/software/polipo/</ulink>, - <application>Polipo</application> is a caching proxy with advanced features - like pipelining, multiplexing and caching of partial instances. In many setups - it can be used as <application>Squid</application> replacement. - </member> - </simplelist> - <simplelist> - <member> - <ulink url="https://www.torproject.org/">https://www.torproject.org/</ulink>, - <application>Tor</application> can help anonymize web browsing, - web publishing, instant messaging, IRC, SSH, and other applications. - </member> - </simplelist> - ]]> -</para> diff --git a/external/privoxy/doc/source/supported.sgml b/external/privoxy/doc/source/supported.sgml deleted file mode 100644 index 62bfde1..0000000 --- a/external/privoxy/doc/source/supported.sgml +++ /dev/null @@ -1,46 +0,0 @@ -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/supported.sgml,v $ - - Purpose : Entity included in other project documents. - - $Id: supported.sgml,v 2.9 2008/01/17 01:49:51 hal9 Exp $ - - Copyright (C) 2001-2008 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ====================================================================== - This file used for inclusion with other documents only. - ====================================================================== - - If you make changes to this file, please verify the finished - docs all display as intended. - - This file is included into: - - user-manual - faq - newfeatures - announce - ---> -<para> - At present, <application>Privoxy</application> is known to run on - Windows(95, 98, ME, 2000, XP, Vista), GNU/Linux (RedHat, SuSE, Debian, - Fedora, Gentoo, Slackware and others), Mac OSX, OS/2, AmigaOS, FreeBSD, - NetBSD, OpenBSD, Solaris, and various other flavors of Unix. -</para> - -<![%p-supp-userman;[ -<para> - But any operating system that runs TCP/IP, can conceivably take advantage of - <application>Privoxy</application> in a networked situation where - <application>Privoxy</application> would run as a server on a LAN gateway. - Then only the <quote>gateway</quote> needs to be running one of the above - operating systems. -</para> - -<para> - Source code is freely available, so porting to other operating systems - is always a possibility. -</para> -]]> diff --git a/external/privoxy/doc/source/temp/manpage.links b/external/privoxy/doc/source/temp/manpage.links deleted file mode 100644 index e69de29..0000000 diff --git a/external/privoxy/doc/source/temp/manpage.refs b/external/privoxy/doc/source/temp/manpage.refs deleted file mode 100644 index 09dd95e..0000000 --- a/external/privoxy/doc/source/temp/manpage.refs +++ /dev/null @@ -1,4 +0,0 @@ -{ - 'refentry:PRIVOXY' => 'privoxy(1)', - '' => '' -} diff --git a/external/privoxy/doc/source/user-manual.sgml b/external/privoxy/doc/source/user-manual.sgml deleted file mode 100644 index 2999e3e..0000000 --- a/external/privoxy/doc/source/user-manual.sgml +++ /dev/null @@ -1,9328 +0,0 @@ -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ -<!entity % dummy "IGNORE"> -<!entity supported SYSTEM "supported.sgml"> -<!entity newfeatures SYSTEM "newfeatures.sgml"> -<!entity p-intro SYSTEM "privoxy.sgml"> -<!entity seealso SYSTEM "seealso.sgml"> -<!entity buildsource SYSTEM "buildsource.sgml"> -<!entity contacting SYSTEM "contacting.sgml"> -<!entity history SYSTEM "history.sgml"> -<!entity copyright SYSTEM "copyright.sgml"> -<!entity license SYSTEM "license.sgml"> -<!entity p-authors SYSTEM "p-authors.sgml"> -<!entity config SYSTEM "p-config.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-authors-formal "INCLUDE"> <!-- include additional text, etc --> -<!entity % p-not-stable "IGNORE"> -<!entity % p-stable "INCLUDE"> -<!entity % p-text "IGNORE"> <!-- define we are not a text only doc --> -<!entity % p-doc "INCLUDE"> <!-- and we are a formal doc --> -<!entity % p-readme "IGNORE"> -<!entity % user-man "IGNORE"> -<!entity % config-file "IGNORE"> -<!entity % p-supp-userman "IGNORE"> <!-- Omit some from supported.sgml --> -<!entity my-copy "©"> <!-- kludge for docbook2man --> -<!entity % draft "IGNORE"> <!-- WIP stuff --> -<!entity % seealso-extra "INCLUDE"> <!-- extra stuff from seealso.sgml --> -<!entity my-app "<application>Privoxy</application>"> -]> -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/user-manual.sgml,v $ - - Purpose : user manual - This file belongs into - ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - - $Id: user-manual.sgml,v 2.103 2009/03/21 10:49:05 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers http://www.privoxy.org/ - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. - ======================================================================== - ---> - -<article id="index"> -<artheader> - -<title>Privoxy &p-version; User Manual</title> - -<pubdate> - <subscript> -<!-- Completely the wrong markup, but very little is allowed --> -<!-- in this part of an article. FIXME --> - <link linkend="copyright">Copyright</link> &my-copy; 2001-2009 by - <ulink url="http://www.privoxy.org/">Privoxy Developers</ulink> - </subscript> -</pubdate> - -<pubdate>$Id: user-manual.sgml,v 2.103 2009/03/21 10:49:05 fabiankeil Exp $</pubdate> - -<!-- - -Note: the following should generate a separate page, and a live link to it, -all nicely done. But it doesn't for some mysterious reason. Please leave -commented unless it can be fixed proper. For the time being, the -copyright/license declarations will be in their own sgml. - -Hal. - - ---> - - -<abstract> - -<![%dummy;[ - <para> - <comment> - This is here to keep vim syntax file from breaking :/ - If I knew enough to fix it, I would. - PLEASE DO NOT REMOVE! HB: hal@foobox.net - </comment> - </para> -]]> - - <para> - The <citetitle>Privoxy User Manual</citetitle> gives users information on how to - install, configure and use <ulink - url="http://www.privoxy.org/%22%3EPrivoxy</ulink>. - </para> - -<!-- Include privoxy.sgml boilerplate: --> - &p-intro; -<!-- end privoxy.sgml --> - - <para> - You can find the latest version of the <citetitle>Privoxy User Manual</citetitle> at <ulink - url="http://www.privoxy.org/user-manual/%22%3Ehttp://www.privoxy.org/user-manual/</ulink>. - Please see the <link linkend="contact">Contact section</link> on how to - contact the developers. - </para> - -<!-- <para> --> -<!-- Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. --> -<!-- </para> --> -</abstract> - -</artheader> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 label="1" id="introduction"><title>Introduction</title> -<para> - This documentation is included with the current &p-status; version of - <application>Privoxy</application>, v.&p-version;<![%p-not-stable;[, - 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 a new version is currently nearing - completion, and includes significant changes and enhancements over - earlier versions. ]]>. -</para> - -<!-- include only in non-stable versions --> -<![%p-not-stable;[ -<para> - Since this is a &p-status; version, not all new features are well tested. This - documentation may be slightly out of sync as a result (especially with - CVS sources). And there <emphasis>may be</emphasis> bugs, though hopefully - not many! -</para> -]]> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="features"><title>Features</title> -<para> - In addition to the core - features of ad blocking and - <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookie</ulink> management, - <application>Privoxy</application> provides many supplemental - features<![%p-not-stable;[, some of them currently under development]]>, - that give the end-user more control, more privacy and more freedom: -</para> -<!-- Include newfeatures.sgml boilerplate here: --> - &newfeatures; -<!-- end boilerplate --> -</sect2> - -</sect1> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="installation"><title>Installation</title> - -<para> - <application>Privoxy</application> is available both in convenient pre-compiled - packages for a wide range of operating systems, and as raw source code. - For most users, we recommend using the packages, which can be downloaded from our - <ulink url="http://sourceforge.net/projects/ijbswa/">Privoxy Project - Page</ulink>. -</para> - -<para> - Note: - On some platforms, the installer may remove previously installed versions, if - found. (See below for your platform). In any case <emphasis>be sure to backup - your old configuration if it is valuable to you.</emphasis> See the <link - linkend="upgradersnote">note to upgraders</link> section below. -</para> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="installation-packages"><title>Binary Packages</title> -<para> -How to install the binary packages depends on your operating system: -</para> - -<!-- XXX: The installation sections should be sorted --> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-pack-rpm"><title>Red Hat and Fedora RPMs</title> - -<para> - RPMs can be installed with <literal>rpm -Uvh privoxy-&p-version;-1.rpm</literal>, - and will use <filename>/etc/privoxy</filename> for the location - of configuration files. -</para> - -<para> - Note that on Red Hat, <application>Privoxy</application> will - <emphasis>not</emphasis> be automatically started on system boot. You will - need to enable that using <command>chkconfig</command>, - <command>ntsysv</command>, or similar methods. -</para> - -<para> - If you have problems with failed dependencies, try rebuilding the SRC RPM: - <literal>rpm --rebuild privoxy-&p-version;-1.src.rpm</literal>. This - will use your locally installed libraries and RPM version. -</para> - -<para> - Also note that if you have a <application>Junkbuster</application> RPM installed - on your system, you need to remove it first, because the packages conflict. - Otherwise, RPM will try to remove <application>Junkbuster</application> - automatically if found, before installing <application>Privoxy</application>. -</para> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-deb"><title>Debian and Ubuntu</title> -<para> - DEBs can be installed with <literal>apt-get install privoxy</literal>, - and will use <filename>/etc/privoxy</filename> for the location of - configuration files. -</para> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-pack-win"><title>Windows</title> - -<para> - Just double-click the installer, which will guide you through - the installation process. You will find the configuration files - in the same directory as you installed <application>Privoxy</application> in. -</para> -<para> - Version 3.0.5 beta introduced full <application>Windows</application> service - functionality. On Windows only, the <application>Privoxy</application> - program has two new command line arguments to install and uninstall - <application>Privoxy</application> as a <emphasis>service</emphasis>. -</para> - <variablelist> - <varlistentry> - <term>Arguments:</term> - <listitem> - <para> - <replaceable class="parameter">--install</replaceable>[:<replaceable class="parameter">service_name</replaceable>] - </para> - <para> - <replaceable class="parameter">--uninstall</replaceable>[:<replaceable class="parameter">service_name</replaceable>] - </para> - </listitem> - </varlistentry> - </variablelist> - <para> - After invoking <application>Privoxy</application> with - <command>--install</command>, you will need to bring up the - <application>Windows</application> service console to assign the user you - want <application>Privoxy</application> to run under, and whether or not you - want it to run whenever the system starts. You can start the - <application>Windows</application> services console with the following - command: <command>services.msc</command>. If you do not take the manual step - of modifying <application>Privoxy's</application> service settings, it will - not start. Note too that you will need to give Privoxy a user account that - actually exists, or it will not be permitted to - write to its log and configuration files. -</para> - -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-pack-bintgz"><title>Solaris <!--, NetBSD, HP-UX--></title> - -<para> - Create a new directory, <literal>cd</literal> to it, then unzip and - untar the archive. For the most part, you'll have to figure out where - things go. <!-- FIXME, more info needed? --> -</para> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-os2"><title>OS/2</title> - -<para> - First, make sure that no previous installations of - <application>Junkbuster</application> and / or - <application>Privoxy</application> are left on your - system. Check that no <application>Junkbuster</application> - or <application>Privoxy</application> objects are in - your startup folder. - -</para> - -<para> - Then, just double-click the WarpIN self-installing archive, which will - guide you through the installation process. A shadow of the - <application>Privoxy</application> executable will be placed in your - startup folder so it will start automatically whenever OS/2 starts. -</para> - -<para> - The directory you choose to install <application>Privoxy</application> - into will contain all of the configuration files. -</para> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-mac"><title>Mac OS X</title> -<para> - Unzip the downloaded file (you can either double-click on the zip file - icon from the Finder, or from the desktop if you downloaded it there). - Then, double-click on the package installer icon and follow the - installation process. -</para> -<para> - The privoxy service will automatically start after a successful - installation (in addition to every time your computer starts up). To - prevent the privoxy service from automatically starting when your - computer starts up, remove or rename the folder named - <literal>/Library/StartupItems/Privoxy</literal>. -</para> -<para> - To manually start or stop the privoxy service, use the Privoxy Utility - for Mac OS X. This application controls the privoxy service (e.g. - starting and stopping the service as well as uninstalling the software). -</para> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-amiga"><title>AmigaOS</title> -<para> - Copy and then unpack the <filename>lha</filename> archive to a suitable location. - All necessary files will be installed into <application>Privoxy</application> - directory, including all configuration and log files. To uninstall, just - remove this directory. -</para> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installation-tbz"><title>FreeBSD</title> - -<para> - Privoxy is part of FreeBSD's Ports Collection, you can build and install - it with <literal>cd /usr/ports/www/privoxy; make install clean</literal>. -</para> -<para> - If you don't use the ports, you can fetch and install - the package with <literal>pkg_add -r privoxy</literal>. -</para> -<para> - The port skeleton and the package can also be downloaded from the - <ulink url="https://sourceforge.net/project/showfiles.php?group_id=11118">File Release - Page</ulink>, but there's no reason to use them unless you're interested in the - beta releases which are only available there. -</para> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="installattion-gentoo"><title>Gentoo</title> -<para> - Gentoo source packages (Ebuilds) for <application>Privoxy</application> are - contained in the Gentoo Portage Tree (they are not on the download page, - but there is a Gentoo section, where you can see when a new - <application>Privoxy</application> Version is added to the Portage Tree). -</para> -<para> - Before installing <application>Privoxy</application> under Gentoo just do - first <literal>emerge --sync</literal> to get the latest changes from the - Portage tree. With <literal>emerge privoxy</literal> you install the latest - version. -</para> -<para> - Configuration files are in <filename>/etc/privoxy</filename>, the - documentation is in <filename>/usr/share/doc/privoxy-&p-version;</filename> - and the Log directory is in <filename>/var/log/privoxy</filename>. -</para> -</sect3> - -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="installation-source"><title>Building from Source</title> - -<para> - The most convenient way to obtain the <application>Privoxy</application> sources - is to download the source tarball from our - <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118&package_id=10571">project download - page</ulink>. -</para> - -<para> - If you like to live on the bleeding edge and are not afraid of using - possibly unstable development versions, you can check out the up-to-the-minute - version directly from <ulink url="http://sourceforge.net/cvs/?group_id=11118">the - CVS repository</ulink>. -<!-- - deprecated...out of business. - or simply download <ulink - url="http://cvs.sourceforge.net/cvstarballs/ijbswa-cvsroot.tar.bz2%22%3Ethe nightly CVS - tarball.</ulink> ---> -</para> - -<!-- include buildsource.sgml boilerplate: --> -&buildsource; -<!-- end boilerplate --> - -</sect2> -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="installation-keepupdated"><title>Keeping your Installation Up-to-Date</title> -<para> - As user feedback comes in and development continues, we will make updated versions - of both the main <link linkend="actions-file">actions file</link> (as a <ulink - url="http://sourceforge.net/project/showfiles.php?group_id=11118&release_id=1... - package</ulink>) and the software itself (including the actions file) available for - download. -</para> - -<para> - If you wish to receive an email notification whenever we release updates of - <application>Privoxy</application> or the actions file, <ulink - url="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce/%22%3Esubscribe - to our announce mailing list</ulink>, ijbswa-announce@lists.sourceforge.net. -</para> - -<para> - In order not to lose your personal changes and adjustments when updating - to the latest <literal>default.action</literal> file we <emphasis>strongly - recommend</emphasis> that you use <literal>user.action</literal> and - <literal>user.filter</literal> for your local - customizations of <application>Privoxy</application>. See the <link - linkend="actions-file">Chapter on actions files</link> for details. -</para> - -</sect2> - - -</sect1> - -<!-- ~ End section ~ --> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="whatsnew"> -<title>What's New in this Release</title> -<para> - <application>Privoxy 3.0.12</application> is mainly a bugfix release: -</para> - -<para> - <itemizedlist> - <listitem> - <para> - The socket-timeout option now also works on platforms whose - select() implementation modifies the timeout structure. - Previously the timeout was triggered even if the connection - didn't stall. Reported by cyberpatrol. - </para> - </listitem> - <listitem> - <para> - The Connection: keep-alive code properly deals with files - larger than 2GB. Previously the connection was closed too - early. - </para> - </listitem> - <listitem> - <para> - The content length for files above 2GB is logged correctly. - </para> - </listitem> - <listitem> - <para> - The user-manual directive on the show-status page links to - the documentation location specified with the directive, - not to the Privoxy website. - </para> - </listitem> - <listitem> - <para> - When running in daemon mode, Privoxy doesn't log anything - to the console unless there are errors before the logfile - has been opened. - </para> - </listitem> - <listitem> - <para> - The show-status page prints warnings about invalid directives - on the same line as the directives themselves. - </para> - </listitem> - <listitem> - <para> - Fixed several justified (but harmless) compiler warnings, - mostly on 64 bit platforms. - </para> - </listitem> - <listitem> - <para> - The mingw32 version explicitly requests the default charset - to prevent display problems with some fonts available on more - recent Windows versions. Patch by Burberry. - </para> - </listitem> - <listitem> - <para> - The mingw32 version uses the Privoxy icon in the alt-tab - windows. Patch by Burberry. - </para> - </listitem> - <listitem> - <para> - The timestamp and the thread id is omitted in the "Fatal error" - message box on mingw32. - </para> - </listitem> - <listitem> - <para> - Fixed two related mingw32-only buffer overflows. Triggering - them required control over the configuration file, therefore - this isn't seen as a security issue. - </para> - </listitem> - <listitem> - <para> - In verbose mode, or if the new option --show-skipped-tests - is used, Privoxy-Regression-Test logs skipped tests and the - skip reason. - </para> - </listitem> - </itemizedlist> -</para> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="upgradersnote"> -<title>Note to Upgraders</title> - -<para> - A quick list of things to be aware of before upgrading from earlier - versions of <application>Privoxy</application>: -</para> - -<para> - <itemizedlist> - - <listitem> - <para> - The recommended way to upgrade &my-app; is to backup your old - configuration files, install the new ones, verify that &my-app; - is working correctly and finally merge back your changes using - <application>diff</application> and maybe <application>patch</application>. - </para> - <para> - There are a number of new features in each &my-app; release and - most of them have to be explicitly enabled in the configuration - files. Old configuration files obviously don't do that and due - to syntax changes using old configuration files with a new - &my-app; isn't always possible anyway. - </para> - </listitem> - <listitem> - <para> - Note that some installers remove earlier versions completely, - including configuration files, therefore you should really save - any important configuration files! - </para> - </listitem> - <listitem> - <para> - On the other hand, other installers don't overwrite existing configuration - files, thinking you will want to do that yourself. - </para> - </listitem> - <listitem> - <para> - <filename>standard.action</filename> has been merged into - the <filename>default.action</filename> file. - </para> - </listitem> - <listitem> - <para> - In the default configuration only fatal errors are logged now. - You can change that in the <link linkend="DEBUG">debug section</link> - of the configuration file. You may also want to enable more verbose - logging until you verified that the new &my-app; version is working - as expected. - </para> - </listitem> - - <listitem> - <para> - Three other config file settings are now off by default: - <link linkend="enable-remote-toggle">enable-remote-toggle</link>, - <link linkend="enable-remote-http-toggle">enable-remote-http-toggle</link>, - and <link linkend="enable-edit-actions">enable-edit-actions</link>. - If you use or want these, you will need to explicitly enable them, and - be aware of the security issues involved. - </para> - </listitem> - -<!-- - <listitem> - <para> - What constitutes a <quote>default</quote> configuration has changed, - and you may want to review which actions are <quote>on</quote> by - default. This is primarily a matter of emphasis, but some features - you may have been used to, may now be <quote>off</quote> by default. - There are also a number of new actions and filters you may want to - consider, most of which are not fully incorporated into the default - settings as yet (see above). - </para> - </listitem> ---> -<!-- - <listitem> - <para> - The default actions setting is now <literal>Cautious</literal>. Previous - releases had a default setting of <literal>Medium</literal>. Experienced - users may want to adjust this, as it is fairly conservative by &my-app; - standards and past practices. See <ulink - url="http://config.privoxy.org/edit-actions-list?f=default%22%3E - http://config.privoxy.org/edit-actions-list?f=default</ulink>. New users - should try the default settings for a while before turning up the volume. - </para> - </listitem> - - <listitem> - <para> - The default setting has filtering turned <emphasis>off</emphasis>, which - subsequently means that compression is <emphasis>on</emphasis>. Remember - that filtering does not work on compressed pages, so if you use, or want to - use, filtering, you will need to force compression off. Example: - </para> - <para> - <screen> - { +<link linkend="filter">filter</link>{google} +<link linkend="prevent-compression">prevent-compression</link> } - .google.</screen> - </para> - <para> - Or if you use a number of filters, or filter many sites, you may just want - to turn off compression for all sites in - <filename>default.action</filename> (or - <filename>user.action</filename>). - </para> - - </listitem> - - <listitem> - <para> - Also, <link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> is - off by default now. If you've liked this feature in the past, you may want - to turn it back on in <filename>user.action</filename> now. - </para> - </listitem> - - - <listitem> - <para> - Some installers may not automatically start - <application>Privoxy</application> after installation. - </para> - </listitem> ---> - - </itemizedlist> -</para> - -</sect2> -</sect1> - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="quickstart"><title>Quickstart to Using Privoxy</title> -<para> - <itemizedlist> - - <listitem> - <para> - Install <application>Privoxy</application>. See the <link - linkend="installation">Installation Section</link> below for platform specific - information. - </para> - </listitem> - - <listitem> - <para> - Advanced users and those who want to offer <application>Privoxy</application> - service to more than just their local machine should check the <link - linkend="config">main config file</link>, especially the <link - linkend="access-control">security-relevant</link> options. These are - off by default. - </para> - </listitem> - - <listitem> - <para> - Start <application>Privoxy</application>, if the installation program has - not done this already (may vary according to platform). See the section - <link linkend="startup">Starting <application>Privoxy</application></link>. - </para> - </listitem> - - <listitem> - <para> - Set your browser to use <application>Privoxy</application> as HTTP and - HTTPS (SSL) <ulink url="http://en.wikipedia.org/wiki/Proxy_server">proxy</ulink> - by setting the proxy configuration for address of - <literal>127.0.0.1</literal> and port <literal>8118</literal>. - <emphasis>DO NOT</emphasis> activate proxying for <literal>FTP</literal> or - any protocols besides HTTP and HTTPS (SSL) unless you intend to prevent your - browser from using these protocols. - </para> - </listitem> - - <listitem> - <para> - Flush your browser's disk and memory caches, to remove any cached ad images. - If using <application>Privoxy</application> to manage - <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookies</ulink>, - you should remove any currently stored cookies too. - </para> - </listitem> - - <listitem> - <para> - A default installation should provide a reasonable starting point for - most. There will undoubtedly be occasions where you will want to adjust the - configuration, but that can be dealt with as the need arises. Little - to no initial configuration is required in most cases, you may want - to enable the - <ulink url="config.html#ENABLE-EDIT-ACTIONS">web-based action editor</ulink> though. - Be sure to read the warnings first. - </para> - <para> - See the <link linkend="configuration">Configuration section</link> for more - configuration options, and how to customize your installation. - You might also want to look at the <link - linkend="quickstart-ad-blocking">next section</link> for a quick - introduction to how <application>Privoxy</application> blocks ads and - banners. -</para> - </listitem> - - <listitem> - <para> - If you experience ads that slip through, innocent images that are - blocked, or otherwise feel the need to fine-tune - <application>Privoxy's</application> behavior, take a look at the <link - linkend="actions-file">actions files</link>. As a quick start, you might - find the <link linkend="act-examples">richly commented examples</link> - helpful. You can also view and edit the actions files through the <ulink - url="http://config.privoxy.org%22%3Eweb-based user interface</ulink>. The - Appendix <quote><link linkend="actionsanat">Troubleshooting: Anatomy of an - Action</link></quote> has hints on how to understand and debug actions that - <quote>misbehave</quote>. - </para> - </listitem> - -<!-- - Did anyone test these lately? - fk 2007-11-10 - <listitem> - <para> - For easy access to &my-app;'s most important controls, drag the provided - <link linkend="bookmarklets">Bookmarklets</link> into your browser's - personal toolbar. - </para> - </listitem> ---> - - <listitem> - <para> - Please see the section <link linkend="contact">Contacting the - Developers</link> on how to report bugs, problems with websites or to get - help. - </para> - </listitem> - - <listitem> - <para> - Now enjoy surfing with enhanced control, comfort and privacy! - </para> - </listitem> - - </itemizedlist> -</para> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="quickstart-ad-blocking"> -<title>Quickstart to Ad Blocking</title> -<!-- - NOTE: This section is deliberately redundant for those that don't - want to read the whole thing (which is getting lengthy). ---> -<para> - Ad blocking is but one of <application>Privoxy's</application> - array of features. Many of these features are for the technically minded advanced - user. But, ad and banner blocking is surely common ground for everybody. -</para> -<para> - This section will provide a quick summary of ad blocking so - you can get up to speed quickly without having to read the more extensive - information provided below, though this is highly recommended. -</para> -<para> - First a bit of a warning ... blocking ads is much like blocking SPAM: the - more aggressive you are about it, the more likely you are to block - things that were not intended. And the more likely that some things - may not work as intended. So there is a trade off here. If you want - extreme ad free browsing, be prepared to deal with more - <quote>problem</quote> sites, and to spend more time adjusting the - configuration to solve these unintended consequences. In short, there is - not an easy way to eliminate <emphasis>all</emphasis> ads. Either take - the easy way and settle for <emphasis>most</emphasis> ads blocked with the - default configuration, or jump in and tweak it for your personal surfing - habits and preferences. -</para> -<para> - Secondly, a brief explanation of <application>Privoxy's </application> - <quote>actions</quote>. <quote>Actions</quote> in this context, are - the directives we use to tell <application>Privoxy</application> to perform - some task relating to HTTP transactions (i.e. web browsing). We tell - <application>Privoxy</application> to take some <quote>action</quote>. Each - action has a unique name and function. While there are many potential - <application>actions</application> in <application>Privoxy's</application> - arsenal, only a few are used for ad blocking. <link - linkend="actions">Actions</link>, and <link linkend="actions-file">action - configuration files</link>, are explained in depth below. -</para> -<para> - Actions are specified in <application>Privoxy's</application> configuration, - followed by one or more URLs to which the action should apply. URLs - can actually be URL type <link linkend="af-patterns">patterns</link> that use - wildcards so they can apply potentially to a range of similar URLs. The - actions, together with the URL patterns are called a section. -</para> -<para> - When you connect to a website, the full URL will either match one or more - of the sections as defined in <application>Privoxy's</application> configuration, - or not. If so, then <application>Privoxy</application> will perform the - respective actions. If not, then nothing special happens. Furthermore, web - pages may contain embedded, secondary URLs that your web browser will - use to load additional components of the page, as it parses the - original page's HTML content. An ad image for instance, is just an URL - embedded in the page somewhere. The image itself may be on the same server, - or a server somewhere else on the Internet. Complex web pages will have many - such embedded URLs. &my-app; can deal with each URL individually, so, for - instance, the main page text is not touched, but images from such-and-such - server are blocked. -</para> - -<para> - The most important actions for basic ad blocking are: <literal><link - linkend="block">block</link></literal>, <literal><link - linkend="handle-as-image">handle-as-image</link></literal>, - <literal><link - linkend="handle-as-empty-document">handle-as-empty-document</link></literal>,and - <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>: -</para> - -<para> - <itemizedlist> - - <listitem> - <para> - <literal><link linkend="block">block</link></literal> - this is perhaps - the single most used action, and is particularly important for ad blocking. - This action stops any contact between your browser and any URL patterns - that match this action's configuration. It can be used for blocking ads, - but also anything that is determined to be unwanted. By itself, it simply - stops any communication with the remote server and sends - <application>Privoxy</application>'s own built-in BLOCKED page instead to - let you now what has happened (with some exceptions, see below). - </para> - </listitem> - - <listitem> - <para> - <literal><link linkend="handle-as-image">handle-as-image</link></literal> - - tells <application>Privoxy</application> to treat this URL as an image. - <application>Privoxy</application>'s default configuration already does this - for all common image types (e.g. GIF), but there are many situations where this - is not so easy to determine. So we'll force it in these cases. This is particularly - important for ad blocking, since only if we know that it's an image of - some kind, can we replace it with an image of our choosing, instead of the - <application>Privoxy</application> BLOCKED page (which would only result in - a <quote>broken image</quote> icon). There are some limitations to this - though. For instance, you can't just brute-force an image substitution for - an entire HTML page in most situations. - </para> - </listitem> - - <listitem> - <para> - <literal><link linkend="handle-as-empty-document">handle-as-empty-document</link></literal> - - sends an empty document instead of <application>Privoxy's</application> - normal BLOCKED HTML page. This is useful for file types that are neither - HTML nor images, such as blocking JavaScript files. - </para> - </listitem> - - <listitem> - <para> - <literal><link - linkend="set-image-blocker">set-image-blocker</link></literal> - tells - <application>Privoxy</application> what to display in place of an ad image that - has hit a block rule. For this to come into play, the URL must match a - <literal><link linkend="block">block</link></literal> action somewhere in the - configuration, <emphasis>and</emphasis>, it must also match an - <literal><link linkend="handle-as-image">handle-as-image</link></literal> action. - </para> - <para> - The configuration options on what to display instead of the ad are: - </para> - <simplelist> - <member> - <emphasis>pattern</emphasis> - a checkerboard pattern, so that an ad - replacement is obvious. This is the default. - </member> - </simplelist> - <simplelist> - <member> - <emphasis>blank</emphasis> - A very small empty GIF image is displayed. - This is the so-called <quote>invisible</quote> configuration option. - </member> - </simplelist> - <simplelist> - <member> - <emphasis>http://%3CURL%3E;</emphasis> - A redirect to any image anywhere - of the user's choosing (advanced usage). - </member> - </simplelist> - </listitem> - -</itemizedlist> -</para> - -<para> - Advanced users will eventually want to explore &my-app; - <literal><link linkend="filter">filters</link></literal> as well. Filters - are very different from <literal><link - linkend="block">blocks</link></literal>. - A <quote>block</quote> blocks a site, page, or unwanted contented. Filters - are a way of filtering or modifying what is actually on the page. An example - filter usage: a text replacement of <quote>no-no</quote> for - <quote>nasty-word</quote>. That is a very simple example. This process can be - used for ad blocking, but it is more in the realm of advanced usage and has - some pitfalls to be wary off. -</para> - -<para> - The quickest way to adjust any of these settings is with your browser through - the special <application>Privoxy</application> editor at <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink> - (shortcut: <ulink url="http://p.p/">http://p.p/show-status</ulink>). This - is an internal page, and does not require Internet access. -</para> - -<para> - Note that as of <application>Privoxy</application> 3.0.7 beta the - action editor is disabled by default. Check the - <ulink url="config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions - section in the configuration file</ulink> to learn why and in which - cases it's safe to enable again. -</para> - -<para> - If you decided to enable the action editor, select the appropriate - <quote>actions</quote> file, and click - <quote><guibutton>Edit</guibutton></quote>. It is best to put personal or - local preferences in <filename>user.action</filename> since this is not - meant to be overwritten during upgrades, and will over-ride the settings in - other files. Here you can insert new <quote>actions</quote>, and URLs for ad - blocking or other purposes, and make other adjustments to the configuration. - <application>Privoxy</application> will detect these changes automatically. -</para> - -<para> - A quick and simple step by step example: -</para> - -<para> - <itemizedlist> - - <listitem> - <para> - Right click on the ad image to be blocked, then select - <quote><guimenuitem>Copy Link Location</guimenuitem></quote> from the - pop-up menu. - </para> - </listitem> - <listitem> - <para> - Set your browser to - <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink> - </para> - </listitem> - <listitem> - <para> - Find <filename>user.action</filename> in the top section, and click - on <quote><guibutton>Edit</guibutton></quote>: - </para> - - <!-- image of editor and actions files selections --> - <para> - <figure pgwide="0" float="0"><title>Actions Files in Use</title> - <mediaobject> - <imageobject> - <imagedata fileref="files-in-use.jpg" format="jpg"> - </imageobject> - <textobject> - <phrase>[ Screenshot of Actions Files in Use ]</phrase> - </textobject> - </mediaobject> - </figure> - </para> - </listitem> - - <listitem> - <para> - You should have a section with only - <literal><link linkend="block">block</link></literal> listed under - <quote>Actions:</quote>. - If not, click a <quote><guibutton>Insert new section below</guibutton></quote> - button, and in the new section that just appeared, click the - <guibutton>Edit</guibutton> button right under the word <quote>Actions:</quote>. - This will bring up a list of all actions. Find - <literal><link linkend="block">block</link></literal> near the top, and click - in the <quote>Enabled</quote> column, then <quote><guibutton>Submit</guibutton></quote> - just below the list. - </para> - </listitem> - <listitem> - <para> - Now, in the <literal><link linkend="block">block</link></literal> actions section, - click the <quote><guibutton>Add</guibutton></quote> button, and paste the URL the - browser got from <quote><guimenuitem>Copy Link Location</guimenuitem></quote>. - Remove the <literal>http://</literal> at the beginning of the URL. Then, click - <quote><guibutton>Submit</guibutton></quote> (or - <quote><guibutton>OK</guibutton></quote> if in a pop-up window). - </para> - </listitem> - <listitem> - <para> - Now go back to the original page, and press <keycap>SHIFT-Reload</keycap> - (or flush all browser caches). The image should be gone now. - </para> - </listitem> - - </itemizedlist> -</para> - -<para> - This is a very crude and simple example. There might be good reasons to use a - wildcard pattern match to include potentially similar images from the same - site. For a more extensive explanation of <quote>patterns</quote>, and - the entire actions concept, see <link linkend="actions-file">the Actions - section</link>. -</para> - -<para> - For advanced users who want to hand edit their config files, you might want - to now go to the <link linkend="act-examples">Actions Files Tutorial</link>. - The ideas explained therein also apply to the web-based editor. -</para> -<para> - There are also various - <link linkend="filter">filters</link> that can be used for ad blocking - (filters are a special subset of actions). These - fall into the <quote>advanced</quote> usage category, and are explained in - depth in later sections. -</para> - -</sect2> - -</sect1> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="startup"> -<title>Starting Privoxy</title> -<para> - Before launching <application>Privoxy</application> for the first time, you - will want to configure your browser(s) to use - <application>Privoxy</application> as a HTTP and HTTPS (SSL) - <ulink url="http://en.wikipedia.org/wiki/Proxy_server">proxy</ulink>. The default is - 127.0.0.1 (or localhost) for the proxy address, and port 8118 (earlier versions - used port 8000). This is the one configuration step <emphasis>that must be done -</emphasis>! -</para> -<para> - Please note that <application>Privoxy</application> can only proxy HTTP and - HTTPS traffic. It will not work with FTP or other protocols. -</para> - - <!-- image of Mozilla Proxy configuration --> - <para> - <figure pgwide="0" float="0"><title>Proxy Configuration Showing - Mozilla/Netscape HTTP and HTTPS (SSL) Settings</title> - <mediaobject> - <imageobject> - <imagedata fileref="proxy_setup.jpg" format="jpg"> - </imageobject> - <textobject> - <phrase>[ Screenshot of Mozilla Proxy Configuration ]</phrase> - </textobject> - </mediaobject> - </figure> - </para> - - -<para> - With <application>Firefox</application>, this is typically set under: -</para> - -<literallayout> - <guibutton>Tools</guibutton> -> <guibutton>Options</guibutton> -> <guibutton>Advanced</guibutton> -> <guibutton>Network</guibutton> -><guibutton>Connection</guibutton> -> <guibutton>Settings</guibutton> - -</literallayout> - -<para> - Or optionally on some platforms: -</para> - -<literallayout> - <guibutton>Edit</guibutton> -> <guibutton>Preferences</guibutton> -> <guibutton>General</guibutton> -> <guibutton>Connection Settings</guibutton> -> <guibutton>Manual Proxy Configuration</guibutton> - -</literallayout> - - -<para> - With <application>Netscape</application> (and - <application>Mozilla</application>), this can be set under: -</para> - - -<literallayout> -<!-- Mix ascii and gui art, something for everybody --> -<!-- spacing on this is tricky --> - <guibutton>Edit</guibutton> -> <guibutton>Preferences</guibutton> -> <guibutton>Advanced</guibutton> -> <guibutton>Proxies</guibutton> -> <guibutton>HTTP Proxy</guibutton> - -</literallayout> - -<para> - For <application>Internet Explorer v.5-7</application>: -</para> - -<literallayout> - <guibutton>Tools</guibutton> -> <guibutton>Internet Options</guibutton> -> <guibutton>Connections</guibutton> -> <guibutton>LAN Settings</guibutton> -</literallayout> - -<para> - Then, check <quote>Use Proxy</quote> and fill in the appropriate info - (Address: 127.0.0.1, Port: 8118). Include HTTPS (SSL), if you want HTTPS - proxy support too (sometimes labeled <quote>Secure</quote>). Make sure any - checkboxes like <quote>Use the same proxy server for all protocols</quote> is - <emphasis>UNCHECKED</emphasis>. You want only HTTP and HTTPS (SSL)! -</para> - - <!-- image of IE Proxy configuration --> - <para> - <figure pgwide="0" float="0"><title>Proxy Configuration Showing - Internet Explorer HTTP and HTTPS (Secure) Settings</title> - <mediaobject> - <imageobject> - <imagedata fileref="proxy2.jpg" format="jpg"> - </imageobject> - <textobject> - <phrase>[ Screenshot of IE Proxy Configuration ]</phrase> - </textobject> - </mediaobject> - </figure> - </para> - - -<para> - After doing this, flush your browser's disk and memory caches to force a - re-reading of all pages and to get rid of any ads that may be cached. Remove - any <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookies</ulink>, - if you want <application>Privoxy</application> to manage that. You are now - ready to start enjoying the benefits of using - <application>Privoxy</application>! -</para> - -<para> - <application>Privoxy</application> itself is typically started by specifying the - main configuration file to be used on the command line. If no configuration - file is specified on the command line, <application>Privoxy</application> - will look for a file named <filename>config</filename> in the current - directory. Except on Win32 where it will try <filename>config.txt</filename>. -</para> - -<sect2 id="start-redhat"> -<title>Red Hat and Fedora</title> -<para> - A default Red Hat installation may not start &my-app; upon boot. It will use - the file <filename>/etc/privoxy/config</filename> as its main configuration - file. -</para> -<para> - <screen> - # /etc/rc.d/init.d/privoxy start -</screen> -</para> -<para> - Or ... -</para> -<para> - <screen> - # service privoxy start -</screen> -</para> -</sect2> - -<sect2 id="start-debian"> -<title>Debian</title> -<para> - We use a script. Note that Debian typically starts &my-app; upon booting per - default. It will use the file - <filename>/etc/privoxy/config</filename> as its main configuration - file. -</para> -<para> - <screen> - # /etc/init.d/privoxy start -</screen> -</para> -</sect2> - -<sect2 id="start-windows"> -<title>Windows</title> -<para> -Click on the &my-app; Icon to start <application>Privoxy</application>. If no configuration file is - specified on the command line, <application>Privoxy</application> will look - for a file named <filename>config.txt</filename>. Note that Windows will - automatically start &my-app; when the system starts if you chose that option - when installing. -</para> -<para> - <application>Privoxy</application> can run with full Windows service functionality. - On Windows only, the &my-app; program has two new command line arguments - to install and uninstall &my-app; as a service. See the - <link linkend="installation-pack-win">Windows Installation - instructions</link> for details. -</para> -</sect2> - -<sect2 id="start-unices"> -<title>Solaris, NetBSD, FreeBSD, HP-UX and others</title> -<para> -Example Unix startup command: -</para> -<para> - <screen> - # /usr/sbin/privoxy /etc/privoxy/config -</screen> -</para> -</sect2> - -<sect2 id="start-os2"> -<title>OS/2</title> -<para> - During installation, <application>Privoxy</application> is configured to - start automatically when the system restarts. You can start it manually by - double-clicking on the <application>Privoxy</application> icon in the - <application>Privoxy</application> folder. -</para> -</sect2> - -<sect2 id="start-macosx"> -<title>Mac OS X</title> -<para> - After downloading the privoxy software, unzip the downloaded file by - double-clicking on the zip file icon. Then, double-click on the - installer package icon and follow the installation process. -</para> -<para> - The privoxy service will automatically start after a successful - installation. In addition, the privoxy service will automatically - start every time your computer starts up. -</para> -<para> - To prevent the privoxy service from automatically starting when your - computer starts up, remove or rename the folder named - /Library/StartupItems/Privoxy. -</para> -<para> - A simple application named Privoxy Utility has been created which - enables administrators to easily start and stop the privoxy service. -</para> -<para> - In addition, the Privoxy Utility presents a simple way for - administrators to edit the various privoxy config files. A method - to uninstall the software is also available. -</para> -<para> - An administrator username and password must be supplied in order for - the Privoxy Utility to perform any of the tasks. -</para> -</sect2> - - -<sect2 id="start-amigaos"> -<title>AmigaOS</title> -<para> - Start <application>Privoxy</application> (with RUN <>NIL:) in your - <filename>startnet</filename> script (AmiTCP), in - <filename>s:user-startup</filename> (RoadShow), as startup program in your - startup script (Genesis), or as startup action (Miami and MiamiDx). - <application>Privoxy</application> will automatically quit when you quit your - TCP/IP stack (just ignore the harmless warning your TCP/IP stack may display that - <application>Privoxy</application> is still running). -</para> -</sect2> - -<sect2 id="start-gentoo"> -<title>Gentoo</title> -<para> - A script is again used. It will use the file <filename>/etc/privoxy/config - </filename> as its main configuration file. -</para> -<para> - <screen> - /etc/init.d/privoxy start - </screen> -</para> -<para> - Note that <application>Privoxy</application> is not automatically started at - boot time by default. You can change this with the <literal>rc-update</literal> - command. -</para> -<para> - <screen> - rc-update add privoxy default - </screen> -</para> -</sect2> - -<!-- - -<para> - See the section <link linkend="cmdoptions">Command line options</link> for - further info. -</para> - -must find a better place for this paragraph - -<para> - The included default configuration files should give a reasonable starting - point. Most of the per site configuration is done in the - <ulink url="actions-file.html"><quote>actions</quote></ulink> files. These are - where various cookie actions are defined, ad and banner blocking, and other - aspects of <application>Privoxy</application> configuration. There are several - such files included, with varying levels of aggressiveness. -</para> - -<para> - You will probably want to keep an eye out for sites for which you may prefer - persistent cookies, and add these to your actions configuration as needed. By - default, most of these will be accepted only during the current browser - session (aka <quote>session cookies</quote>), unless you add them to the - configuration. If you want the browser to handle this instead, you will need - to edit <filename>user.action</filename> (or through the web based interface) - and disable this feature. If you use more than one browser, it would make - more sense to let <application>Privoxy</application> handle this. In which - case, the browser(s) should be set to accept all cookies. -</para> - -<para> - Another feature where you will probably want to define exceptions for trusted - sites is the popup-killing (through <ulink - url="actions-file.html#FILTER-POPUPS"><quote>+filter{popups}</quote></ulink>), - because your favorite shopping, banking, or leisure site may need - popups (explained below). -</para> - -<para> - <application>Privoxy</application> does not support all of the optional HTTP/1.1 - features yet. In the unlikely event that you experience inexplicable problems - with browsers that use HTTP/1.1 per default - (like <application>Mozilla</application> or recent versions of I.E.), you might - try to force HTTP/1.0 compatibility. For Mozilla, look under <literal>Edit -> - Preferences -> Debug -> Networking</literal>. - Alternatively, set the <quote>+downgrade-http-version</quote> config option in - <filename>default.action</filename> which will downgrade your browser's HTTP - requests from HTTP/1.1 to HTTP/1.0 before processing them. -</para> - -<para> - After running <application>Privoxy</application> for a while, you can - start to fine tune the configuration to suit your personal, or site, - preferences and requirements. There are many, many aspects that can - be customized. <quote>Actions</quote> - can be adjusted by pointing your browser to - <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink> - (shortcut: <ulink url="http://p.p/">http://p.p/</ulink>), - and then follow the link to <quote>View & Change the Current Configuration</quote>. - (This is an internal page and does not require Internet access.) -</para> - -<para> - In fact, various aspects of <application>Privoxy</application> - configuration can be viewed from this page, including - current configuration parameters, source code version numbers, - the browser's request headers, and <quote>actions</quote> that apply - to a given URL. In addition to the actions file - editor mentioned above, <application>Privoxy</application> can also - be turned <quote>on</quote> and <quote>off</quote> (toggled) from this page. -</para> - -<para> - If you encounter problems, try loading the page without - <application>Privoxy</application>. If that helps, enter the URL where - you have the problems into <ulink url="http://p.p/show-url-info">the browser - based rule tracing utility</ulink>. See which rules apply and why, and - then try turning them off for that site one after the other, until the problem - is gone. When you have found the culprit, you might want to turn the rest on - again. -</para> - -<para> - If the above paragraph sounds gibberish to you, you might want to <link - linkend="actions-file">read more about the actions concept</link> - or even dive deep into the <link linkend="actionsanat">Appendix - on actions</link>. -</para> - -<para> - If you can't get rid of the problem at all, think you've found a bug in - Privoxy, want to propose a new feature or smarter rules, please see the - section <link linkend="contact"><quote>Contacting the - Developers</quote></link> below. -</para> - ---> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="cmdoptions"> -<title>Command Line Options</title> -<para> - <application>Privoxy</application> may be invoked with the following - command-line options: -</para> - -<para> - <itemizedlist> - - <listitem> - <para> - <emphasis>--version</emphasis> - </para> - <para> - Print version info and exit. Unix only. - </para> - </listitem> - <listitem> - <para> - <emphasis>--help</emphasis> - </para> - <para> - Print short usage info and exit. Unix only. - </para> - </listitem> - <listitem> - <para> - <emphasis>--no-daemon</emphasis> - </para> - <para> - Don't become a daemon, i.e. don't fork and become process group - leader, and don't detach from controlling tty. Unix only. - </para> - </listitem> - <listitem> - <para> - <emphasis>--pidfile FILE</emphasis> - </para> - <para> - On startup, write the process ID to <emphasis>FILE</emphasis>. Delete the - <emphasis>FILE</emphasis> on exit. Failure to create or delete the - <emphasis>FILE</emphasis> is non-fatal. If no <emphasis>FILE</emphasis> - option is given, no PID file will be used. Unix only. - </para> - </listitem> - <listitem> - <para> - <emphasis>--user USER[.GROUP]</emphasis> - </para> - <para> - After (optionally) writing the PID file, assume the user ID of - <emphasis>USER</emphasis>, and if included the GID of GROUP. Exit if the - privileges are not sufficient to do so. Unix only. - </para> - </listitem> - <listitem> - <para> - <emphasis>--chroot</emphasis> - </para> - <para> - Before changing to the user ID given in the <emphasis>--user</emphasis> option, - chroot to that user's home directory, i.e. make the kernel pretend to the &my-app; - process that the directory tree starts there. If set up carefully, this can limit - the impact of possible vulnerabilities in &my-app; to the files contained in that hierarchy. - Unix only. - </para> - </listitem> - <listitem> - <para> - <emphasis>--pre-chroot-nslookup hostname</emphasis> - </para> - <para> - Specifies a hostname to look up before doing a chroot. On some systems, initializing the - resolver library involves reading config files from /etc and/or loading additional shared - libraries from /lib. On these systems, doing a hostname lookup before the chroot reduces - the number of files that must be copied into the chroot tree. - </para> - <para> - For fastest startup speed, a good value is a hostname that is not in /etc/hosts but that - your local name server (listed in /etc/resolv.conf) can resolve without recursion - (that is, without having to ask any other name servers). The hostname need not exist, - but if it doesn't, an error message (which can be ignored) will be output. - </para> - </listitem> - - <listitem> - <para> - <emphasis>configfile</emphasis> - </para> - <para> - If no <emphasis>configfile</emphasis> is included on the command line, - <application>Privoxy</application> will look for a file named - <quote>config</quote> in the current directory (except on Win32 - where it will look for <quote>config.txt</quote> instead). Specify - full path to avoid confusion. If no config file is found, - <application>Privoxy</application> will fail to start. - </para> - </listitem> - - </itemizedlist> -</para> - -<para> - On <application>MS Windows</application> only there are two additional - command-line options to allow <application>Privoxy</application> to install and - run as a <emphasis>service</emphasis>. See the -<link linkend="installation-pack-win">Window Installation section</link> -for details. -</para> - -</sect2> - -</sect1> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="configuration"><title>Privoxy Configuration</title> - <para> - All <application>Privoxy</application> configuration is stored - in text files. These files can be edited with a text editor. - Many important aspects of <application>Privoxy</application> can - also be controlled easily with a web browser. - </para> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2> -<title>Controlling Privoxy with Your Web Browser</title> -<para> - <application>Privoxy</application>'s user interface can be reached through the special - URL <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink> - (shortcut: <ulink url="http://p.p/">http://p.p/</ulink>), - which is a built-in page and works without Internet access. - You will see the following section: - -</para> - -<!-- Needs to be put in a table and colorized --> -<screen> - <msgtext> - <bridgehead renderas="sect2"> Privoxy Menu</bridgehead> - - <simplelist> - <member> - ▪ <ulink url="http://config.privoxy.org/show-status">View & change the current configuration</ulink> - </member> - <member> - ▪ <ulink url="http://config.privoxy.org/show-version">View the source code version numbers</ulink> - </member> - <member> - ▪ <ulink url="http://config.privoxy.org/show-request">View the request headers.</ulink> - </member> - <member> - ▪ <ulink url="http://config.privoxy.org/show-url-info">Look up which actions apply to a URL and why</ulink> - </member> - <member> - ▪ <ulink url="http://config.privoxy.org/toggle">Toggle Privoxy on or off</ulink> - </member> - <member> - ▪ <ulink - url="http://www.privoxy.org/&p-version;/user-manual/%22%3EDocumentation</ulink> - </member> - </simplelist> - </msgtext> -</screen> - - -<para> - This should be self-explanatory. Note the first item leads to an editor for the - <link linkend="actions-file">actions files</link>, which is where the ad, banner, - cookie, and URL blocking magic is configured as well as other advanced features of - <application>Privoxy</application>. This is an easy way to adjust various - aspects of <application>Privoxy</application> configuration. The actions - file, and other configuration files, are explained in detail below. -</para> - -<para> - <quote>Toggle Privoxy On or Off</quote> is handy for sites that might - have problems with your current actions and filters. You can in fact use - it as a test to see whether it is <application>Privoxy</application> - causing the problem or not. <application>Privoxy</application> continues - to run as a proxy in this case, but all manipulation is disabled, i.e. - <application>Privoxy</application> acts like a normal forwarding proxy. There - is even a toggle <link linkend="bookmarklets">Bookmarklet</link> offered, so - that you can toggle <application>Privoxy</application> with one click from - your browser. -</para> - -<para> - Note that several of the features described above are disabled by default - in <application>Privoxy</application> 3.0.7 beta and later. - Check the - <ulink url="config.html">configuration file</ulink> to learn why - and in which cases it's safe to enable them again. -</para> - -</sect2> - -<!-- ~ End section ~ --> - - - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="confoverview"> -<title>Configuration Files Overview</title> -<para> - For Unix, *BSD and Linux, all configuration files are located in - <filename>/etc/privoxy/</filename> by default. For MS Windows, OS/2, and - AmigaOS these are all in the same directory as the - <application>Privoxy</application> executable. <![%p-not-stable;[ The name - and number of configuration files has changed from previous versions, and is - subject to change as development progresses.]]> -</para> - -<para> - The installed defaults provide a reasonable starting point, though - some settings may be aggressive by some standards. For the time being, the - principle configuration files are: -</para> - -<para> - <itemizedlist> - - <listitem> - <para> - The <link linkend="config">main configuration file</link> is named <filename>config</filename> - on Linux, Unix, BSD, OS/2, and AmigaOS and <filename>config.txt</filename> - on Windows. This is a required file. - </para> - </listitem> - - <listitem> - <para> - <filename>match-all.action</filename> is used to define which <quote>actions</quote> - relating to banner-blocking, images, pop-ups, content modification, cookie handling - etc should be applied by default. It should be the first actions file loaded. - </para> - <para> - <filename>default.action</filename> defines many exceptions (both positive and negative) - from the default set of actions that's configured in <filename>match-all.action</filename>. - It should be the second actions file loaded and shouldn't be edited by the user. - </para> - <para> - Multiple actions files may be defined in <filename>config</filename>. These - are processed in the order they are defined. Local customizations and locally - preferred exceptions to the default policies as defined in - <filename>match-all.action</filename> (which you will most probably want - to define sooner or later) are best applied in <filename>user.action</filename>, - where you can preserve them across upgrades. The file isn't installed by all - installers, but you can easily create it yourself with a text editor. - </para> - <para> - There is also a web based editor that can be accessed from - <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink> - (Shortcut: <ulink - url="http://p.p/show-status%22%3Ehttp://p.p/show-status</ulink>) for the - various actions files. - </para> - </listitem> - - <listitem> - <para> - <quote>Filter files</quote> (the <link linkend="filter-file">filter - file</link>) 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. The filtering jobs are only pre-defined here; - whether to apply them or not is up to the actions files. - <filename>default.filter</filename> includes various filters made - available for use by the developers. Some are much more intrusive than - others, and all should be used with caution. You may define additional - filter files in <filename>config</filename> as you can with - actions files. We suggest <filename>user.filter</filename> for any - locally defined filters or customizations. - </para> - </listitem> - - </itemizedlist> -</para> - -<para> - The syntax of the configuration and filter files may change between different - Privoxy versions, unfortunately some enhancements cost backwards compatibility. - <!-- Add link to documentation--> -</para> - -<para> - All files use the <quote><literal>#</literal></quote> character to denote a - comment (the rest of the line will be ignored) and understand line continuation - through placing a backslash ("<literal></literal>") as the very last character - in a line. If the <literal>#</literal> is preceded by a backslash, it looses - its special function. Placing a <literal>#</literal> in front of an otherwise - valid configuration line to prevent it from being interpreted is called "commenting - out" that line. Blank lines are ignored. -</para> - -<para> - The actions files and filter files - can use Perl style <link linkend="regex">regular expressions</link> for - maximum flexibility. -</para> - -<para> - After making any changes, there is no need to restart - <application>Privoxy</application> in order for the changes to take - effect. <application>Privoxy</application> detects such changes - automatically. Note, however, that it may take one or two additional - requests for the change to take effect. When changing the listening address - of <application>Privoxy</application>, these <quote>wake up</quote> requests - must obviously be sent to the <emphasis>old</emphasis> listening address. -</para> - -<![%p-not-stable;[ -<para> - While under development, the configuration content is subject to change. - The below documentation may not be accurate by the time you read this. - Also, what constitutes a <quote>default</quote> setting, may change, so - please check all your configuration files on important issues. -</para> -]]> - -</sect2> -</sect1> -<!-- ~ End section ~ --> - - -<!-- ~~~~~~~~ New section Header ~~~~~~~~~ --> - -<!-- **************************************************** --> -<!-- Include config.sgml here --> -<!-- This is where the entire config file is detailed. --> - &config; -<!-- end include --> - - -<!-- ~ End section ~ --> - - - -<!-- ~~~~~~~~ New section Header ~~~~~~~~~ --> - -<sect1 id="actions-file"><title>Actions Files</title> - - -<!-- - XXX: similar descriptions are in the Configuration Files sections. - We should only describe them at one place. ---> -<para> - The actions files are used to define what <emphasis>actions</emphasis> - <application>Privoxy</application> takes for which URLs, and thus determines - how ad images, cookies and various other aspects of HTTP content and - transactions are handled, and on which sites (or even parts thereof). - There are a number of such actions, with a wide range of functionality. - Each action does something a little different. - These actions give us a veritable arsenal of tools with which to exert - our control, preferences and independence. Actions can be combined so that - their effects are aggregated when applied against a given set of URLs. -</para> -<para> - There - are three action files included with <application>Privoxy</application> with - differing purposes: -</para> -<para> - <itemizedlist> - <listitem> - <para> - <filename>match-all.action</filename> - is used to define which - <quote>actions</quote> relating to banner-blocking, images, pop-ups, - content modification, cookie handling etc should be applied by default. - It should be the first actions file loaded - </para> - </listitem> - <listitem> - <para> - <filename>default.action</filename> - defines many exceptions (both - positive and negative) from the default set of actions that's configured - in <filename>match-all.action</filename>. It is a set of rules that should - work reasonably well as-is for most users. This file is only supposed to - be edited by the developers. It should be the second actions file loaded. - </para> - </listitem> - <listitem> - <para> - <filename>user.action</filename> - is intended to be for local site - preferences and exceptions. As an example, if your ISP or your bank - has specific requirements, and need special handling, this kind of - thing should go here. This file will not be upgraded. - </para> - </listitem> - <listitem> - <para> - <guibutton>Edit</guibutton> <guibutton>Set to Cautious</guibutton> <guibutton>Set to Medium</guibutton> <guibutton>Set to Advanced</guibutton> - </para> - <para> - These have increasing levels of aggressiveness <emphasis>and have no - influence on your browsing unless you select them explicitly in the - editor</emphasis>. A default installation should be pre-set to - <literal>Cautious</literal>. New users should try this for a while before - adjusting the settings to more aggressive levels. The more aggressive - the settings, then the more likelihood there is of problems such as sites - not working as they should. - </para> - <para> - The <guibutton>Edit</guibutton> button allows you to turn each - action on/off individually for fine-tuning. The <guibutton>Cautious</guibutton> - button changes the actions list to low/safe settings which will activate - ad blocking and a minimal set of &my-app;'s features, and subsequently - there will be less of a chance for accidental problems. The - <guibutton>Medium</guibutton> button sets the list to a medium level of - other features and a low level set of privacy features. The - <guibutton>Advanced</guibutton> button sets the list to a high level of - ad blocking and medium level of privacy. See the chart below. The latter - three buttons over-ride any changes via with the - <guibutton>Edit</guibutton> button. More fine-tuning can be done in the - lower sections of this internal page. - </para> - <para> - While the actions file editor allows to enable these settings in all - actions files, they are only supposed to be enabled in the first one - to make sure you don't unintentionally overrule earlier rules. - </para> - <para> - The default profiles, and their associated actions, as pre-defined in - <filename>default.action</filename> are: - </para> - <para> - <table frame=all><title>Default Configurations</title> - <tgroup cols=4 align=left colsep=1 rowsep=1> - <colspec colname=c1> - <colspec colname=c2> - <colspec colname=c3> - <colspec colname=c4> - <thead> - <row> - <entry>Feature</entry> - <entry>Cautious</entry> - <entry>Medium</entry> - <entry>Advanced</entry> - </row> - </thead> - <!-- <tfoot> --> - <!-- <row> --> - <!-- <entry>f1</entry> --> - <!-- <entry>f2</entry> --> - <!-- <entry>f3</entry> --> - <!-- <entry>f4</entry> --> - <!-- </row> --> - <!-- </tfoot> --> - <tbody> - - <row> - <entry>Ad-blocking Aggressiveness</entry> - <entry>medium</entry> - <entry>high</entry> - <entry>high</entry> - </row> - - <row> - <entry>Ad-filtering by size</entry> - <entry>no</entry> - <entry>yes</entry> - <entry>yes</entry> - </row> - - <row> - <entry>Ad-filtering by link</entry> - <entry>no</entry> - <entry>no</entry> - <entry>yes</entry> - </row> - <row> - <entry>Pop-up killing</entry> - <entry>blocks only</entry> - <entry>blocks only</entry> - <entry>blocks only</entry> - </row> - - <row> - <entry>Privacy Features</entry> - <entry>low</entry> - <entry>medium</entry> - <entry>medium/high</entry> - </row> - - <row> - <entry>Cookie handling</entry> - <entry>none</entry> - <entry>session-only</entry> - <entry>kill</entry> - </row> - - <row> - <entry>Referer forging</entry> - <entry>no</entry> - <entry>yes</entry> - <entry>yes</entry> - </row> - - <row> - <entry>GIF de-animation</entry> - <entry>no</entry> - <entry>yes</entry> - <entry>yes</entry> - </row> - - <row> - <entry>Fast redirects</entry> - <entry>no</entry> - <entry>no</entry> - <entry>yes</entry> - </row> - - <row> - <entry>HTML taming</entry> - <entry>no</entry> - <entry>no</entry> - <entry>yes</entry> - </row> - - <row> - <entry>JavaScript taming</entry> - <entry>no</entry> - <entry>no</entry> - <entry>yes</entry> - </row> - - <row> - <entry>Web-bug killing</entry> - <entry>no</entry> - <entry>yes</entry> - <entry>yes</entry> - </row> - - <row> - <entry>Image tag reordering</entry> - <entry>no</entry> - <entry>yes</entry> - <entry>yes</entry> - </row> - - </tbody> - </tgroup> - </table> - </para> - - </listitem> - </itemizedlist> -</para> - -<para> - The list of actions files to be used are defined in the main configuration - file, and are processed in the order they are defined (e.g. - <filename>default.action</filename> is typically processed before - <filename>user.action</filename>). The content of these can all be viewed and - edited from <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink>. - The over-riding principle when applying actions, is that the last action that - matches a given URL wins. The broadest, most general rules go first - (defined in <filename>default.action</filename>), - followed by any exceptions (typically also in - <filename>default.action</filename>), which are then followed lastly by any - local preferences (typically in <emphasis>user</emphasis><filename>.action</filename>). - Generally, <filename>user.action</filename> has the last word. - </para> - -<para> - An actions file typically has multiple sections. If you want to use - <quote>aliases</quote> in an actions file, you have to place the (optional) - <link linkend="aliases">alias section</link> at the top of that file. - Then comes the default set of rules which will apply universally to all - sites and pages (be <emphasis>very careful</emphasis> with using such a - universal set in <filename>user.action</filename> or any other actions file after - <filename>default.action</filename>, because it will override the result - from consulting any previous file). And then below that, - exceptions to the defined universal policies. You can regard - <filename>user.action</filename> as an appendix to <filename>default.action</filename>, - with the advantage that it is a separate file, which makes preserving your - personal settings across <application>Privoxy</application> upgrades easier. -</para> - -<para> - Actions can be used to block anything you want, including ads, banners, or - just some obnoxious URL whose content 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), content can be modified, some JavaScripts tamed, user-tracking - fooled, and much more. See below for a <link linkend="actions">complete list - of actions</link>. -</para> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2> -<title>Finding the Right Mix</title> -<para> - Note that some <link linkend="actions">actions</link>, like cookie suppression - or script disabling, may render some sites unusable that rely on these - techniques to work properly. Finding the right mix of actions is not always easy and - certainly a matter of personal taste. And, things can always change, requiring - refinements in the configuration. In general, it can be said that the more - <quote>aggressive</quote> your default settings (in the top section of the - actions file) are, the more exceptions for <quote>trusted</quote> sites you - will have to make later. If, for example, you want to crunch all cookies per - default, you'll have to make exceptions from that rule for sites that you - regularly use and that require cookies for actually useful purposes, like maybe - your bank, favorite shop, or newspaper. -</para> - -<para> - We have tried to provide you with reasonable rules to start from in the - distribution actions files. But there is no general rule of thumb on these - things. There just are too many variables, and sites are constantly changing. - Sooner or later you will want to change the rules (and read this chapter again :). -</para> -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2> -<title>How to Edit</title> -<para> - The easiest way to edit the actions files is with a browser by - using our browser-based editor, which can be reached from <ulink - url="http://config.privoxy.org/show-status%22%3Ehttp://config.privoxy.org/show-st...</ulink>. - Note: the config file option <link - linkend="enable-edit-actions">enable-edit-actions</link> must be enabled for - this to work. The editor allows both fine-grained control over every single - feature on a per-URL basis, and easy choosing from wholesale sets of defaults - like <quote>Cautious</quote>, <quote>Medium</quote> or - <quote>Advanced</quote>. Warning: the <quote>Advanced</quote> setting is more - aggressive, and will be more likely to cause problems for some sites. - Experienced users only! - </para> - -<para> - If you prefer plain text editing to GUIs, you can of course also directly edit the - the actions files with your favorite text editor. Look at - <filename>default.action</filename> which is richly commented with many - good examples. -</para> -</sect2> - - -<sect2 id="actions-apply"> -<title>How Actions are Applied to Requests</title> -<para> - Actions files are divided into sections. There are special sections, - like the <quote><link linkend="aliases">alias</link></quote> sections which will - be discussed later. For now let's concentrate on regular sections: They have a - heading line (often split up to multiple lines for readability) which consist - of a list of actions, separated by whitespace and enclosed in curly braces. - Below that, there is a list of URL and tag patterns, each on a separate line. -</para> - -<para> - To determine which actions apply to a request, the URL of the request is - compared to all URL patterns in each <quote>action file</quote>. - Every time it matches, the list of applicable actions for the request is - incrementally updated, using the heading of the section in which the - pattern is located. The same is done again for tags and tag patterns later on. -</para> - -<para> - If multiple applying sections set the same action differently, - the last match wins. If not, the effects are aggregated. - E.g. a URL might match a regular section with a heading line of <literal>{ - +<link linkend="handle-as-image">handle-as-image</link> }</literal>, - then later another one with just <literal>{ - +<link linkend="block">block</link> }</literal>, resulting - in <emphasis>both</emphasis> actions to apply. And there may well be - cases where you will want to combine actions together. Such a section then - might look like: -</para> - - <para> - <screen> - { +<literal>handle-as-image</literal> +<literal>block{Banner ads.}</literal> } - # Block these as if they were images. Send no block page. - banners.example.com - media.example.com/.*banners - .example.com/images/ads/</screen> - </para> - -<para> - You can trace this process for URL patterns and any given URL by visiting <ulink - url="http://config.privoxy.org/show-url-info%22%3Ehttp://config.privoxy.org/show-...</ulink>. -</para> - -<para> - Examples and more detail on this is provided in the Appendix, <link linkend="ACTIONSANAT"> - Troubleshooting: Anatomy of an Action</link> section. -</para> -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="af-patterns"> -<title>Patterns</title> -<para> - As mentioned, <application>Privoxy</application> uses <quote>patterns</quote> - to determine what <emphasis>actions</emphasis> might apply to which sites and - pages your browser attempts to access. These <quote>patterns</quote> use wild - card type <emphasis>pattern</emphasis> matching to achieve a high degree of - flexibility. This allows one expression to be expanded and potentially match - against many similar patterns. -</para> - -<para> - Generally, an URL pattern has the form - <literal><domain>/<path></literal>, where both the - <literal><domain></literal> and <literal><path></literal> are - optional. (This is why the special <literal>/</literal> pattern matches all - URLs). Note that the protocol portion of the URL pattern (e.g. - <literal>http://</literal>) should <emphasis>not</emphasis> be included in - the pattern. This is assumed already! -</para> -<para> - The pattern matching syntax is different for the domain and path parts of - the URL. The domain part uses a simple globbing type matching technique, - while the path part uses more flexible - <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular - Expressions</quote></ulink> (POSIX 1003.2). -</para> - -<variablelist> - <varlistentry> - <term><literal>www.example.com/</literal></term> - <listitem> - <para> - is a domain-only pattern and will match any request to <literal>www.example.com</literal>, - regardless of which document on that server is requested. So ALL pages in - this domain would be covered by the scope of this action. Note that a - simple <literal>example.com</literal> is different and would NOT match. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>www.example.com</literal></term> - <listitem> - <para> - means exactly the same. For domain-only patterns, the trailing <literal>/</literal> may - be omitted. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>www.example.com/index.html</literal></term> - <listitem> - <para> - matches all the documents on <literal>www.example.com</literal> - whose name starts with <literal>/index.html</literal>. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>www.example.com/index.html$</literal></term> - <listitem> - <para> - matches only the single document <literal>/index.html</literal> - on <literal>www.example.com</literal>. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>/index.html$</literal></term> - <listitem> - <para> - matches the document <literal>/index.html</literal>, regardless of the domain, - i.e. on <emphasis>any</emphasis> web server anywhere. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>index.html</literal></term> - <listitem> - <para> - matches nothing, since it would be interpreted as a domain name and - there is no top-level domain called <literal>.html</literal>. So its - a mistake. - </para> - </listitem> - </varlistentry> -</variablelist> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3><title>The Domain Pattern</title> - -<para> - The matching of the domain part offers some flexible options: if the - domain starts or ends with a dot, it becomes unanchored at that end. - For example: -</para> - -<variablelist> - <varlistentry> - <term><literal>.example.com</literal></term> - <listitem> - <para> - matches any domain with first-level domain <literal>com</literal> - and second-level domain <literal>example</literal>. - For example <literal>www.example.com</literal>, - <literal>example.com</literal> and <literal>foo.bar.baz.example.com</literal>. - Note that it wouldn't match if the second-level domain was <literal>another-example</literal>. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>www.</literal></term> - <listitem> - <para> - matches any domain that <emphasis>STARTS</emphasis> with - <literal>www.</literal> (It also matches the domain - <literal>www</literal> but most of the time that doesn't matter.) - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>.example.</literal></term> - <listitem> - <para> - matches any domain that <emphasis>CONTAINS</emphasis> <literal>.example.</literal>. - And, by the way, also included would be any files or documents that exist - within that domain since no path limitations are specified. (Correctly - speaking: It matches any FQDN that contains <literal>example</literal> as - a domain.) This might be <literal>www.example.com</literal>, - <literal>news.example.de</literal>, or - <literal>www.example.net/cgi/testing.pl</literal> for instance. All these - cases are matched. - </para> - </listitem> - </varlistentry> -</variablelist> - -<para> - Additionally, there are wild-cards that you can use in the domain names - themselves. These work similarly to shell globbing type wild-cards: - <quote>*</quote> represents zero or more arbitrary characters (this is - equivalent to the - <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular - Expression</quote></ulink> based syntax of <quote>.*</quote>), - <quote>?</quote> represents any single character (this is equivalent to the - regular expression syntax of a simple <quote>.</quote>), and you can define - <quote>character classes</quote> in square brackets which is similar to - the same regular expression technique. All of this can be freely mixed: -</para> - -<variablelist> - <varlistentry> - <term><literal>ad*.example.com</literal></term> - <listitem> - <para> - matches <quote>adserver.example.com</quote>, - <quote>ads.example.com</quote>, etc but not <quote>sfads.example.com</quote> - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>*ad*.example.com</literal></term> - <listitem> - <para> - matches all of the above, and then some. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>.?pix.com</literal></term> - <listitem> - <para> - matches <literal>www.ipix.com</literal>, - <literal>pictures.epix.com</literal>, <literal>a.b.c.d.e.upix.com</literal> etc. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>www[1-9a-ez].example.c*</literal></term> - <listitem> - <para> - matches <literal>www1.example.com</literal>, - <literal>www4.example.cc</literal>, <literal>wwwd.example.cy</literal>, - <literal>wwwz.example.com</literal> etc., but <emphasis>not</emphasis> - <literal>wwww.example.com</literal>. - </para> - </listitem> - </varlistentry> -</variablelist> - -<para> - While flexible, this is not the sophistication of full regular expression based syntax. -</para> - -</sect3> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3><title>The Path Pattern</title> - -<para> - <application>Privoxy</application> uses <quote>modern</quote> POSIX 1003.2 - <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular - Expressions</quote></ulink> for matching the path portion (after the slash), - and is thus more flexible. -</para> - -<para> - There is an <link linkend="regex">Appendix</link> with a brief quick-start into regular - expressions, you also might want to have a look at your operating system's documentation - on regular expressions (try <literal>man re_format</literal>). -</para> - -<para> - Note that the path pattern is automatically left-anchored at the <quote>/</quote>, - i.e. it matches as if it would start with a <quote>^</quote> (regular expression speak - for the beginning of a line). -</para> - -<para> - Please also note that matching in the path is <emphasis>CASE INSENSITIVE</emphasis> - by default, but you can switch to case sensitive at any point in the pattern by using the - <quote>(?-i)</quote> switch: <literal>www.example.com/(?-i)PaTtErN.*</literal> will match - only documents whose path starts with <literal>PaTtErN</literal> in - <emphasis>exactly</emphasis> this capitalization. -</para> - -<variablelist> - <varlistentry> - <term><literal>.example.com/.*</literal></term> - <listitem> - <para> - Is equivalent to just <quote>.example.com</quote>, since any documents - within that domain are matched with or without the <quote>.*</quote> - regular expression. This is redundant - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>.example.com/.*/index.html$</literal></term> - <listitem> - <para> - Will match any page in the domain of <quote>example.com</quote> that is - named <quote>index.html</quote>, and that is part of some path. For - example, it matches <quote>www.example.com/testing/index.html</quote> but - NOT <quote>www.example.com/index.html</quote> because the regular - expression called for at least two <quote>/'s</quote>, thus the path - requirement. It also would match - <quote>www.example.com/testing/index_html</quote>, because of the - special meta-character <quote>.</quote>. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>.example.com/(.*/)?index.html$</literal></term> - <listitem> - <para> - This regular expression is conditional so it will match any page - named <quote>index.html</quote> regardless of path which in this case can - have one or more <quote>/'s</quote>. And this one must contain exactly - <quote>.html</quote> (but does not have to end with that!). - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>.example.com/(.*/)(ads|banners?|junk)</literal></term> - <listitem> - <para> - This regular expression will match any path of <quote>example.com</quote> - that contains any of the words <quote>ads</quote>, <quote>banner</quote>, - <quote>banners</quote> (because of the <quote>?</quote>) or <quote>junk</quote>. - The path does not have to end in these words, just contain them. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term><literal>.example.com/(.*/)(ads|banners?|junk)/.*.(jpe?g|gif|png)$</literal></term> - <listitem> - <para> - This is very much the same as above, except now it must end in either - <quote>.jpg</quote>, <quote>.jpeg</quote>, <quote>.gif</quote> or <quote>.png</quote>. So this - one is limited to common image formats. - </para> - </listitem> - </varlistentry> - -</variablelist> -<para> - There are many, many good examples to be found in <filename>default.action</filename>, - and more tutorials below in <link linkend="regex">Appendix on regular expressions</link>. -</para> - -</sect3> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 id="tag-pattern"><title>The Tag Pattern</title> - -<para> - Tag patterns are used to change the applying actions based on the - request's tags. Tags can be created with either the - <link linkend="CLIENT-HEADER-TAGGER">client-header-tagger</link> - or the <link linkend="SERVER-HEADER-TAGGER">server-header-tagger</link> action. -</para> - -<para> - Tag patterns have to start with <quote>TAG:</quote>, so &my-app; - can tell them apart from URL patterns. Everything after the colon - including white space, is interpreted as a regular expression with - path pattern syntax, except that tag patterns aren't left-anchored - automatically (&my-app; doesn't silently add a <quote>^</quote>, - you have to do it yourself if you need it). -</para> - -<para> - To match all requests that are tagged with <quote>foo</quote> - your pattern line should be <quote>TAG:^foo$</quote>, - <quote>TAG:foo</quote> would work as well, but it would also - match requests whose tags contain <quote>foo</quote> somewhere. - <quote>TAG: foo</quote> wouldn't work as it requires white space. -</para> - -<para> - Sections can contain URL and tag patterns at the same time, - but tag patterns are checked after the URL patterns and thus - always overrule them, even if they are located before the URL patterns. -</para> - -<para> - Once a new tag is added, Privoxy checks right away if it's matched by one - of the tag patterns and updates the action settings accordingly. As a result - tags can be used to activate other tagger actions, as long as these other - taggers look for headers that haven't already be parsed. -</para> - -<para> - For example you could tag client requests which use the - <literal>POST</literal> method, - then use this tag to activate another tagger that adds a tag if cookies - are sent, and then use a block action based on the cookie tag. This allows - the outcome of one action, to be input into a subsequent action. However if - you'd reverse the position of the described taggers, and activated the - method tagger based on the cookie tagger, no method tags would be created. - The method tagger would look for the request line, but at the time - the cookie tag is created, the request line has already been parsed. -</para> - -<para> - While this is a limitation you should be aware of, this kind of - indirection is seldom needed anyway and even the example doesn't - make too much sense. -</para> - -</sect3> - -</sect2> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="actions"> -<title>Actions</title> -<para> - All actions are disabled by default, until they are explicitly enabled - somewhere in an actions file. Actions are turned on if preceded with a - <quote>+</quote>, and turned off if preceded with a <quote>-</quote>. So a - <literal>+action</literal> means <quote>do that action</quote>, e.g. - <literal>+block</literal> means <quote>please block URLs that match the - following patterns</quote>, and <literal>-block</literal> means <quote>don't - block URLs that match the following patterns, even if <literal>+block</literal> - previously applied.</quote> - -</para> - -<para> - Again, actions are invoked by placing them on a line, enclosed in curly braces and - separated by whitespace, like in - <literal>{+some-action -some-other-action{some-parameter}}</literal>, - followed by a list of URL patterns, one per line, to which they apply. - Together, the actions line and the following pattern lines make up a section - of the actions file. -</para> - -<para> - Actions fall into three categories: -</para> - -<para> - <itemizedlist> - <listitem> - <para> - Boolean, i.e the action can only be <quote>enabled</quote> or - <quote>disabled</quote>. Syntax: - </para> - <para> - <screen> - +<replaceable class="function">name</replaceable> # enable action <replaceable class="parameter">name</replaceable> - -<replaceable class="function">name</replaceable> # disable action <replaceable class="parameter">name</replaceable></screen> - </para> - <para> - Example: <literal>+handle-as-image</literal> - </para> - </listitem> - - - <listitem> - <para> - Parameterized, where some value is required in order to enable this type of action. - Syntax: - </para> - <para> - <screen> - +<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>} # enable action and set parameter to <replaceable class="parameter">param</replaceable>, - # overwriting parameter from previous match if necessary - -<replaceable class="function">name</replaceable> # disable action. The parameter can be omitted</screen> - </para> - <para> - Note that if the URL matches multiple positive forms of a parameterized action, - the last match wins, i.e. the params from earlier matches are simply ignored. - </para> - <para> - Example: <literal>+hide-user-agent{Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.4) Gecko/20070602 Firefox/2.0.0.4}</literal> - </para> - </listitem> - - <listitem> - <para> - Multi-value. These look exactly like parameterized actions, - but they behave differently: If the action applies multiple times to the - same URL, but with different parameters, <emphasis>all</emphasis> the parameters - from <emphasis>all</emphasis> matches are remembered. This is used for actions - that can be executed for the same request repeatedly, like adding multiple - headers, or filtering through multiple filters. Syntax: - </para> - <para> - <screen> - +<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>} # enable action and add <replaceable class="parameter">param</replaceable> to the list of parameters - -<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>} # remove the parameter <replaceable class="parameter">param</replaceable> from the list of parameters - # If it was the last one left, disable the action. - <replaceable class="parameter">-name</replaceable> # disable this action completely and remove all parameters from the list</screen> - </para> - <para> - Examples: <literal>+add-header{X-Fun-Header: Some text}</literal> and - <literal>+filter{html-annoyances}</literal> - </para> - </listitem> - - </itemizedlist> -</para> - -<para> - If nothing is specified in any actions file, no <quote>actions</quote> are - taken. So in this case <application>Privoxy</application> would just be a - normal, non-blocking, non-filtering proxy. You must specifically enable the - privacy and blocking features you need (although the provided default actions - files will give a good starting point). -</para> - -<para> - Later defined action sections always over-ride earlier ones of the same type. - So exceptions to any rules you make, should come in the latter part of the file (or - in a file that is processed later when using multiple actions files such - as <filename>user.action</filename>). For multi-valued actions, the actions - are applied in the order they are specified. Actions files are processed in - the order they are defined in <filename>config</filename> (the default - installation has three actions files). It also quite possible for any given - URL to match more than one <quote>pattern</quote> (because of wildcards and - regular expressions), and thus to trigger more than one set of actions! Last - match wins. -</para> - -<!-- start actions listing --> -<para> - The list of valid <application>Privoxy</application> actions are: -</para> - - -<!-- ********************************************************** --> -<!-- Please note the below defined actions use id's that are --> -<!-- probably linked from other places, so please don't change. --> -<!-- --> -<!-- ********************************************************** --> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect3 renderas="sect4" id="add-header"> -<title>add-header</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Confuse log analysis, custom applications</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Sends a user defined HTTP header to the web server. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Multi-value.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Any string value is possible. Validity of the defined HTTP headers is not checked. - It is recommended that you use the <quote><literal>X-</literal></quote> prefix - for custom headers. - </para> - </listitem> - </varlistentry> - -<varlistentry> - <term>Notes:</term> - <listitem> - <para> - This action may be specified multiple times, in order to define multiple - headers. This is rarely needed for the typical user. If you don't know what - <quote>HTTP headers</quote> are, you definitely don't need to worry about this - one. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+add-header{X-User-Tracking: sucks}</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="block"> -<title>block</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Block ads or other unwanted content</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Requests for URLs to which this action applies are blocked, i.e. the - requests are trapped by &my-app; and the requested URL is never retrieved, - but is answered locally with a substitute page or image, as determined by - the <literal><link - linkend="handle-as-image">handle-as-image</link></literal>, - <literal><link - linkend="set-image-blocker">set-image-blocker</link></literal>, and - <literal><link - linkend="handle-as-empty-document">handle-as-empty-document</link></literal> actions. - - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para>A block reason that should be given to the user.</para> - </listitem> - </varlistentry> - -<varlistentry> - <term>Notes:</term> - <listitem> - <para> - <application>Privoxy</application> sends a special <quote>BLOCKED</quote> page - for requests to blocked pages. This page contains the block reason given as - parameter, a link to find out why the block action applies, and a click-through - to the blocked content (the latter only if the force feature is available and - enabled). - </para> - <para> - A very important exception occurs if <emphasis>both</emphasis> - <literal>block</literal> and <literal><link linkend="handle-as-image">handle-as-image</link></literal>, - apply to the same request: it will then be replaced by an image. If - <literal><link linkend="set-image-blocker">set-image-blocker</link></literal> - (see below) also applies, the type of image will be determined by its parameter, - if not, the standard checkerboard pattern is sent. - </para> - <para> - It is important to understand this process, in order - to understand how <application>Privoxy</application> deals with - ads and other unwanted content. Blocking is a core feature, and one - upon which various other features depend. - </para> - <para> - The <literal><link linkend="filter">filter</link></literal> - action can perform a very similar task, by <quote>blocking</quote> - banner images and other content through rewriting the relevant URLs in the - document's HTML source, so they don't get requested in the first place. - Note that this is a totally different technique, and it's easy to confuse the two. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen>{+block{No nasty stuff for you.}} -# Block and replace with "blocked" page - .nasty-stuff.example.com - -{+block{Doubleclick banners.} +handle-as-image} -# Block and replace with image - .ad.doubleclick.net - .ads.r.us/banners/ - -{+block{Layered ads.} +handle-as-empty-document} -# Block and then ignore - adserver.example.net/.*.js$</screen> - </para> - </listitem> - </varlistentry> - - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="change-x-forwarded-for"> -<title>change-x-forwarded-for</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Improve privacy by not forwarding the source of the request in the HTTP headers.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes the <quote>X-Forwarded-For:</quote> HTTP header from the client request, - or adds a new one. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <itemizedlist> - <listitem> - <para><quote>block</quote> to delete the header.</para> - </listitem> - <listitem> - <para> - <quote>add</quote> to create the header (or append - the client's IP address to an already existing one). - </para> - </listitem> - </itemizedlist> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - It is safe and recommended to use <literal>block</literal>. - </para> - <para> - Forwarding the source address of the request may make - sense in some multi-user setups but is also a privacy risk. - </para> - </listitem> - </varlistentry> - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+change-x-forwarded-for{block}</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="client-header-filter"> -<title>client-header-filter</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Rewrite or remove single client headers. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - All client headers to which this action applies are filtered on-the-fly through - the specified regular expression based substitutions. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - The name of a client-header filter, as defined in one of the - <link linkend="filter-file">filter files</link>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Client-header filters are applied to each header on its own, not to - all at once. This makes it easier to diagnose problems, but on the downside - you can't write filters that only change header x if header y's value is z. - You can do that by using tags though. - </para> - <para> - Client-header filters are executed after the other header actions have finished - and use their output as input. - </para> - <para> - If the request URL gets changed, &my-app; will detect that and use the new - one. This can be used to rewrite the request destination behind the client's - back, for example to specify a Tor exit relay for certain requests. - </para> - <para> - Please refer to the <link linkend="filter-file">filter file chapter</link> - to learn which client-header filters are available by default, and how to - create your own. - </para> - - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen> -# Hide Tor exit notation in Host and Referer Headers -{+client-header-filter{hide-tor-exit-notation}} -/ - </screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="client-header-tagger"> -<title>client-header-tagger</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Block requests based on their headers. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Client headers to which this action applies are filtered on-the-fly through - the specified regular expression based substitutions, the result is used as - tag. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - The name of a client-header tagger, as defined in one of the - <link linkend="filter-file">filter files</link>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Client-header taggers are applied to each header on its own, - and as the header isn't modified, each tagger <quote>sees</quote> - the original. - </para> - <para> - Client-header taggers are the first actions that are executed - and their tags can be used to control every other action. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen> -# Tag every request with the User-Agent header -{+client-header-tagger{user-agent}} -/ - -# Tagging itself doesn't change the action -# settings, sections with TAG patterns do: -# -# If it's a download agent, use a different forwarding proxy, -# show the real User-Agent and make sure resume works. -{+forward-override{forward-socks5 10.0.0.2:2222 .} \ - -hide-if-modified-since \ - -overwrite-last-modified \ - -hide-user-agent \ - -filter \ - -deanimate-gifs \ -} -TAG:^User-Agent: NetBSD-ftp/ -TAG:^User-Agent: Novell ZYPP Installer -TAG:^User-Agent: RPM APT-HTTP/ -TAG:^User-Agent: fetch libfetch/ -TAG:^User-Agent: Ubuntu APT-HTTP/ -TAG:^User-Agent: MPlayer/ - </screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="content-type-overwrite"> -<title>content-type-overwrite</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Stop useless download menus from popping up, or change the browser's rendering mode</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Replaces the <quote>Content-Type:</quote> HTTP server header. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Any string. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The <quote>Content-Type:</quote> HTTP server header is used by the - browser to decide what to do with the document. The value of this - header can cause the browser to open a download menu instead of - displaying the document by itself, even if the document's format is - supported by the browser. - </para> - <para> - The declared content type can also affect which rendering mode - the browser chooses. If XHTML is delivered as <quote>text/html</quote>, - many browsers treat it as yet another broken HTML document. - If it is send as <quote>application/xml</quote>, browsers with - XHTML support will only display it, if the syntax is correct. - </para> - <para> - If you see a web site that proudly uses XHTML buttons, but sets - <quote>Content-Type: text/html</quote>, you can use &my-app; - to overwrite it with <quote>application/xml</quote> and validate - the web master's claim inside your XHTML-supporting browser. - If the syntax is incorrect, the browser will complain loudly. - </para> - <para> - You can also go the opposite direction: if your browser prints - error messages instead of rendering a document falsely declared - as XHTML, you can overwrite the content type with - <quote>text/html</quote> and have it rendered as broken HTML document. - </para> - <para> - By default <literal>content-type-overwrite</literal> only replaces - <quote>Content-Type:</quote> headers that look like some kind of text. - If you want to overwrite it unconditionally, you have to combine it with - <literal><link linkend="force-text-mode">force-text-mode</link></literal>. - This limitation exists for a reason, think twice before circumventing it. - </para> - <para> - Most of the time it's easier to replace this action with a custom - <literal><link linkend="server-header-filter">server-header filter</link></literal>. - It allows you to activate it for every document of a certain site and it will still - only replace the content types you aimed at. - </para> - <para> - Of course you can apply <literal>content-type-overwrite</literal> - to a whole site and then make URL based exceptions, but it's a lot - more work to get the same precision. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (sections):</term> - <listitem> - <para> - <screen># Check if www.example.net/ really uses valid XHTML -{ +content-type-overwrite{application/xml} } -www.example.net/ - -# but leave the content type unmodified if the URL looks like a style sheet -{-content-type-overwrite} -www.example.net/.*.css$ -www.example.net/.*style -</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="crunch-client-header"> -<!-- -new action ---> -<title>crunch-client-header</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Remove a client header <application>Privoxy</application> has no dedicated action for.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes every header sent by the client that contains the string the user supplied as parameter. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Any string. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This action allows you to block client headers for which no dedicated - <application>Privoxy</application> action exists. - <application>Privoxy</application> will remove every client header that - contains the string you supplied as parameter. - </para> - <para> - Regular expressions are <emphasis>not supported</emphasis> and you can't - use this action to block different headers in the same request, unless - they contain the same string. - </para> - <para> - <literal>crunch-client-header</literal> is only meant for quick tests. - If you have to block several different headers, or only want to modify - parts of them, you should use a - <literal><link linkend="client-header-filter">client-header filter</link></literal>. - </para> - <warning> - <para> - Don't block any header without understanding the consequences. - </para> - </warning> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen># Block the non-existent "Privacy-Violation:" client header -{ +crunch-client-header{Privacy-Violation:} } -/ - </screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="crunch-if-none-match"> -<title>crunch-if-none-match</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Prevent yet another way to track the user's steps between sessions.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes the <quote>If-None-Match:</quote> HTTP client header. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Removing the <quote>If-None-Match:</quote> HTTP client header - is useful for filter testing, where you want to force a real - reload instead of getting status code <quote>304</quote> which - would cause the browser to use a cached copy of the page. - </para> - <para> - It is also useful to make sure the header isn't used as a cookie - replacement (unlikely but possible). - </para> - <para> - Blocking the <quote>If-None-Match:</quote> header shouldn't cause any - caching problems, as long as the <quote>If-Modified-Since:</quote> header - isn't blocked or missing as well. - </para> - <para> - It is recommended to use this action together with - <literal><link linkend="hide-if-modified-since">hide-if-modified-since</link></literal> - and - <literal><link linkend="overwrite-last-modified">overwrite-last-modified</link></literal>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen># Let the browser revalidate cached documents but don't -# allow the server to use the revalidation headers for user tracking. -{+hide-if-modified-since{-60} \ - +overwrite-last-modified{randomize} \ - +crunch-if-none-match} -/ </screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="crunch-incoming-cookies"> -<title>crunch-incoming-cookies</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Prevent the web server from setting HTTP cookies on your system - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes any <quote>Set-Cookie:</quote> HTTP headers from server replies. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This action is only concerned with <emphasis>incoming</emphasis> HTTP cookies. For - <emphasis>outgoing</emphasis> HTTP cookies, use - <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal>. - Use <emphasis>both</emphasis> to disable HTTP cookies completely. - </para> - <para> - It makes <emphasis>no sense at all</emphasis> to use this action in conjunction - with the <literal><link linkend="session-cookies-only">session-cookies-only</link></literal> action, - since it would prevent the session cookies from being set. See also - <literal><link linkend="filter-content-cookies">filter-content-cookies</link></literal>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+crunch-incoming-cookies</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="crunch-server-header"> -<title>crunch-server-header</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Remove a server header <application>Privoxy</application> has no dedicated action for.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes every header sent by the server that contains the string the user supplied as parameter. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Any string. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This action allows you to block server headers for which no dedicated - <application>Privoxy</application> action exists. <application>Privoxy</application> - will remove every server header that contains the string you supplied as parameter. - </para> - <para> - Regular expressions are <emphasis>not supported</emphasis> and you can't - use this action to block different headers in the same request, unless - they contain the same string. - </para> - <para> - <literal>crunch-server-header</literal> is only meant for quick tests. - If you have to block several different headers, or only want to modify - parts of them, you should use a custom - <literal><link linkend="server-header-filter">server-header filter</link></literal>. - </para> - <warning> - <para> - Don't block any header without understanding the consequences. - </para> - </warning> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen># Crunch server headers that try to prevent caching -{ +crunch-server-header{no-cache} } -/ </screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="crunch-outgoing-cookies"> -<title>crunch-outgoing-cookies</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Prevent the web server from reading any HTTP cookies from your system - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes any <quote>Cookie:</quote> HTTP headers from client requests. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This action is only concerned with <emphasis>outgoing</emphasis> HTTP cookies. For - <emphasis>incoming</emphasis> HTTP cookies, use - <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal>. - Use <emphasis>both</emphasis> to disable HTTP cookies completely. - </para> - <para> - It makes <emphasis>no sense at all</emphasis> to use this action in conjunction - with the <literal><link linkend="session-cookies-only">session-cookies-only</link></literal> action, - since it would prevent the session cookies from being read. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+crunch-outgoing-cookies</screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="deanimate-gifs"> -<title>deanimate-gifs</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Stop those annoying, distracting animated GIF images.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - De-animate GIF animations, i.e. reduce them to their first or last image. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - <quote>last</quote> or <quote>first</quote> - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This will also shrink the images considerably (in bytes, not pixels!). If - the option <quote>first</quote> is given, the first frame of the animation - is used as the replacement. If <quote>last</quote> is given, the last - frame of the animation is used instead, which probably makes more sense for - most banner animations, but also has the risk of not showing the entire - last frame (if it is only a delta to an earlier frame). - </para> - <para> - You can safely use this action with patterns that will also match non-GIF - objects, because no attempt will be made at anything that doesn't look like - a GIF. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+deanimate-gifs{last}</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="downgrade-http-version"> -<title>downgrade-http-version</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Work around (very rare) problems with HTTP/1.1</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Downgrades HTTP/1.1 client requests and server replies to HTTP/1.0. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - -<varlistentry> - <term>Notes:</term> - <listitem> - <para> - This is a left-over from the time when <application>Privoxy</application> - didn't support important HTTP/1.1 features well. It is left here for the - unlikely case that you experience HTTP/1.1 related problems with some server - out there. Not all HTTP/1.1 features and requirements are supported yet, - so there is a chance you might need this action. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen>{+downgrade-http-version} -problem-host.example.com</screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="fast-redirects"> -<title>fast-redirects</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Fool some click-tracking scripts and speed up indirect links.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Detects redirection URLs and redirects the browser without contacting - the redirection server first. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <itemizedlist> - <listitem> - <para> - <quote>simple-check</quote> to just search for the string <quote>http://</quote> - to detect redirection URLs. - </para> - </listitem> - <listitem> - <para> - <quote>check-decoded-url</quote> to decode URLs (if necessary) before searching - for redirection URLs. - </para> - </listitem> - </itemizedlist> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Many sites, like yahoo.com, don't just link to other sites. Instead, they - will link to some script on their own servers, giving the destination as a - parameter, which will then redirect you to the final target. URLs - resulting from this scheme typically look like: - <quote>http://www.example.org/click-tracker.cgi?target=http%3a//www.example.net/</quote>. - </para> - <para> - Sometimes, there are even multiple consecutive redirects encoded in the - URL. These redirections via scripts make your web browsing more traceable, - since the server from which you follow such a link can see where you go - to. Apart from that, valuable bandwidth and time is wasted, while your - browser asks the server for one redirect after the other. Plus, it feeds - the advertisers. - </para> - <para> - This feature is currently not very smart and is scheduled for improvement. - If it is enabled by default, you will have to create some exceptions to - this action. It can lead to failures in several ways: - </para> - <para> - Not every URLs with other URLs as parameters is evil. - Some sites offer a real service that requires this information to work. - For example a validation service needs to know, which document to validate. - <literal>fast-redirects</literal> assumes that every URL parameter that - looks like another URL is a redirection target, and will always redirect to - the last one. Most of the time the assumption is correct, but if it isn't, - the user gets redirected anyway. - </para> - <para> - Another failure occurs if the URL contains other parameters after the URL parameter. - The URL: - <quote>http://www.example.org/?redirect=http%3a//www.example.net/&foo=bar</quote>. - contains the redirection URL <quote>http://www.example.net/</quote>, - followed by another parameter. <literal>fast-redirects</literal> doesn't know that - and will cause a redirect to <quote>http://www.example.net/&foo=bar</quote>. - Depending on the target server configuration, the parameter will be silently ignored - or lead to a <quote>page not found</quote> error. You can prevent this problem by - first using the <literal><link linkend="redirect">redirect</link></literal> action - to remove the last part of the URL, but it requires a little effort. - </para> - <para> - To detect a redirection URL, <literal>fast-redirects</literal> only - looks for the string <quote>http://</quote>, either in plain text - (invalid but often used) or encoded as <quote>http%3a//</quote>. - Some sites use their own URL encoding scheme, encrypt the address - of the target server or replace it with a database id. In theses cases - <literal>fast-redirects</literal> is fooled and the request reaches the - redirection server where it probably gets logged. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen> - { +fast-redirects{simple-check} } - one.example.com - - { +fast-redirects{check-decoded-url} } - another.example.com/testing</screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="filter"> -<title>filter</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Get rid of HTML and JavaScript annoyances, banner advertisements (by size), - do fun text replacements, add personalized effects, etc.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - All instances of text-based type, most notably HTML and JavaScript, to which - this action applies, can be filtered on-the-fly through the specified regular - expression based substitutions. (Note: as of version 3.0.3 plain text documents - are exempted from filtering, because web servers often use the - <literal>text/plain</literal> MIME type for all files whose type they don't know.) - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - The name of a content filter, as defined in the <link linkend="filter-file">filter file</link>. - Filters can be defined in one or more files as defined by the - <literal><link linkend="filterfile">filterfile</link></literal> - option in the <link linkend="config">config file</link>. - <filename>default.filter</filename> is the collection of filters - supplied by the developers. Locally defined filters should go - in their own file, such as <filename>user.filter</filename>. - </para> - <para> - When used in its negative form, - and without parameters, <emphasis>all</emphasis> filtering is completely disabled. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - For your convenience, there are a number of pre-defined filters available - in the distribution filter file that you can use. See the examples below for - a list. - </para> - <para> - Filtering requires buffering the page content, which may appear to - slow down page rendering since nothing is displayed until all content has - passed the filters. (It does not really take longer, but seems that way - since the page is not incrementally displayed.) This effect will be more - noticeable on slower connections. - </para> - <para> - <quote>Rolling your own</quote> - filters requires a knowledge of - <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular - Expressions</quote></ulink> and - <ulink url="http://en.wikipedia.org/wiki/Html"><quote>HTML</quote></ulink>. - This is very powerful feature, and potentially very intrusive. - Filters should be used with caution, and where an equivalent - <quote>action</quote> is not available. - </para> - <para> - The amount of data that can be filtered is limited to the - <literal><link linkend="buffer-limit">buffer-limit</link></literal> - option in the main <link linkend="config">config file</link>. The - default is 4096 KB (4 Megs). Once this limit is exceeded, the buffered - data, and all pending data, is passed through unfiltered. - </para> - <para> - Inappropriate MIME types, such as zipped files, are not filtered at all. - (Again, only text-based types except plain text). Encrypted SSL data - (from HTTPS servers) cannot be filtered either, since this would violate - the integrity of the secure transaction. In some situations it might - be necessary to protect certain text, like source code, from filtering - by defining appropriate <literal>-filter</literal> exceptions. - </para> - <para> - Compressed content can't be filtered either, unless &my-app; - is compiled with zlib support (requires at least &my-app; 3.0.7), - in which case &my-app; will decompress the content before filtering - it. - </para> - <para> - If you use a &my-app; version without zlib support, but want filtering to work on - as much documents as possible, even those that would normally be sent compressed, - you must use the <literal><link linkend="prevent-compression">prevent-compression</link></literal> - action in conjunction with <literal>filter</literal>. - </para> - <para> - Content filtering can achieve some of the same effects as the - <literal><link linkend="block">block</link></literal> - action, i.e. it can be used to block ads and banners. But the mechanism - works quite differently. One effective use, is to block ad banners - based on their size (see below), since many of these seem to be somewhat - standardized. - </para> - <para> - <link linkend="contact">Feedback</link> with suggestions for new or - improved filters is particularly welcome! - </para> - <para> - The below list has only the names and a one-line description of each - predefined filter. There are <link linkend="predefined-filters">more - verbose explanations</link> of what these filters do in the <link - linkend="filter-file">filter file chapter</link>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (with filters from the distribution <filename>default.filter</filename> file). - See <link linkend="PREDEFINED-FILTERS">the Predefined Filters section</link> for - more explanation on each:</term> - <listitem> - <para> - <anchor id="filter-js-annoyances"> - <screen>+filter{js-annoyances} # Get rid of particularly annoying JavaScript abuse.</screen> - </para> - <para> - <anchor id="filter-js-events"> - <screen>+filter{js-events} # Kill all JS event bindings and timers (Radically destructive! Only for extra nasty sites).</screen> - </para> - <para> - <anchor id="filter-html-annoyances"> - <screen>+filter{html-annoyances} # Get rid of particularly annoying HTML abuse.</screen> - </para> - <para> - <anchor id="filter-content-cookies"> - <screen>+filter{content-cookies} # Kill cookies that come in the HTML or JS content.</screen> - </para> - <para> - <anchor id="filter-refresh-tags"> - <screen>+filter{refresh-tags} # Kill automatic refresh tags (for dial-on-demand setups).</screen> - </para> - <para> - <anchor id="filter-unsolicited-popups"> - <screen>+filter{unsolicited-popups} # Disable only unsolicited pop-up windows. Useful if your browser lacks this ability.</screen> - </para> - <para> - <anchor id="filter-all-popups"> - <screen>+filter{all-popups} # Kill all popups in JavaScript and HTML. Useful if your browser lacks this ability.</screen> - </para> - <para> - <anchor id="filter-img-reorder"> - <screen>+filter{img-reorder} # Reorder attributes in <img> tags to make the banners-by-* filters more effective.</screen> - </para> - <para> - <anchor id="filter-banners-by-size"> - <screen>+filter{banners-by-size} # Kill banners by size.</screen> - </para> - <para> - <anchor id="filter-banners-by-link"> - <screen>+filter{banners-by-link} # Kill banners by their links to known clicktrackers.</screen> - </para> - <para> - <anchor id="filter-webbugs"> - <screen>+filter{webbugs} # Squish WebBugs (1x1 invisible GIFs used for user tracking).</screen> - </para> - <para> - <anchor id="filter-tiny-textforms"> - <screen>+filter{tiny-textforms} # Extend those tiny textareas up to 40x80 and kill the hard wrap.</screen> - </para> - <para> - <anchor id="filter-jumping-windows"> - <screen>+filter{jumping-windows} # Prevent windows from resizing and moving themselves.</screen> - </para> - <para> - <anchor id="filter-frameset-borders"> - <screen>+filter{frameset-borders} # Give frames a border and make them resizable.</screen> - </para> - <para> - <anchor id="filter-demoronizer"> - <screen>+filter{demoronizer} # Fix MS's non-standard use of standard charsets.</screen> - </para> - <para> - <anchor id="filter-shockwave-flash"> - <screen>+filter{shockwave-flash} # Kill embedded Shockwave Flash objects.</screen> - </para> - <para> - <anchor id="filter-quicktime-kioskmode"> - <screen>+filter{quicktime-kioskmode} # Make Quicktime movies saveable.</screen> - </para> - <para> - <anchor id="filter-fun"> - <screen>+filter{fun} # Text replacements for subversive browsing fun!</screen> - </para> - <para> - <anchor id="filter-crude-parental"> - <screen>+filter{crude-parental} # Crude parental filtering. Note that this filter doesn't work reliably.</screen> - </para> - <para> - <anchor id="filter-ie-exploits"> - <screen>+filter{ie-exploits} # Disable some known Internet Explorer bug exploits.</screen> - </para> - <para> - <anchor id="filter-site-specifics"> - <screen>+filter{site-specifics} # Cure for site-specific problems. Don't apply generally!</screen> - </para> - <para> - <anchor id="filter-no-ping"> - <screen>+filter{no-ping} # Removes non-standard ping attributes in <a> and <area> tags.</screen> - </para> - <para> - <anchor id="filter-google"> - <screen>+filter{google} # CSS-based block for Google text ads. Also removes a width limitation and the toolbar advertisement.</screen> - </para> - <para> - <anchor id="filter-yahoo"> - <screen>+filter{yahoo} # CSS-based block for Yahoo text ads. Also removes a width limitation.</screen> - </para> - <para> - <anchor id="filter-msn"> - <screen>+filter{msn} # CSS-based block for MSN text ads. Also removes tracking URLs and a width limitation.</screen> - </para> - <para> - <anchor id="filter-blogspot"> - <screen>+filter{blogspot} # Cleans up some Blogspot blogs. Read the fine print before using this.</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="force-text-mode"> -<title>force-text-mode</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Force <application>Privoxy</application> to treat a document as if it was in some kind of <emphasis>text</emphasis> format. </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Declares a document as text, even if the <quote>Content-Type:</quote> isn't detected as such. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - As explained <literal><link linkend="filter">above</link></literal>, - <application>Privoxy</application> tries to only filter files that are - in some kind of text format. The same restrictions apply to - <literal><link linkend="content-type-overwrite">content-type-overwrite</link></literal>. - <literal>force-text-mode</literal> declares a document as text, - without looking at the <quote>Content-Type:</quote> first. - </para> - <warning> - <para> - Think twice before activating this action. Filtering binary data - with regular expressions can cause file damage. - </para> - </warning> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen> -+force-text-mode - </screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="forward-override"> -<title>forward-override</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Change the forwarding settings based on User-Agent or request origin</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Overrules the forward directives in the configuration file. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Multi-value.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <itemizedlist> - <listitem> - <para><quote>forward .</quote> to use a direct connection without any additional proxies.</para> - </listitem> - <listitem> - <para> - <quote>forward 127.0.0.1:8123</quote> to use the HTTP proxy listening at 127.0.0.1 port 8123. - </para> - </listitem> - <listitem> - <para> - <quote>forward-socks4a 127.0.0.1:9050 .</quote> to use the socks4a proxy listening at - 127.0.0.1 port 9050. Replace <quote>forward-socks4a</quote> with <quote>forward-socks4</quote> - to use a socks4 connection (with local DNS resolution) instead, use <quote>forward-socks5</quote> - for socks5 connections (with remote DNS resolution). - </para> - </listitem> - <listitem> - <para> - <quote>forward-socks4a 127.0.0.1:9050 proxy.example.org:8000</quote> to use the socks4a proxy - listening at 127.0.0.1 port 9050 to reach the HTTP proxy listening at proxy.example.org port 8000. - Replace <quote>forward-socks4a</quote> with <quote>forward-socks4</quote> to use a socks4 connection - (with local DNS resolution) instead, use <quote>forward-socks5</quote> - for socks5 connections (with remote DNS resolution). - </para> - </listitem> - </itemizedlist> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This action takes parameters similar to the - <link linkend="forwarding">forward</link> directives in the configuration - file, but without the URL pattern. It can be used as replacement, but normally it's only - used in cases where matching based on the request URL isn't sufficient. - </para> - <warning> - <para> - Please read the description for the <link linkend="forwarding">forward</link> directives before - using this action. Forwarding to the wrong people will reduce your privacy and increase the - chances of man-in-the-middle attacks. - </para> - <para> - If the ports are missing or invalid, default values will be used. This might change - in the future and you shouldn't rely on it. Otherwise incorrect syntax causes Privoxy - to exit. - </para> - <para> - Use the <ulink url="http://config.privoxy.org/show-url-info">show-url-info CGI page</ulink> - to verify that your forward settings do what you thought the do. - </para> - </warning> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen> -# Always use direct connections for requests previously tagged as -# <quote>User-Agent: fetch libfetch/2.0</quote> and make sure -# resuming downloads continues to work. -# This way you can continue to use Tor for your normal browsing, -# without overloading the Tor network with your FreeBSD ports updates -# or downloads of bigger files like ISOs. -# Note that HTTP headers are easy to fake and therefore their -# values are as (un)trustworthy as your clients and users. -{+forward-override{forward .} \ - -hide-if-modified-since \ - -overwrite-last-modified \ -} -TAG:^User-Agent: fetch libfetch/2.0$ - </screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="handle-as-empty-document"> -<title>handle-as-empty-document</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Mark URLs that should be replaced by empty documents <emphasis>if they get blocked</emphasis></para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - This action alone doesn't do anything noticeable. It just marks URLs. - If the <literal><link linkend="block">block</link></literal> action <emphasis>also applies</emphasis>, - the presence or absence of this mark decides whether an HTML <quote>BLOCKED</quote> - page, or an empty document will be sent to the client as a substitute for the blocked content. - The <emphasis>empty</emphasis> document isn't literally empty, but actually contains a single space. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Some browsers complain about syntax errors if JavaScript documents - are blocked with <application>Privoxy's</application> - default HTML page; this option can be used to silence them. - And of course this action can also be used to eliminate the &my-app; - BLOCKED message in frames. - </para> - <para> - The content type for the empty document can be specified with - <literal><link linkend="content-type-overwrite">content-type-overwrite{}</link></literal>, - but usually this isn't necessary. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen># Block all documents on example.org that end with ".js", -# but send an empty document instead of the usual HTML message. -{+block{Blocked JavaScript} +handle-as-empty-document} -example.org/.*.js$ - </screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="handle-as-image"> -<title>handle-as-image</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Mark URLs as belonging to images (so they'll be replaced by images <emphasis>if they do get blocked</emphasis>, rather than HTML pages)</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - This action alone doesn't do anything noticeable. It just marks URLs as images. - If the <literal><link linkend="block">block</link></literal> action <emphasis>also applies</emphasis>, - the presence or absence of this mark decides whether an HTML <quote>blocked</quote> - page, or a replacement image (as determined by the <literal><link - linkend="set-image-blocker">set-image-blocker</link></literal> action) will be sent to the - client as a substitute for the blocked content. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The below generic example section is actually part of <filename>default.action</filename>. - It marks all URLs with well-known image file name extensions as images and should - be left intact. - </para> - <para> - Users will probably only want to use the handle-as-image action in conjunction with - <literal><link linkend="block">block</link></literal>, to block sources of banners, whose URLs don't - reflect the file type, like in the second example section. - </para> - <para> - Note that you cannot treat HTML pages as images in most cases. For instance, (in-line) ad - frames require an HTML page to be sent, or they won't display properly. - Forcing <literal>handle-as-image</literal> in this situation will not replace the - ad frame with an image, but lead to error messages. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (sections):</term> - <listitem> - <para> - <screen># Generic image extensions: -# -{+handle-as-image} -/.*.(gif|jpg|jpeg|png|bmp|ico)$ - -# These don't look like images, but they're banners and should be -# blocked as images: -# -{+block{Nasty banners.} +handle-as-image} -nasty-banner-server.example.com/junk.cgi?output=trash -</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="hide-accept-language"> -<title>hide-accept-language</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Pretend to use different language settings.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes or replaces the <quote>Accept-Language:</quote> HTTP header in client requests. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Keyword: <quote>block</quote>, or any user defined value. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Faking the browser's language settings can be useful to make a - foreign User-Agent set with - <literal><link linkend="hide-user-agent">hide-user-agent</link></literal> - more believable. - </para> - <para> - However some sites with content in different languages check the - <quote>Accept-Language:</quote> to decide which one to take by default. - Sometimes it isn't possible to later switch to another language without - changing the <quote>Accept-Language:</quote> header first. - </para> - <para> - Therefore it's a good idea to either only change the - <quote>Accept-Language:</quote> header to languages you understand, - or to languages that aren't wide spread. - </para> - <para> - Before setting the <quote>Accept-Language:</quote> header - to a rare language, you should consider that it helps to - make your requests unique and thus easier to trace. - If you don't plan to change this header frequently, - you should stick to a common language. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen># Pretend to use Canadian language settings. -{+hide-accept-language{en-ca} \ -+hide-user-agent{Mozilla/5.0 (X11; U; OpenBSD i386; en-CA; rv:1.8.0.4) Gecko/20060628 Firefox/1.5.0.4} \ -} -/ </screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="hide-content-disposition"> -<title>hide-content-disposition</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Prevent download menus for content you prefer to view inside the browser.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes or replaces the <quote>Content-Disposition:</quote> HTTP header set by some servers. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Keyword: <quote>block</quote>, or any user defined value. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Some servers set the <quote>Content-Disposition:</quote> HTTP header for - documents they assume you want to save locally before viewing them. - The <quote>Content-Disposition:</quote> header contains the file name - the browser is supposed to use by default. - </para> - <para> - In most browsers that understand this header, it makes it impossible to - <emphasis>just view</emphasis> the document, without downloading it first, - even if it's just a simple text file or an image. - </para> - <para> - Removing the <quote>Content-Disposition:</quote> header helps - to prevent this annoyance, but some browsers additionally check the - <quote>Content-Type:</quote> header, before they decide if they can - display a document without saving it first. In these cases, you have - to change this header as well, before the browser stops displaying - download menus. - </para> - <para> - It is also possible to change the server's file name suggestion - to another one, but in most cases it isn't worth the time to set - it up. - </para> - <para> - This action will probably be removed in the future, - use server-header filters instead. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen># Disarm the download link in Sourceforge's patch tracker -{ -filter \ - +content-type-overwrite{text/plain}\ - +hide-content-disposition{block} } - .sourceforge.net/tracker/download.php</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="hide-if-modified-since"> -<title>hide-if-modified-since</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Prevent yet another way to track the user's steps between sessions.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes the <quote>If-Modified-Since:</quote> HTTP client header or modifies its value. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Keyword: <quote>block</quote>, or a user defined value that specifies a range of hours. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Removing this header is useful for filter testing, where you want to force a real - reload instead of getting status code <quote>304</quote>, which would cause the - browser to use a cached copy of the page. - </para> - <para> - Instead of removing the header, <literal>hide-if-modified-since</literal> can - also add or subtract a random amount of time to/from the header's value. - You specify a range of minutes where the random factor should be chosen from and - <application>Privoxy</application> does the rest. A negative value means - subtracting, a positive value adding. - </para> - <para> - Randomizing the value of the <quote>If-Modified-Since:</quote> makes - it less likely that the server can use the time as a cookie replacement, - but you will run into caching problems if the random range is too high. - </para> - <para> - It is a good idea to only use a small negative value and let - <literal><link linkend="overwrite-last-modified">overwrite-last-modified</link></literal> - handle the greater changes. - </para> - <para> - It is also recommended to use this action together with - <literal><link linkend="crunch-if-none-match">crunch-if-none-match</link></literal>, - otherwise it's more or less pointless. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen># Let the browser revalidate but make tracking based on the time less likely. -{+hide-if-modified-since{-60} \ - +overwrite-last-modified{randomize} \ - +crunch-if-none-match} -/</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="hide-from-header"> -<title>hide-from-header</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Keep your (old and ill) browser from telling web servers your email address</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes any existing <quote>From:</quote> HTTP header, or replaces it with the - specified string. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Keyword: <quote>block</quote>, or any user defined value. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The keyword <quote>block</quote> will completely remove the header - (not to be confused with the <literal><link linkend="block">block</link></literal> - action). - </para> - <para> - Alternately, you can specify any value you prefer to be sent to the web - server. If you do, it is a matter of fairness not to use any address that - is actually used by a real person. - </para> - <para> - This action is rarely needed, as modern web browsers don't send - <quote>From:</quote> headers anymore. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+hide-from-header{block}</screen> or - <screen>+hide-from-header{spam-me-senseless@sittingduck.example.com}</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="hide-referrer"> -<title>hide-referrer</title> -<anchor id="hide-referer"> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Conceal which link you followed to get to a particular site</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes the <quote>Referer:</quote> (sic) HTTP header from the client request, - or replaces it with a forged one. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <itemizedlist> - <listitem> - <para><quote>conditional-block</quote> to delete the header completely if the host has changed.</para> - </listitem> - <listitem> - <para><quote>conditional-forge</quote> to forge the header if the host has changed.</para> - </listitem> - <listitem> - <para><quote>block</quote> to delete the header unconditionally.</para> - </listitem> - <listitem> - <para><quote>forge</quote> to pretend to be coming from the homepage of the server we are talking to.</para> - </listitem> - <listitem> - <para>Any other string to set a user defined referrer.</para> - </listitem> - </itemizedlist> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - <literal>conditional-block</literal> is the only parameter, - that isn't easily detected in the server's log file. If it blocks the - referrer, the request will look like the visitor used a bookmark or - typed in the address directly. - </para> - <para> - Leaving the referrer unmodified for requests on the same host - allows the server owner to see the visitor's <quote>click path</quote>, - but in most cases she could also get that information by comparing - other parts of the log file: for example the User-Agent if it isn't - a very common one, or the user's IP address if it doesn't change between - different requests. - </para> - <para> - Always blocking the referrer, or using a custom one, can lead to - failures on servers that check the referrer before they answer any - requests, in an attempt to prevent their content from being - embedded or linked to elsewhere. - </para> - <para> - Both <literal>conditional-block</literal> and <literal>forge</literal> - will work with referrer checks, as long as content and valid referring page - are on the same host. Most of the time that's the case. - </para> - <para> - <literal>hide-referer</literal> is an alternate spelling of - <literal>hide-referrer</literal> and the two can be can be freely - substituted with each other. (<quote>referrer</quote> is the - correct English spelling, however the HTTP specification has a bug - it - requires it to be spelled as <quote>referer</quote>.) - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+hide-referrer{forge}</screen> or - <screen>+hide-referrer{http://www.yahoo.com/%7D</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="hide-user-agent"> -<title>hide-user-agent</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Try to conceal your type of browser and client operating system</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Replaces the value of the <quote>User-Agent:</quote> HTTP header - in client requests with the specified value. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - Any user-defined string. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <warning> - <para> - This can lead to problems on web sites that depend on looking at this header in - order to customize their content for different browsers (which, by the - way, is <emphasis>NOT</emphasis> the right thing to do: good web sites - work browser-independently). - </para> - </warning> - <para> - Using this action in multi-user setups or wherever different types of - browsers will access the same <application>Privoxy</application> is - <emphasis>not recommended</emphasis>. In single-user, single-browser - setups, you might use it to delete your OS version information from - the headers, because it is an invitation to exploit known bugs for your - OS. It is also occasionally useful to forge this in order to access - sites that won't let you in otherwise (though there may be a good - reason in some cases). Example of this: some MSN sites will not - let <application>Mozilla</application> enter, yet forging to a - <application>Netscape 6.1</application> user-agent works just fine. - (Must be just a silly MS goof, I'm sure :-). - </para> - <para> - More information on known user-agent strings can be found at - <ulink url="http://www.user-agents.org/">http://www.user-agents.org/</ulink> - and - <ulink url="http://en.wikipedia.org/wiki/User_agent">http://en.wikipedia.org/wiki/User_agent</ulink>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+hide-user-agent{Netscape 6.1 (X11; I; Linux 2.4.18 i686)}</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="limit-connect"> -<title>limit-connect</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Prevent abuse of <application>Privoxy</application> as a TCP proxy relay or disable SSL for untrusted sites</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Specifies to which ports HTTP CONNECT requests are allowable. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - A comma-separated list of ports or port ranges (the latter using dashes, with the minimum - defaulting to 0 and the maximum to 65K). - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - By default, i.e. if no <literal>limit-connect</literal> action applies, - <application>Privoxy</application> allows HTTP CONNECT requests to all - ports. Use <literal>limit-connect</literal> if fine-grained control - is desired for some or all destinations. - </para> - <para> - The CONNECT methods exists in HTTP to allow access to secure websites - (<quote>https://</quote> 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 server. - This means CONNECT-enabled proxies can be used as TCP relays very easily. - </para> - <para> - <application>Privoxy</application> relays HTTPS traffic without seeing - the decoded content. Websites can leverage this limitation to circumvent &my-app;'s - filters. By specifying an invalid port range you can disable HTTPS entirely. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usages:</term> - <listitem> - <!-- I had trouble getting the spacing to look right in my browser --> - <!-- I probably have the wrong font setup, bollocks. --> - <!-- Apparently the emphasis tag uses a proportional font no matter what --> - <para> - <screen>+limit-connect{443} # Port 443 is OK. -+limit-connect{80,443} # Ports 80 and 443 are OK. -+limit-connect{-3, 7, 20-100, 500-} # Ports less than 3, 7, 20 to 100 and above 500 are OK. -+limit-connect{-} # All ports are OK -+limit-connect{,} # No HTTPS/SSL traffic is allowed</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="prevent-compression"> -<title>prevent-compression</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Ensure that servers send the content uncompressed, so it can be - passed through <literal><link linkend="filter">filter</link></literal>s. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Removes the Accept-Encoding header which can be used to ask for compressed transfer. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - More and more websites send their content compressed by default, which - is generally a good idea and saves bandwidth. But the <literal><link - linkend="filter">filter</link></literal> and - <literal><link linkend="deanimate-gifs">deanimate-gifs</link></literal> - actions need access to the uncompressed data. - </para> - <para> - When compiled with zlib support (available since &my-app; 3.0.7), content that should be - filtered is decompressed on-the-fly and you don't have to worry about this action. - If you are using an older &my-app; version, or one that hasn't been compiled with zlib - support, this action can be used to convince the server to send the content uncompressed. - </para> - <para> - Most text-based instances compress very well, the size is seldom decreased by less than 50%, - for markup-heavy instances like news feeds saving more than 90% of the original size isn't - unusual. - </para> - <para> - Not using compression will therefore slow down the transfer, and you should only - enable this action if you really need it. As of &my-app; 3.0.7 it's disabled in all - predefined action settings. - </para> - <para> - Note that some (rare) ill-configured sites don't handle requests for uncompressed - documents correctly. Broken PHP applications tend to send an empty document body, - some IIS versions only send the beginning of the content. If you enable - <literal>prevent-compression</literal> per default, you might want to add - exceptions for those sites. See the example for how to do that. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (sections):</term> - <listitem> - <para> - <screen> -# Selectively turn off compression, and enable a filter -# -{ +filter{tiny-textforms} +prevent-compression } -# Match only these sites - .google. - sourceforge.net - sf.net - -# Or instead, we could set a universal default: -# -{ +prevent-compression } - / # Match all sites - -# Then maybe make exceptions for broken sites: -# -{ -prevent-compression } -.compusa.com/</screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="overwrite-last-modified"> -<title>overwrite-last-modified</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Prevent yet another way to track the user's steps between sessions.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes the <quote>Last-Modified:</quote> HTTP server header or modifies its value. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - One of the keywords: <quote>block</quote>, <quote>reset-to-request-time</quote> - and <quote>randomize</quote> - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Removing the <quote>Last-Modified:</quote> header is useful for filter - testing, where you want to force a real reload instead of getting status - code <quote>304</quote>, which would cause the browser to reuse the old - version of the page. - </para> - <para> - The <quote>randomize</quote> option overwrites the value of the - <quote>Last-Modified:</quote> header with a randomly chosen time - between the original value and the current time. In theory the server - could send each document with a different <quote>Last-Modified:</quote> - header to track visits without using cookies. <quote>Randomize</quote> - makes it impossible and the browser can still revalidate cached documents. - </para> - <para> - <quote>reset-to-request-time</quote> overwrites the value of the - <quote>Last-Modified:</quote> header with the current time. You could use - this option together with - <literal><link linkend="hide-if-modified-since">hide-if-modified-since</link></literal> - to further customize your random range. - </para> - <para> - The preferred parameter here is <quote>randomize</quote>. It is safe - to use, as long as the time settings are more or less correct. - If the server sets the <quote>Last-Modified:</quote> header to the time - of the request, the random range becomes zero and the value stays the same. - Therefore you should later randomize it a second time with - <literal><link linkend="hide-if-modified-since">hided-if-modified-since</link></literal>, - just to be sure. - </para> - <para> - It is also recommended to use this action together with - <literal><link linkend="crunch-if-none-match">crunch-if-none-match</link></literal>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen># Let the browser revalidate without being tracked across sessions -{ +hide-if-modified-since{-60} \ - +overwrite-last-modified{randomize} \ - +crunch-if-none-match} -/</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="redirect"> -<title>redirect</title> -<!-- -new action ---> -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Redirect requests to other sites. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Convinces the browser that the requested document has been moved - to another location and the browser should get it from there. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - An absolute URL or a single pcrs command. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Requests to which this action applies are answered with a - HTTP redirect to URLs of your choosing. The new URL is - either provided as parameter, or derived by applying a - single pcrs command to the original URL. - </para> - <para> - This action will be ignored if you use it together with - <literal><link linkend="block">block</link></literal>. - It can be combined with - <literal><link linkend="fast-redirects">fast-redirects{check-decoded-url}</link></literal> - to redirect to a decoded version of a rewritten URL. - </para> - <para> - Use this action carefully, make sure not to create redirection loops - and be aware that using your own redirects might make it - possible to fingerprint your requests. - </para> - <para> - In case of problems with your redirects, or simply to watch - them working, enable <link linkend="DEBUG">debug 128</link>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usages:</term> - <listitem> - <para> - <screen># Replace example.com's style sheet with another one -{ +redirect{http://localhost/css-replacements/example.com.css%7D } - example.com/stylesheet.css - -# Create a short, easy to remember nickname for a favorite site -# (relies on the browser accept and forward invalid URLs to &my-app;) -{ +redirect{http://www.privoxy.org/user-manual/actions-file.html%7D } - a - -# Always use the expanded view for Undeadly.org articles -# (Note the $ at the end of the URL pattern to make sure -# the request for the rewritten URL isn't redirected as well) -{+redirect{s@$@&mode=expanded@}} -undeadly.org/cgi?action=article&sid=\d*$ - -# Redirect Google search requests to MSN -{+redirect{s@^http://%5B%5E/%5D*/search%5C?q=(%5B%5E&%5D*).*@http://search.msn.com/res... -.google.com/search - -# Redirect MSN search requests to Yahoo -{+redirect{s@^http://%5B%5E/%5D*/results%5C.aspx%5C?q=(%5B%5E&%5D*).*@http://search.ya... -search.msn.com//results.aspx?q= - -# Redirect remote requests for this manual -# to the local version delivered by Privoxy -{+redirect{s@^http://www@http://config@%7D%7D -www.privoxy.org/user-manual/</screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="server-header-filter"> -<title>server-header-filter</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Rewrite or remove single server headers. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - All server headers to which this action applies are filtered on-the-fly - through the specified regular expression based substitutions. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - The name of a server-header filter, as defined in one of the - <link linkend="filter-file">filter files</link>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Server-header filters are applied to each header on its own, not to - all at once. This makes it easier to diagnose problems, but on the downside - you can't write filters that only change header x if header y's value is z. - You can do that by using tags though. - </para> - <para> - Server-header filters are executed after the other header actions have finished - and use their output as input. - </para> - <para> - Please refer to the <link linkend="filter-file">filter file chapter</link> - to learn which server-header filters are available by default, and how to - create your own. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen> -{+server-header-filter{html-to-xml}} -example.org/xml-instance-that-is-delivered-as-html - -{+server-header-filter{xml-to-html}} -example.org/instance-that-is-delivered-as-xml-but-is-not - </screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="server-header-tagger"> -<title>server-header-tagger</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Enable or disable filters based on the Content-Type header. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Server headers to which this action applies are filtered on-the-fly through - the specified regular expression based substitutions, the result is used as - tag. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- boolean, parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - The name of a server-header tagger, as defined in one of the - <link linkend="filter-file">filter files</link>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - Server-header taggers are applied to each header on its own, - and as the header isn't modified, each tagger <quote>sees</quote> - the original. - </para> - <para> - Server-header taggers are executed before all other header actions - that modify server headers. Their tags can be used to control - all of the other server-header actions, the content filters - and the crunch actions (<link linkend="redirect">redirect</link> - and <link linkend="block">block</link>). - </para> - <para> - Obviously crunching based on tags created by server-header taggers - doesn't prevent the request from showing up in the server's log file. - </para> - - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage (section):</term> - <listitem> - <para> - <screen> -# Tag every request with the content type declared by the server -{+server-header-tagger{content-type}} -/ - </screen> - </para> - </listitem> - </varlistentry> - -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="session-cookies-only"> -<title>session-cookies-only</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para> - Allow only temporary <quote>session</quote> cookies (for the current - browser session <emphasis>only</emphasis>). - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - Deletes the <quote>expires</quote> field from <quote>Set-Cookie:</quote> - server headers. Most browsers will not store such cookies permanently and - forget them in between sessions. - </para> - </listitem> - </varlistentry> - -<varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Boolean.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <para> - N/A - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - This is less strict than <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal> / - <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal> and allows you to browse - websites that insist or rely on setting cookies, without compromising your privacy too badly. - </para> - <para> - Most browsers will not permanently store cookies that have been processed by - <literal>session-cookies-only</literal> and will forget about them between sessions. - This makes profiling cookies useless, but won't break sites which require cookies so - that you can log in for transactions. This is generally turned on for all - sites, and is the recommended setting. - </para> - <para> - It makes <emphasis>no sense at all</emphasis> to use <literal>session-cookies-only</literal> - together with <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal> or - <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal>. If you do, cookies - will be plainly killed. - </para> - <para> - Note that it is up to the browser how it handles such cookies without an <quote>expires</quote> - field. If you use an exotic browser, you might want to try it out to be sure. - </para> - <para> - This setting also has no effect on cookies that may have been stored - previously by the browser before starting <application>Privoxy</application>. - These would have to be removed manually. - </para> - <para> - <application>Privoxy</application> also uses - the <link linkend="filter-content-cookies">content-cookies filter</link> - to block some types of cookies. Content cookies are not effected by - <literal>session-cookies-only</literal>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - <screen>+session-cookies-only</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3 renderas="sect4" id="set-image-blocker"> -<title>set-image-blocker</title> - -<variablelist> - <varlistentry> - <term>Typical use:</term> - <listitem> - <para>Choose the replacement for blocked images</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Effect:</term> - <listitem> - <para> - This action alone doesn't do anything noticeable. If <emphasis>both</emphasis> - <literal><link linkend="block">block</link></literal> <emphasis>and</emphasis> <literal><link - linkend="handle-as-image">handle-as-image</link></literal> <emphasis>also</emphasis> - apply, i.e. if the request is to be blocked as an image, - <emphasis>then</emphasis> the parameter of this action decides what will be - sent as a replacement. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type:</term> - <!-- Boolean, Parameterized, Multi-value --> - <listitem> - <para>Parameterized.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Parameter:</term> - <listitem> - <itemizedlist> - <listitem> - <para> - <quote>pattern</quote> to send a built-in checkerboard pattern image. The image is visually - decent, scales very well, and makes it obvious where banners were busted. - </para> - </listitem> - <listitem> - <para> - <quote>blank</quote> to send a built-in transparent image. This makes banners disappear - completely, but makes it hard to detect where <application>Privoxy</application> has blocked - images on a given page and complicates troubleshooting if <application>Privoxy</application> - has blocked innocent images, like navigation icons. - </para> - </listitem> - <listitem> - <para> - <quote><replaceable class="parameter">target-url</replaceable></quote> to - send a redirect to <replaceable class="parameter">target-url</replaceable>. You can redirect - to any image anywhere, even in your local filesystem via <quote>file:///</quote> URL. - (But note that not all browsers support redirecting to a local file system). - </para> - <para> - A good application of redirects is to use special <application>Privoxy</application>-built-in - URLs, which send the built-in images, as <replaceable class="parameter">target-url</replaceable>. - This has the same visual effect as specifying <quote>blank</quote> or <quote>pattern</quote> in - the first place, but enables your browser to cache the replacement image, instead of requesting - it over and over again. - </para> - </listitem> - </itemizedlist> - </listitem> - </varlistentry> - - <varlistentry> - <term>Notes:</term> - <listitem> - <para> - The URLs for the built-in images are <quote>http://config.privoxy.org/send-banner?type=<replaceable - class="parameter">type</replaceable></quote>, where <replaceable class="parameter">type</replaceable> is - either <quote>blank</quote> or <quote>pattern</quote>. - </para> - <para> - There is a third (advanced) type, called <quote>auto</quote>. It is <emphasis>NOT</emphasis> to be - used in <literal>set-image-blocker</literal>, but meant for use from <link linkend="filter-file">filters</link>. - Auto will select the type of image that would have applied to the referring page, had it been an image. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Example usage:</term> - <listitem> - <para> - Built-in pattern: - </para> - <para> - <screen>+set-image-blocker{pattern}</screen> - </para> - <para> - Redirect to the BSD daemon: - </para> - <para> - <screen>+set-image-blocker{http://www.freebsd.org/gifs/dae_up3.gif%7D</screen> - </para> - <para> - Redirect to the built-in pattern for better caching: - </para> - <para> - <screen>+set-image-blocker{http://config.privoxy.org/send-banner?type=pattern%7D</screen> - </para> - </listitem> - </varlistentry> -</variablelist> -</sect3> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect3> -<title>Summary</title> -<para> - Note that many of these actions have the potential to cause a page to - misbehave, possibly even not to display at all. There are many ways - a site designer may choose to design his site, and what HTTP header - content, and other criteria, he may depend on. There is no way to have hard - and fast rules for all sites. See the <link - linkend="ACTIONSANAT">Appendix</link> for a brief example on troubleshooting - actions. -</para> -</sect3> -</sect2> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="aliases"> -<title>Aliases</title> -<para> - Custom <quote>actions</quote>, known to <application>Privoxy</application> - as <quote>aliases</quote>, can be defined by combining other actions. - These can in turn be invoked just like the built-in actions. - Currently, an alias name can contain any character except space, tab, - <quote>=</quote>, - <quote>{</quote> and <quote>}</quote>, but we <emphasis>strongly - recommend</emphasis> that you only use <quote>a</quote> to <quote>z</quote>, - <quote>0</quote> to <quote>9</quote>, <quote>+</quote>, and <quote>-</quote>. - Alias names are not case sensitive, and are not required to start with a - <quote>+</quote> or <quote>-</quote> sign, since they are merely textually - expanded. -</para> -<para> - Aliases can be used throughout the actions file, but they <emphasis>must be - defined in a special section at the top of the file!</emphasis> - And there can only be one such section per actions file. Each actions file may - have its own alias section, and the aliases defined in it are only visible - within that file. -</para> -<para> - There are two main reasons to use aliases: One is to save typing for frequently - used combinations of actions, the other one is a gain in flexibility: If you - decide once how you want to handle shops by defining an alias called - <quote>shop</quote>, you can later change your policy on shops in - <emphasis>one</emphasis> place, and your changes will take effect everywhere - in the actions file where the <quote>shop</quote> alias is used. Calling aliases - by their purpose also makes your actions files more readable. -</para> -<para> - Currently, there is one big drawback to using aliases, though: - <application>Privoxy</application>'s built-in web-based action file - editor honors aliases when reading the actions files, but it expands - them before writing. So the effects of your aliases are of course preserved, - but the aliases themselves are lost when you edit sections that use aliases - with it. -</para> - -<para> - Now let's define some aliases... -</para> - -<para> - <screen> - # Useful custom aliases we can use later. - # - # Note the (required!) section header line and that this section - # must be at the top of the actions file! - # - {{alias}} - - # These aliases just save typing later: - # (Note that some already use other aliases!) - # - +crunch-all-cookies = +<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> +<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link> - -crunch-all-cookies = -<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> -<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link> - +block-as-image = +block{Blocked image.} +handle-as-image - allow-all-cookies = -crunch-all-cookies -<link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> -<link linkend="FILTER-CONTENT-COOKIES">filter{content-cookies}</link> - - # These aliases define combinations of actions - # that are useful for certain types of sites: - # - fragile = -<link linkend="BLOCK">block</link> -<link linkend="FILTER">filter</link> -crunch-all-cookies -<link linkend="FAST-REDIRECTS">fast-redirects</link> -<link linkend="HIDE-REFERER">hide-referrer</link> -<link linkend="PREVENT-COMPRESSION">prevent-compression</link> - - shop = -crunch-all-cookies -<link linkend="FILTER-ALL-POPUPS">filter{all-popups}</link> - - # Short names for other aliases, for really lazy people ;-) - # - c0 = +crunch-all-cookies - c1 = -crunch-all-cookies</screen> -</para> - -<para> - ...and put them to use. These sections would appear in the lower part of an - actions file and define exceptions to the default actions (as specified further - up for the <quote>/</quote> pattern): -</para> - -<para> - <screen> - # These sites are either very complex or very keen on - # user data and require minimal interference to work: - # - {fragile} - .office.microsoft.com - .windowsupdate.microsoft.com - # Gmail is really mail.google.com, not gmail.com - mail.google.com - - # Shopping sites: - # Allow cookies (for setting and retrieving your customer data) - # - {shop} - .quietpc.com - .worldpay.com # for quietpc.com - mybank.example.com - - # These shops require pop-ups: - # - {-filter{all-popups} -filter{unsolicited-popups}} - .dabs.com - .overclockers.co.uk</screen> -</para> - -<para> - Aliases like <quote>shop</quote> and <quote>fragile</quote> are typically used for - <quote>problem</quote> sites that require more than one action to be disabled - in order to function properly. -</para> -</sect2> -<!-- -hal stop here ---> -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="act-examples"> -<title>Actions Files Tutorial</title> -<para> - The above chapters have shown <link linkend="actions-file">which actions files - there are and how they are organized</link>, how actions are <link - linkend="actions">specified</link> and <link linkend="actions-apply">applied - to URLs</link>, how <link linkend="af-patterns">patterns</link> work, and how to - define and use <link linkend="aliases">aliases</link>. Now, let's look at an - example <filename>match-all.action</filename>, <filename>default.action</filename> - and <filename>user.action</filename> file and see how all these pieces come together: -</para> - -<sect3> -<title>match-all.action</title> -<para> - Remember <emphasis>all actions are disabled when matching starts</emphasis>, - so we have to explicitly enable the ones we want. -</para> - -<para> - While the <filename>match-all.action</filename> file only contains a - single section, it is probably the most important one. It has only one - pattern, <quote><literal>/</literal></quote>, but this pattern - <link linkend="af-patterns">matches all URLs</link>. Therefore, the set of - actions used in this <quote>default</quote> section <emphasis>will - be applied to all requests as a start</emphasis>. It can be partly or - wholly overridden by other actions files like <filename>default.action</filename> - and <filename>user.action</filename>, but it will still be largely responsible - for your overall browsing experience. -</para> - -<para> - Again, at the start of matching, all actions are disabled, so there is - no need to disable any actions here. (Remember: a <quote>+</quote> - preceding the action name enables the action, a <quote>-</quote> disables!). - Also note how this long line has been made more readable by splitting it into - multiple lines with line continuation. -</para> - -<para> - <screen> -{ \ - +<link linkend="CHANGE-X-FORWARDED-FOR">change-x-forwarded-for{block}</link> \ - +<link linkend="HIDE-FROM-HEADER">hide-from-header{block}</link> \ - +<link linkend="SET-IMAGE-BLOCKER">set-image-blocker{pattern}</link> \ -} -/ # Match all URLs - </screen> -</para> - -<para> - The default behavior is now set. -</para> -</sect3> - -<sect3> -<title>default.action</title> - -<para> - If you aren't a developer, there's no need for you to edit the - <filename>default.action</filename> file. It is maintained by - the &my-app; developers and if you disagree with some of the - sections, you should overrule them in your <filename>user.action</filename>. -</para> - -<para> - Understanding the <filename>default.action</filename> file can - help you with your <filename>user.action</filename>, though. -</para> - -<para> - The first section in this file is a special section for internal use - that prevents older &my-app; versions from reading the file: -</para> - -<para> - <screen> -########################################################################## -# Settings -- Don't change! For internal Privoxy use ONLY. -########################################################################## -{{settings}} -for-privoxy-version=3.0.11</screen> -</para> - -<para> - After that comes the (optional) alias section. We'll use the example - section from the above <link linkend="aliases">chapter on aliases</link>, - that also explains why and how aliases are used: -</para> - -<para> - <screen> -########################################################################## -# Aliases -########################################################################## -{{alias}} - - # These aliases just save typing later: - # (Note that some already use other aliases!) - # - +crunch-all-cookies = +<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> +<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link> - -crunch-all-cookies = -<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> -<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link> - +block-as-image = +block{Blocked image.} +handle-as-image - mercy-for-cookies = -crunch-all-cookies -<link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> -<link linkend="FILTER-CONTENT-COOKIES">filter{content-cookies}</link> - - # These aliases define combinations of actions - # that are useful for certain types of sites: - # - fragile = -<link linkend="BLOCK">block</link> -<link linkend="FILTER">filter</link> -crunch-all-cookies -<link linkend="FAST-REDIRECTS">fast-redirects</link> -<link linkend="HIDE-REFERER">hide-referrer</link> - shop = -crunch-all-cookies -<link linkend="FILTER-ALL-POPUPS">filter{all-popups}</link></screen> -</para> - -<para> - The first of our specialized sections is concerned with <quote>fragile</quote> - sites, i.e. sites that require minimum interference, because they are either - very complex or very keen on tracking you (and have mechanisms in place that - make them unusable for people who avoid being tracked). We will simply use - our pre-defined <literal>fragile</literal> alias instead of stating the list - of actions explicitly: -</para> - -<para> - <screen> -########################################################################## -# Exceptions for sites that'll break under the default action set: -########################################################################## - -# "Fragile" Use a minimum set of actions for these sites (see alias above): -# -{ fragile } -.office.microsoft.com # surprise, surprise! -.windowsupdate.microsoft.com -mail.google.com</screen> -</para> - -<para> - Shopping sites are not as fragile, but they typically - require cookies to log in, and pop-up windows for shopping - carts or item details. Again, we'll use a pre-defined alias: -</para> - -<para> - <screen> -# Shopping sites: -# -{ shop } -.quietpc.com -.worldpay.com # for quietpc.com -.jungle.com -.scan.co.uk</screen> -</para> - -<para> - The <literal><link linkend="FAST-REDIRECTS">fast-redirects</link></literal> - action, which may have been enabled in <filename>match-all.action</filename>, - breaks some sites. So disable it for popular sites where we know it misbehaves: -</para> - -<para> - <screen> -{ -<link linkend="FAST-REDIRECTS">fast-redirects</link> } -login.yahoo.com -edit.*.yahoo.com -.google.com -.altavista.com/.*(like|url|link):http -.altavista.com/trans.*urltext=http -.nytimes.com</screen> -</para> - -<para> - It is important that <application>Privoxy</application> knows which - URLs belong to images, so that <emphasis>if</emphasis> they are to - be blocked, a substitute image can be sent, rather than an HTML page. - Contacting the remote site to find out is not an option, since it - would destroy the loading time advantage of banner blocking, and it - would feed the advertisers information about you. We can mark any - URL as an image with the <literal><link - linkend="handle-as-image">handle-as-image</link></literal> action, - and marking all URLs that end in a known image file extension is a - good start: -</para> - -<para> - <screen> -########################################################################## -# Images: -########################################################################## - -# Define which file types will be treated as images, in case they get -# blocked further down this file: -# -{ +<link linkend="HANDLE-AS-IMAGE">handle-as-image</link> } -/.*.(gif|jpe?g|png|bmp|ico)$</screen> -</para> - -<para> - And then there are known banner sources. They often use scripts to - generate the banners, so it won't be visible from the URL that the - request is for an image. Hence we block them <emphasis>and</emphasis> - mark them as images in one go, with the help of our - <literal>+block-as-image</literal> alias defined above. (We could of - course just as well use <literal>+<link linkend="block">block</link> - +<link linkend="handle-as-image">handle-as-image</link></literal> here.) - Remember that the type of the replacement image is chosen by the - <literal><link linkend="set-image-blocker">set-image-blocker</link></literal> - action. Since all URLs have matched the default section with its - <literal>+<link linkend="set-image-blocker">set-image-blocker</link>{pattern}</literal> - action before, it still applies and needn't be repeated: -</para> - -<para> - <screen> -# Known ad generators: -# -{ +block-as-image } -ar.atwola.com -.ad.doubleclick.net -.ad.*.doubleclick.net -.a.yimg.com/(?:(?!/i/).)*$ -.a[0-9].yimg.com/(?:(?!/i/).)*$ -bs*.gsanet.com -.qkimg.net</screen> -</para> - -<para> - One of the most important jobs of <application>Privoxy</application> - is to block banners. Many of these can be <quote>blocked</quote> - by the <literal><link linkend="filter">filter</link>{banners-by-size}</literal> - action, which we enabled above, and which deletes the references to banner - images from the pages while they are loaded, so the browser doesn't request - them anymore, and hence they don't need to be blocked here. But this naturally - doesn't catch all banners, and some people choose not to use filters, so we - need a comprehensive list of patterns for banner URLs here, and apply the - <literal><link linkend="block">block</link></literal> action to them. -</para> -<para> - First comes many generic patterns, which do most of the work, by - matching typical domain and path name components of banners. Then comes - a list of individual patterns for specific sites, which is omitted here - to keep the example short: -</para> - -<para> - <screen> -########################################################################## -# Block these fine banners: -########################################################################## -{ <link linkend="BLOCK">+block{Banner ads.}</link> } - -# Generic patterns: -# -ad*. -.*ads. -banner?. -count*. -/.*count(er)?.(pl|cgi|exe|dll|asp|php[34]?) -/(?:.*/)?(publicite|werbung|rekla(ma|me|am)|annonse|maino(kset|nta|s)?)/ - -# Site-specific patterns (abbreviated): -# -.hitbox.com</screen> -</para> - -<para> - It's quite remarkable how many advertisers actually call their banner - servers ads.<replaceable>company</replaceable>.com, or call the directory - in which the banners are stored simply <quote>banners</quote>. So the above - generic patterns are surprisingly effective. -</para> -<para> - But being very generic, they necessarily also catch URLs that we don't want - to block. The pattern <literal>.*ads.</literal> e.g. catches - <quote>nasty-<emphasis>ads</emphasis>.nasty-corp.com</quote> as intended, - but also <quote>downlo<emphasis>ads</emphasis>.sourcefroge.net</quote> or - <quote><emphasis>ads</emphasis>l.some-provider.net.</quote> So here come some - well-known exceptions to the <literal>+<link linkend="BLOCK">block</link></literal> - section above. -</para> -<para> - Note that these are exceptions to exceptions from the default! Consider the URL - <quote>downloads.sourcefroge.net</quote>: Initially, all actions are deactivated, - so it wouldn't get blocked. Then comes the defaults section, which matches the - URL, but just deactivates the <literal><link linkend="BLOCK">block</link></literal> - action once again. Then it matches <literal>.*ads.</literal>, an exception to the - general non-blocking policy, and suddenly - <literal><link linkend="BLOCK">+block</link></literal> applies. And now, it'll match - <literal>.*loads.</literal>, where <literal><link linkend="BLOCK">-block</link></literal> - applies, so (unless it matches <emphasis>again</emphasis> further down) it ends up - with no <literal><link linkend="BLOCK">block</link></literal> action applying. -</para> - -<para> - <screen> -########################################################################## -# Save some innocent victims of the above generic block patterns: -########################################################################## - -# By domain: -# -{ -<link linkend="BLOCK">block</link> } -adv[io]*. # (for advogato.org and advice.*) -adsl. # (has nothing to do with ads) -adobe. # (has nothing to do with ads either) -ad[ud]*. # (adult.* and add.*) -.edu # (universities don't host banners (yet!)) -.*loads. # (downloads, uploads etc) - -# By path: -# -/.*loads/ - -# Site-specific: -# -www.globalintersec.com/adv # (adv = advanced) -www.ugu.com/sui/ugu/adv</screen> -</para> - -<para> - Filtering source code can have nasty side effects, - so make an exception for our friends at sourceforge.net, - and all paths with <quote>cvs</quote> in them. Note that - <literal>-<link linkend="FILTER">filter</link></literal> - disables <emphasis>all</emphasis> filters in one fell swoop! -</para> - -<para> - <screen> -# Don't filter code! -# -{ -<link linkend="FILTER">filter</link> } -/(.*/)?cvs -bugzilla. -developer. -wiki. -.sourceforge.net</screen> -</para> - -<para> - The actual <filename>default.action</filename> is of course much more - comprehensive, but we hope this example made clear how it works. -</para> - -</sect3> - -<sect3><title>user.action</title> - -<para> - So far we are painting with a broad brush by setting general policies, - which would be a reasonable starting point for many people. Now, - you might want to be more specific and have customized rules that - are more suitable to your personal habits and preferences. These would - be for narrowly defined situations like your ISP or your bank, and should - be placed in <filename>user.action</filename>, which is parsed after all other - actions files and hence has the last word, over-riding any previously - defined actions. <filename>user.action</filename> is also a - <emphasis>safe</emphasis> place for your personal settings, since - <filename>default.action</filename> is actively maintained by the - <application>Privoxy</application> developers and you'll probably want - to install updated versions from time to time. -</para> - -<para> - So let's look at a few examples of things that one might typically do in - <filename>user.action</filename>: -</para> - - -<!-- brief sample user.action here --> - -<para> - <screen> -# My user.action file. <fred@example.com></screen> -</para> - -<para> - As <link linkend="aliases">aliases</link> are local to the actions - file that they are defined in, you can't use the ones from - <filename>default.action</filename>, unless you repeat them here: -</para> - -<para> - <screen> -# Aliases are local to the file they are defined in. -# (Re-)define aliases for this file: -# -{{alias}} -# -# These aliases just save typing later, and the alias names should -# be self explanatory. -# -+crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies --crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies - allow-all-cookies = -crunch-all-cookies -session-cookies-only - allow-popups = -filter{all-popups} -+block-as-image = +block{Blocked as image.} +handle-as-image --block-as-image = -block - -# These aliases define combinations of actions that are useful for -# certain types of sites: -# -fragile = -block -crunch-all-cookies -filter -fast-redirects -hide-referrer -shop = -crunch-all-cookies allow-popups - -# Allow ads for selected useful free sites: -# -allow-ads = -block -filter{banners-by-size} -filter{banners-by-link} - -# Alias for specific file types that are text, but might have conflicting -# MIME types. We want the browser to force these to be text documents. -handle-as-text = -<link linkend="FILTER">filter</link> +-<link linkend="content-type-overwrite">content-type-overwrite{text/plain}</link> +-<link linkend="FORCE-TEXT-MODE">force-text-mode</link> -<link linkend="HIDE-CONTENT-DISPOSITION">hide-content-disposition</link></screen> - -</para> - -<para> - Say you have accounts on some sites that you visit regularly, and - you don't want to have to log in manually each time. So you'd like - to allow persistent cookies for these sites. The - <literal>allow-all-cookies</literal> alias defined above does exactly - that, i.e. it disables crunching of cookies in any direction, and the - processing of cookies to make them only temporary. -</para> - -<para> - <screen> -{ allow-all-cookies } - sourceforge.net - .yahoo.com - .msdn.microsoft.com - .redhat.com</screen> -</para> - -<para> - Your bank is allergic to some filter, but you don't know which, so you disable them all: -</para> - -<para> - <screen> -{ -<link linkend="FILTER">filter</link> } - .your-home-banking-site.com</screen> -</para> - -<para> - Some file types you may not want to filter for various reasons: -</para> - -<para> - <screen> -# Technical documentation is likely to contain strings that might -# erroneously get altered by the JavaScript-oriented filters: -# -.tldp.org -/(.*/)?selfhtml/ - -# And this stupid host sends streaming video with a wrong MIME type, -# so that Privoxy thinks it is getting HTML and starts filtering: -# -stupid-server.example.com/</screen> -</para> - -<para> - Example of a simple <link linkend="BLOCK">block</link> action. Say you've - seen an ad on your favourite page on example.com that you want to get rid of. - You have right-clicked the image, selected <quote>copy image location</quote> - and pasted the URL below while removing the leading http://, into a - <literal>{ +block{} }</literal> section. Note that <literal>{ +handle-as-image - }</literal> need not be specified, since all URLs ending in - <literal>.gif</literal> will be tagged as images by the general rules as set - in default.action anyway: -</para> - -<para> - <screen> -{ +<link linkend="BLOCK">block</link>{Nasty ads.} } - www.example.com/nasty-ads/sponsor.gif - another.example.net/more/junk/here/</screen> -</para> - -<para> - The URLs of dynamically generated banners, especially from large banner - farms, often don't use the well-known image file name extensions, which - makes it impossible for <application>Privoxy</application> to guess - the file type just by looking at the URL. - You can use the <literal>+block-as-image</literal> alias defined above for - these cases. - Note that objects which match this rule but then turn out NOT to be an - image are typically rendered as a <quote>broken image</quote> icon by the - browser. Use cautiously. -</para> - -<para> - <screen> -{ +block-as-image } - .doubleclick.net - .fastclick.net - /Realmedia/ads/ - ar.atwola.com/</screen> -</para> - -<para> - Now you noticed that the default configuration breaks Forbes Magazine, - but you were too lazy to find out which action is the culprit, and you - were again too lazy to give <link linkend="contact">feedback</link>, so - you just used the <literal>fragile</literal> alias on the site, and - -- <emphasis>whoa!</emphasis> -- it worked. The <literal>fragile</literal> - aliases disables those actions that are most likely to break a site. Also, - good for testing purposes to see if it is <application>Privoxy</application> - that is causing the problem or not. We later find other regular sites - that misbehave, and add those to our personalized list of troublemakers: -</para> - -<para> -<screen> -{ fragile } - .forbes.com - webmail.example.com - .mybank.com</screen> -</para> - -<para> - You like the <quote>fun</quote> text replacements in <filename>default.filter</filename>, - but it is disabled in the distributed actions file. - So you'd like to turn it on in your private, - update-safe config, once and for all: -</para> - -<para> -<screen> -{ +<link linkend="filter-fun">filter{fun}</link> } - / # For ALL sites!</screen> -</para> - -<para> - Note that the above is not really a good idea: There are exceptions - to the filters in <filename>default.action</filename> for things that - really shouldn't be filtered, like code on CVS->Web interfaces. Since - <filename>user.action</filename> has the last word, these exceptions - won't be valid for the <quote>fun</quote> filtering specified here. -</para> - -<para> - You might also worry about how your favourite free websites are - funded, and find that they rely on displaying banner advertisements - to survive. So you might want to specifically allow banners for those - sites that you feel provide value to you: -</para> - -<para> -<screen> -{ allow-ads } - .sourceforge.net - .slashdot.org - .osdn.net</screen> -</para> - -<para> - Note that <literal>allow-ads</literal> has been aliased to - <literal>-<link linkend="block">block</link></literal>, - <literal>-<link linkend="filter-banners-by-size">filter{banners-by-size}</link></literal>, and - <literal>-<link linkend="filter-banners-by-link">filter{banners-by-link}</link></literal> above. -</para> - -<para> - Invoke another alias here to force an over-ride of the MIME type <literal> - application/x-sh</literal> which typically would open a download type - dialog. In my case, I want to look at the shell script, and then I can save - it should I choose to. -</para> - -<para> -<screen> -{ handle-as-text } - /.*.sh$</screen> -</para> - -<para> - <filename>user.action</filename> is generally the best place to define - exceptions and additions to the default policies of - <filename>default.action</filename>. Some actions are safe to have their - default policies set here though. So let's set a default policy to have a - <quote>blank</quote> image as opposed to the checkerboard pattern for - <emphasis>ALL</emphasis> sites. <quote>/</quote> of course matches all URL - paths and patterns: -</para> - -<para> -<screen> -{ +<link linkend="set-image-blocker">set-image-blocker{blank}</link> } -/ # ALL sites</screen> -</para> - -</sect3> -</sect2> - -<!-- ~ End section ~ --> - -</sect1> - -<!-- ~ End section ~ --> - -<!-- ~~~~~~~~ New section Header ~~~~~~~~~ --> - -<sect1 id="filter-file"> -<title>Filter Files</title> - -<para> - On-the-fly text substitutions need - to be defined in a <quote>filter file</quote>. Once defined, they - can then be invoked as an <quote>action</quote>. -</para> - -<para> - &my-app; supports three different filter actions: - <literal><link linkend="filter">filter</link></literal> to - rewrite the content that is send to the client, - <literal><link linkend="client-header-filter">client-header-filter</link></literal> - to rewrite headers that are send by the client, and - <literal><link linkend="server-header-filter">server-header-filter</link></literal> - to rewrite headers that are send by the server. -</para> - -<para> - &my-app; also supports two tagger actions: - <literal><link linkend="client-header-tagger">client-header-tagger</link></literal> - and - <literal><link linkend="server-header-tagger">server-header-tagger</link></literal>. - Taggers and filters use the same syntax in the filter files, the difference - is that taggers don't modify the text they are filtering, but use a rewritten - version of the filtered text as tag. The tags can then be used to change the - applying actions through sections with <link linkend="tag-pattern">tag-patterns</link>. -</para> - - -<para> - Multiple filter files can be defined through the <literal> <link - linkend="filterfile">filterfile</link></literal> config directive. The filters - as supplied by the developers are located in - <filename>default.filter</filename>. It is recommended that any locally - defined or modified filters go in a separately defined file such as - <filename>user.filter</filename>. - </para> - -<para> - Common tasks for content filters are to eliminate common annoyances in - HTML and JavaScript, such as pop-up windows, - exit consoles, crippled windows without navigation tools, the - infamous <BLINK> tag etc, to suppress images with certain - width and height attributes (standard banner sizes or web-bugs), - or just to have fun. -</para> - -<para> - Enabled content filters are applied to any content whose - <quote>Content Type</quote> header is recognised as a sign - of text-based content, with the exception of <literal>text/plain</literal>. - Use the <link linkend="FORCE-TEXT-MODE">force-text-mode</link> action - to also filter other content. -</para> - -<para> - Substitutions are made at the source level, so if you want to <quote>roll - your own</quote> filters, you should first be familiar with HTML syntax, - and, of course, regular expressions. -</para> - -<para> - Just like the <link linkend="actions-file">actions files</link>, the - filter file is organized in sections, which are called <emphasis>filters</emphasis> - here. Each filter consists of a heading line, that starts with one of the - <emphasis>keywords</emphasis> <literal>FILTER:</literal>, - <literal>CLIENT-HEADER-FILTER:</literal> or <literal>SERVER-HEADER-FILTER:</literal> - followed by the filter's <emphasis>name</emphasis>, and a short (one line) - <emphasis>description</emphasis> of what it does. Below that line - come the <emphasis>jobs</emphasis>, i.e. lines that define the actual - text substitutions. By convention, the name of a filter - should describe what the filter <emphasis>eliminates</emphasis>. The - comment is used in the <ulink url="http://config.privoxy.org/">web-based - user interface</ulink>. -</para> - -<para> - Once a filter called <replaceable>name</replaceable> has been defined - in the filter file, it can be invoked by using an action of the form - +<literal><link linkend="filter">filter</link>{<replaceable>name</replaceable>}</literal> - in any <link linkend="actions-file">actions file</link>. -</para> - -<para> - Filter definitions start with a header line that contains the filter - type, the filter name and the filter description. - A content filter header line for a filter called <quote>foo</quote> could look - like this: -</para> - -<para> - <screen>FILTER: foo Replace all "foo" with "bar"</screen> -</para> - -<para> - Below that line, and up to the next header line, come the jobs that - define what text replacements the filter executes. They are specified - in a syntax that imitates <ulink url="http://www.perl.org/">Perl</ulink>'s - <literal>s///</literal> operator. If you are familiar with Perl, you - will find this to be quite intuitive, and may want to look at the - PCRS documentation for the subtle differences to Perl behaviour. Most - notably, the non-standard option letter <literal>U</literal> is supported, - which turns the default to ungreedy matching. -</para> - -<para> - If you are new to - <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular - Expressions</quote></ulink>, you might want to take a look at - the <link linkend="regex">Appendix on regular expressions</link>, and - see the <ulink url="http://perldoc.perl.org/perlre.html">Perl - manual</ulink> for - <ulink url="http://perldoc.perl.org/perlop.html">the - <literal>s///</literal> operator's syntax</ulink> and <ulink - url="http://perldoc.perl.org/perlre.html%22%3EPerl-style regular - expressions</ulink> in general. - The below examples might also help to get you started. -</para> - - -<!-- ~~~~~~~~ New section Header ~~~~~~~~~ --> - -<sect2><title>Filter File Tutorial</title> -<para> - Now, let's complete our <quote>foo</quote> content filter. We have already defined - the heading, but the jobs are still missing. Since all it does is to replace - <quote>foo</quote> with <quote>bar</quote>, there is only one (trivial) job - needed: -</para> - -<para> - <screen>s/foo/bar/</screen> -</para> - -<para> - But wait! Didn't the comment say that <emphasis>all</emphasis> occurrences - of <quote>foo</quote> should be replaced? Our current job will only take - care of the first <quote>foo</quote> on each page. For global substitution, - we'll need to add the <literal>g</literal> option: -</para> - -<para> - <screen>s/foo/bar/g</screen> -</para> - -<para> - Our complete filter now looks like this: -</para> -<para> - <screen>FILTER: foo Replace all "foo" with "bar" -s/foo/bar/g</screen> -</para> - -<para> - Let's look at some real filters for more interesting examples. Here you see - a filter that protects against some common annoyances that arise from JavaScript - abuse. Let's look at its jobs one after the other: -</para> - - -<para> - <screen> -FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse - -# Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm -# -s|(<script.*)document.referrer(.*</script>)|$1"Not Your Business!"$2|Usg</screen> -</para> - -<para> - Following the header line and a comment, you see the job. Note that it uses - <literal>|</literal> as the delimiter instead of <literal>/</literal>, because - the pattern contains a forward slash, which would otherwise have to be escaped - by a backslash (<literal></literal>). -</para> - -<para> - Now, let's examine the pattern: it starts with the text <literal><script.*</literal> - enclosed in parentheses. Since the dot matches any character, and <literal>*</literal> - means: <quote>Match an arbitrary number of the element left of myself</quote>, this - matches <quote><script</quote>, followed by <emphasis>any</emphasis> text, i.e. - it matches the whole page, from the start of the first <script> tag. -</para> - -<para> - That's more than we want, but the pattern continues: <literal>document.referrer</literal> - matches only the exact string <quote>document.referrer</quote>. The dot needed to - be <emphasis>escaped</emphasis>, i.e. preceded by a backslash, to take away its - special meaning as a joker, and make it just a regular dot. So far, the meaning is: - Match from the start of the first <script> tag in a the page, up to, and including, - the text <quote>document.referrer</quote>, if <emphasis>both</emphasis> are present - in the page (and appear in that order). -</para> - -<para> - But there's still more pattern to go. The next element, again enclosed in parentheses, - is <literal>.*</script></literal>. You already know what <literal>.*</literal> - means, so the whole pattern translates to: Match from the start of the first <script> - tag in a page to the end of the last <script> tag, provided that the text - <quote>document.referrer</quote> appears somewhere in between. -</para> - -<para> - This is still not the whole story, since we have ignored the options and the parentheses: - The portions of the page matched by sub-patterns that are enclosed in parentheses, will be - remembered and be available through the variables <literal>$1, $2, ...</literal> in - the substitute. The <literal>U</literal> option switches to ungreedy matching, which means - that the first <literal>.*</literal> in the pattern will only <quote>eat up</quote> all - text in between <quote><script</quote> and the <emphasis>first</emphasis> occurrence - of <quote>document.referrer</quote>, and that the second <literal>.*</literal> will - only span the text up to the <emphasis>first</emphasis> <quote></script></quote> - tag. Furthermore, the <literal>s</literal> option says that the match may span - multiple lines in the page, and the <literal>g</literal> option again means that the - substitution is global. -</para> - -<para> - So, to summarize, the pattern means: Match all scripts that contain the text - <quote>document.referrer</quote>. Remember the parts of the script from - (and including) the start tag up to (and excluding) the string - <quote>document.referrer</quote> as <literal>$1</literal>, and the part following - that string, up to and including the closing tag, as <literal>$2</literal>. -</para> - -<para> - Now the pattern is deciphered, but wasn't this about substituting things? So - lets look at the substitute: <literal>$1"Not Your Business!"$2</literal> is - easy to read: The text remembered as <literal>$1</literal>, followed by - <literal>"Not Your Business!"</literal> (<emphasis>including</emphasis> - the quotation marks!), followed by the text remembered as <literal>$2</literal>. - This produces an exact copy of the original string, with the middle part - (the <quote>document.referrer</quote>) replaced by <literal>"Not Your - Business!"</literal>. -</para> - -<para> - The whole job now reads: Replace <quote>document.referrer</quote> by - <literal>"Not Your Business!"</literal> wherever it appears inside a - <script> tag. Note that this job won't break JavaScript syntax, - since both the original and the replacement are syntactically valid - string objects. The script just won't have access to the referrer - information anymore. -</para> - -<para> - We'll show you two other jobs from the JavaScript taming department, but - this time only point out the constructs of special interest: -</para> - -<para> - <screen> -# The status bar is for displaying link targets, not pointless blahblah -# -s/window.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</screen> -</para> - -<para> - <literal>\s</literal> stands for whitespace characters (space, tab, newline, - carriage return, form feed), so that <literal>\s*</literal> means: <quote>zero - or more whitespace</quote>. The <literal>?</literal> in <literal>.*?</literal> - makes this matching of arbitrary text ungreedy. (Note that the <literal>U</literal> - option is not set). The <literal>['"]</literal> construct means: <quote>a single - <emphasis>or</emphasis> a double quote</quote>. Finally, <literal>\1</literal> is - a back-reference to the first parenthesis just like <literal>$1</literal> above, - with the difference that in the <emphasis>pattern</emphasis>, a backslash indicates - a back-reference, whereas in the <emphasis>substitute</emphasis>, it's the dollar. -</para> - -<para> - So what does this job do? It replaces assignments of single- or double-quoted - strings to the <quote>window.status</quote> object with a dummy assignment - (using a variable name that is hopefully odd enough not to conflict with - real variables in scripts). Thus, it catches many cases where e.g. pointless - descriptions are displayed in the status bar instead of the link target when - you move your mouse over links. -</para> - -<para> - <screen> -# Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html -# -s/(<body [^>]*)onunload(.*>)/$1never$2/iU</screen> -</para> - -<para> - Including the - <ulink url="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents">OnUnload - event binding</ulink> in the HTML DOM was a <emphasis>CRIME</emphasis>. - When I close a browser window, I want it to close and die. Basta. - This job replaces the <quote>onunload</quote> attribute in - <quote><body></quote> tags with the dummy word <literal>never</literal>. - Note that the <literal>i</literal> option makes the pattern matching - case-insensitive. Also note that ungreedy matching alone doesn't always guarantee - a minimal match: In the first parenthesis, we had to use <literal>[^>]*</literal> - instead of <literal>.*</literal> to prevent the match from exceeding the - <body> tag if it doesn't contain <quote>OnUnload</quote>, but the page's - content does. -</para> - -<para> - The last example is from the fun department: -</para> - -<para> - <screen> -FILTER: fun Fun text replacements - -# Spice the daily news: -# -s/microsoft(?!.com)/MicroSuck/ig</screen> -</para> - -<para> - Note the <literal>(?!.com)</literal> part (a so-called negative lookahead) - in the job's pattern, which means: Don't match, if the string - <quote>.com</quote> appears directly following <quote>microsoft</quote> - in the page. This prevents links to microsoft.com from being trashed, while - still replacing the word everywhere else. -</para> - -<para> - <screen> -# Buzzword Bingo (example for extended regex syntax) -# -s* industry[ -]leading \ -| cutting[ -]edge \ -| customer[ -]focused \ -| market[ -]driven \ -| award[ -]winning # Comments are OK, too! \ -| high[ -]performance \ -| solutions[ -]based \ -| unmatched \ -| unparalleled \ -| unrivalled \ -*<font color="red"><b>BINGO!</b></font> \ -*igx</screen> -</para> - -<para> - The <literal>x</literal> option in this job turns on extended syntax, and allows for - e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting. -</para> - -<para> - You get the idea? -</para> -</sect2> - -<!-- ~~~~~~~~ New section Header ~~~~~~~~~ --> - -<sect2 id="predefined-filters"><title>The Pre-defined Filters</title> - -<!-- - - Note each filter is also listed in the +filter action section above. Please - keep these listings in sync. - ---> - -<para> -The distribution <filename>default.filter</filename> file contains a selection of -pre-defined filters for your convenience: -</para> - -<variablelist> - <varlistentry> - <term><emphasis>js-annoyances</emphasis></term> - <listitem> - <para> - The purpose of this filter is to get rid of particularly annoying JavaScript abuse. - To that end, it - <itemizedlist> - <listitem> - <para> - replaces JavaScript references to the browser's referrer information - with the string "Not Your Business!". This compliments the <literal><link - linkend="hide-referrer">hide-referrer</link></literal> action on the content level. - </para> - </listitem> - <listitem> - <para> - removes the bindings to the DOM's - <ulink url="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents">unload - event</ulink> which we feel has no right to exist and is responsible for most <quote>exit consoles</quote>, i.e. - nasty windows that pop up when you close another one. - </para> - </listitem> - <listitem> - <para> - removes code that causes new windows to be opened with undesired properties, such as being - full-screen, non-resizeable, without location, status or menu bar etc. - </para> - </listitem> - </itemizedlist> - </para> - <para> - Use with caution. This is an aggressive filter, and can break sites that - rely heavily on JavaScript. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>js-events</emphasis></term> - <listitem> - <para> - This is a very radical measure. It removes virtually all JavaScript event bindings, which - means that scripts can not react to user actions such as mouse movements or clicks, window - resizing etc, anymore. Use with caution! - </para> - <para> - We <emphasis>strongly discourage</emphasis> using this filter as a default since it breaks - many legitimate scripts. It is meant for use only on extra-nasty sites (should you really - need to go there). - </para> - </listitem> - </varlistentry> - -<varlistentry> - <term><emphasis>html-annoyances</emphasis></term> - <listitem> - <para> - This filter will undo many common instances of HTML based abuse. - </para> - <para> - The <literal>BLINK</literal> and <literal>MARQUEE</literal> tags - are neutralized (yeah baby!), and browser windows will be created as - resizeable (as of course they should be!), and will have location, - scroll and menu bars -- even if specified otherwise. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>content-cookies</emphasis></term> - <listitem> - <para> - Most cookies are set in the HTTP dialog, where they can be intercepted - by the - <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal> - and <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal> - actions. But web sites increasingly make use of HTML meta tags and JavaScript - to sneak cookies to the browser on the content level. - </para> - <para> - This filter disables most HTML and JavaScript code that reads or sets - cookies. It cannot detect all clever uses of these types of code, so it - should not be relied on as an absolute fix. Use it wherever you would also - use the cookie crunch actions. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>refresh tags</emphasis></term> - <listitem> - <para> - Disable any refresh tags if the interval is greater than nine seconds (so - that redirections done via refresh tags are not destroyed). This is useful - for dial-on-demand setups, or for those who find this HTML feature - annoying. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>unsolicited-popups</emphasis></term> - <listitem> - <para> - This filter attempts to prevent only <quote>unsolicited</quote> pop-up - windows from opening, yet still allow pop-up windows that the user - has explicitly chosen to open. It was added in version 3.0.1, - as an improvement over earlier such filters. - </para> - <para> - Technical note: The filter works by redefining the window.open JavaScript - function to a dummy function, <literal>PrivoxyWindowOpen()</literal>, - during the loading and rendering phase of each HTML page access, and - restoring the function afterward. - </para> - <para> - This is recommended only for browsers that cannot perform this function - reliably themselves. And be aware that some sites require such windows - in order to function normally. Use with caution. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>all-popups</emphasis></term> - <listitem> - <para> - Attempt to prevent <emphasis>all</emphasis> pop-up windows from opening. - Note this should be used with even more discretion than the above, since - it is more likely to break some sites that require pop-ups for normal - usage. Use with caution. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>img-reorder</emphasis></term> - <listitem> - <para> - This is a helper filter that has no value if used alone. It makes the - <literal>banners-by-size</literal> and <literal>banners-by-link</literal> - (see below) filters more effective and should be enabled together with them. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>banners-by-size</emphasis></term> - <listitem> - <para> - This filter removes image tags purely based on what size they are. Fortunately - for us, many ads and banner images tend to conform to certain standardized - sizes, which makes this filter quite effective for ad stripping purposes. - </para> - <para> - Occasionally this filter will cause false positives on images that are not ads, - but just happen to be of one of the standard banner sizes. - </para> - <para> - Recommended only for those who require extreme ad blocking. The default - block rules should catch 95+% of all ads <emphasis>without</emphasis> this filter enabled. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>banners-by-link</emphasis></term> - <listitem> - <para> - This is an experimental filter that attempts to kill any banners if - their URLs seem to point to known or suspected click trackers. It is currently - not of much value and is not recommended for use by default. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>webbugs</emphasis></term> - <listitem> - <para> - Webbugs are small, invisible images (technically 1X1 GIF images), that - are used to track users across websites, and collect information on them. - As an HTML page is loaded by the browser, an embedded image tag causes the - browser to contact a third-party site, disclosing the tracking information - through the requested URL and/or cookies for that third-party domain, without - the user ever becoming aware of the interaction with the third-party site. - HTML-ized spam also uses a similar technique to verify email addresses. - </para> - <para> - This filter removes the HTML code that loads such <quote>webbugs</quote>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>tiny-textforms</emphasis></term> - <listitem> - <para> - A rather special-purpose filter that can be used to enlarge textareas (those - multi-line text boxes in web forms) and turn off hard word wrap in them. - It was written for the sourceforge.net tracker system where such boxes are - a nuisance, but it can be handy on other sites, too. - </para> - <para> - It is not recommended to use this filter as a default. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>jumping-windows</emphasis></term> - <listitem> - <para> - Many consider windows that move, or resize themselves to be abusive. This filter - neutralizes the related JavaScript code. Note that some sites might not display - or behave as intended when using this filter. Use with caution. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>frameset-borders</emphasis></term> - <listitem> - <para> - Some web designers seem to assume that everyone in the world will view their - web sites using the same browser brand and version, screen resolution etc, - because only that assumption could explain why they'd use static frame sizes, - yet prevent their frames from being resized by the user, should they be too - small to show their whole content. - </para> - <para> - This filter removes the related HTML code. It should only be applied to sites - which need it. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>demoronizer</emphasis></term> - <listitem> - <para> - Many Microsoft products that generate HTML use non-standard extensions (read: - violations) of the ISO 8859-1 aka Latin-1 character set. This can cause those - HTML documents to display with errors on standard-compliant platforms. - </para> - <para> - This filter translates the MS-only characters into Latin-1 equivalents. - It is not necessary when using MS products, and will cause corruption of - all documents that use 8-bit character sets other than Latin-1. It's mostly - worthwhile for Europeans on non-MS platforms, if weird garbage characters - sometimes appear on some pages, or user agents that don't correct for this on - the fly. -<!-- - My version of Mozilla (ancient) shows litte square boxes for quote - characters, and apostrophes on moronized pages. So many pages have this, I - can read them fine now. HB 08/27/06 ---> - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>shockwave-flash</emphasis></term> - <listitem> - <para> - A filter for shockwave haters. As the name suggests, this filter strips code - out of web pages that is used to embed shockwave flash objects. - </para> - <para> - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>quicktime-kioskmode</emphasis></term> - <listitem> - <para> - Change HTML code that embeds Quicktime objects so that kioskmode, which - prevents saving, is disabled. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>fun</emphasis></term> - <listitem> - <para> - Text replacements for subversive browsing fun. Make fun of your favorite - Monopolist or play buzzword bingo. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>crude-parental</emphasis></term> - <listitem> - <para> - A demonstration-only filter that shows how <application>Privoxy</application> - can be used to delete web content on a keyword basis. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>ie-exploits</emphasis></term> - <listitem> - <para> - An experimental collection of text replacements to disable malicious HTML and JavaScript - code that exploits known security holes in Internet Explorer. - </para> - <para> - Presently, it only protects against Nimda and a cross-site scripting bug, and - would need active maintenance to provide more substantial protection. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>site-specifics</emphasis></term> - <listitem> - <para> - Some web sites have very specific problems, the cure for which doesn't apply - anywhere else, or could even cause damage on other sites. - </para> - <para> - This is a collection of such site-specific cures which should only be applied - to the sites they were intended for, which is what the supplied - <filename>default.action</filename> file does. Users shouldn't need to change - anything regarding this filter. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>google</emphasis></term> - <listitem> - <para> - A CSS based block for Google text ads. Also removes a width limitation - and the toolbar advertisement. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>yahoo</emphasis></term> - <listitem> - <para> - Another CSS based block, this time for Yahoo text ads. And removes - a width limitation as well. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>msn</emphasis></term> - <listitem> - <para> - Another CSS based block, this time for MSN text ads. And removes - tracking URLs, as well as a width limitation. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>blogspot</emphasis></term> - <listitem> - <para> - Cleans up some Blogspot blogs. Read the fine print before using this one! - </para> - <para> - This filter also intentionally removes some navigation stuff and sets the - page width to 100%. As a result, some rounded <quote>corners</quote> would - appear to early or not at all and as fixing this would require a browser - that understands background-size (CSS3), they are removed instead. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>xml-to-html</emphasis></term> - <listitem> - <para> - Server-header filter to change the Content-Type from xml to html. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>html-to-xml</emphasis></term> - <listitem> - <para> - Server-header filter to change the Content-Type from html to xml. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>no-ping</emphasis></term> - <listitem> - <para> - Removes the non-standard <literal>ping</literal> attribute from - anchor and area HTML tags. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><emphasis>hide-tor-exit-notation</emphasis></term> - <listitem> - <para> - Client-header filter to remove the <command>Tor</command> exit node notation - found in Host and Referer headers. - </para> - <para> - If &my-app; and <command>Tor</command> are chained and &my-app; - is configured to use socks4a, one can use <quote>http://www.example.org.foobar.exit/</quote> - to access the host <quote>www.example.org</quote> through the - <command>Tor</command> exit node <quote>foobar</quote>. - </para> - <para> - As the HTTP client isn't aware of this notation, it treats the - whole string <quote>www.example.org.foobar.exit</quote> as host and uses it - for the <quote>Host</quote> and <quote>Referer</quote> headers. From the - server's point of view the resulting headers are invalid and can cause problems. - </para> - <para> - An invalid <quote>Referer</quote> header can trigger <quote>hot-linking</quote> - protections, an invalid <quote>Host</quote> header will make it impossible for - the server to find the right vhost (several domains hosted on the same IP address). - </para> - <para> - This client-header filter removes the <quote>foo.exit</quote> part in those headers - to prevent the mentioned problems. Note that it only modifies - the HTTP headers, it doesn't make it impossible for the server - to detect your <command>Tor</command> exit node based on the IP address - the request is coming from. - </para> - </listitem> - </varlistentry> - -<!-- - <varlistentry> - <term><emphasis> </emphasis></term> - <listitem> - <para> - </para> - <para> - </para> - </listitem> - </varlistentry> ---> -</variablelist> - -</sect2> -</sect1> - -<!-- ~ End section ~ --> - - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect1 id="templates"> -<title>Privoxy's Template Files</title> -<para> - All <application>Privoxy</application> built-in pages, i.e. error pages such as the - <ulink url="http://show-the-404-error.page"><quote>404 - No Such Domain</quote> - error page</ulink>, the <ulink - url="http://ads.bannerserver.example.com/nasty-ads/sponsor.html%22%3E<quote>BLOCKED</quote> - page</ulink> - and all pages of its <ulink url="http://config.privoxy.org/">web-based - user interface</ulink>, are generated from <emphasis>templates</emphasis>. - (<application>Privoxy</application> must be running for the above links to work as - intended.) -</para> - -<para> - These templates are stored in a subdirectory of the <link linkend="confdir">configuration - directory</link> called <filename>templates</filename>. On Unixish platforms, - this is typically - <ulink url="file:///etc/privoxy/templates/"><filename>/etc/privoxy/templates/</filename></ulink>. -</para> - -<para> - The templates are basically normal HTML files, but with place-holders (called symbols - or exports), which <application>Privoxy</application> fills at run time. It - is possible to edit the templates with a normal text editor, should you want - to customize them. (<emphasis>Not recommended for the casual - user</emphasis>). Should you create your own custom templates, you should use - the <filename>config</filename> setting <link linkend="templdir">templdir</link> - to specify an alternate location, so your templates do not get overwritten - during upgrades. - </para> - <para> - Note that just like in configuration files, lines starting - with <literal>#</literal> are ignored when the templates are filled in. -</para> - -<para> - The place-holders are of the form <literal>@name@</literal>, and you will - find a list of available symbols, which vary from template to template, - in the comments at the start of each file. Note that these comments are not - always accurate, and that it's probably best to look at the existing HTML - code to find out which symbols are supported and what they are filled in with. -</para> - -<para> - A special application of this substitution mechanism is to make whole - blocks of HTML code disappear when a specific symbol is set. We use this - for many purposes, one of them being to include the beta warning in all - our user interface (CGI) pages when <application>Privoxy</application> - is in an alpha or beta development stage: -</para> - -<para> - <screen> -<!-- @if-unstable-start --> - - ... beta warning HTML code goes here ... - -<!-- if-unstable-end@ --></screen> -</para> - -<para> - If the "unstable" symbol is set, everything in between and including - <literal>@if-unstable-start</literal> and <literal>if-unstable-end@</literal> - will disappear, leaving nothing but an empty comment: -</para> - -<para> - <screen><!-- --></screen> -</para> - -<para> - There's also an if-then-else construct and an <literal>#include</literal> - mechanism, but you'll sure find out if you are inclined to edit the - templates ;-) -</para> - -<para> - All templates refer to a style located at - <ulink url="http://config.privoxy.org/send-stylesheet"><literal>http://config.privoxy.org/send-stylesheet</literal></ulink>. - This is, of course, locally served by <application>Privoxy</application> - and the source for it can be found and edited in the - <filename>cgi-style.css</filename> template. -</para> - -</sect1> - -<!-- ~ End section ~ --> - - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect1 id="contact"><title>Contacting the Developers, Bug Reporting and Feature -Requests</title> - -<!-- Include contacting.sgml boilerplate: --> - &contacting; -<!-- end boilerplate --> - -</sect1> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="copyright"><title>Privoxy Copyright, License and History</title> - -<!-- Include copyright.sgml: --> - ©right; -<!-- end copyright --> - -<!-- ~~~~~ New section ~~~~~ --> -<sect2><title>License</title> -<!-- Include copyright.sgml: --> - &license; -<!-- end copyright --> -</sect2> -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> - -<sect2 id="history"><title>History</title> -<!-- Include history.sgml: --> - &history; -<!-- end history --> -</sect2> - -<sect2 id="authors"><title>Authors</title> -<!-- Include p-authors.sgml: --> - &p-authors; -<!-- end authors --> -</sect2> - -</sect1> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="seealso"><title>See Also</title> -<!-- Include seealso.sgml: --> - &seealso; -<!-- end seealso --> -</sect1> - - - -<!-- ~~~~~ New section ~~~~~ --> -<sect1 id="appendix"><title>Appendix</title> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="regex"> -<title>Regular Expressions</title> -<para> - <application>Privoxy</application> uses Perl-style <quote>regular - expressions</quote> in its <link linkend="actions-file">actions - files</link> and <link linkend="filter-file">filter file</link>, - through the <ulink url="http://www.pcre.org/">PCRE</ulink> and -<!-- - dead 08/27/06 - <ulink url="http://www.oesterhelt.org/pcrs/">PCRS</ulink> libraries. ---> - <application>PCRS</application> libraries. -</para> - -<para> - If you are reading this, you probably don't understand what <quote>regular - expressions</quote> are, or what they can do. So this will be a very brief - introduction only. A full explanation would require a <ulink - url="http://www.oreilly.com/catalog/regex/%22%3Ebook</ulink> ;-) -</para> - -<para> - Regular expressions provide a language to describe patterns that can be - run against strings of characters (letter, numbers, etc), to see if they - match the string or not. The patterns are themselves (sometimes complex) - strings of literal characters, combined with wild-cards, and other special - characters, called meta-characters. The <quote>meta-characters</quote> have - special meanings and are used to build complex patterns to be matched against. - Perl Compatible Regular Expressions are an especially convenient - <quote>dialect</quote> of the regular expression language. -</para> - -<para> - To make a simple analogy, we do something similar when we use wild-card - characters when listing files with the <command>dir</command> command in DOS. - <literal>*.*</literal> matches all filenames. The <quote>special</quote> - character here is the asterisk which matches any and all characters. We can be - more specific and use <literal>?</literal> to match just individual - characters. So <quote>dir file?.text</quote> would match - <quote>file1.txt</quote>, <quote>file2.txt</quote>, etc. We are pattern - matching, using a similar technique to <quote>regular expressions</quote>! -</para> - -<para> - Regular expressions do essentially the same thing, but are much, much more - powerful. There are many more <quote>special characters</quote> and ways of - building complex patterns however. Let's look at a few of the common ones, - and then some examples: -</para> - -<para><simplelist> - <member> - <emphasis>.</emphasis> - Matches any single character, e.g. <quote>a</quote>, - <quote>A</quote>, <quote>4</quote>, <quote>:</quote>, or <quote>@</quote>. - </member> -</simplelist></para> - -<para><simplelist> - <member> - <emphasis>?</emphasis> - The preceding character or expression is matched ZERO or ONE - times. Either/or. - </member> -</simplelist></para> - -<para><simplelist> - <member> - <emphasis>+</emphasis> - The preceding character or expression is matched ONE or MORE - times. - </member> -</simplelist></para> - -<para><simplelist> - <member> - <emphasis>*</emphasis> - The preceding character or expression is matched ZERO or MORE - times. - </member> -</simplelist></para> - -<para><simplelist> - <member> - <emphasis></emphasis> - The <quote>escape</quote> character denotes that - the following character should be taken literally. This is used where one of the - special characters (e.g. <quote>.</quote>) needs to be taken literally and - not as a special meta-character. Example: <quote>example.com</quote>, makes - sure the period is recognized only as a period (and not expanded to its - meta-character meaning of any single character). - </member> -</simplelist></para> - -<para><simplelist> - <member> - <emphasis>[ ]</emphasis> - Characters enclosed in brackets will be matched if - any of the enclosed characters are encountered. For instance, <quote>[0-9]</quote> - matches any numeric digit (zero through nine). As an example, we can combine - this with <quote>+</quote> to match any digit one of more times: <quote>[0-9]+</quote>. - </member> -</simplelist></para> - -<para><simplelist> - <member> - <emphasis>( )</emphasis> - parentheses are used to group a sub-expression, - or multiple sub-expressions. - </member> -</simplelist></para> - -<para><simplelist> - <member> - <emphasis>|</emphasis> - The <quote>bar</quote> character works like an - <quote>or</quote> conditional statement. A match is successful if the - sub-expression on either side of <quote>|</quote> matches. As an example: - <quote>/(this|that) example/</quote> uses grouping and the bar character - and would match either <quote>this example</quote> or <quote>that - example</quote>, and nothing else. - </member> -</simplelist></para> - -<para> - These are just some of the ones you are likely to use when matching URLs with - <application>Privoxy</application>, and is a long way from a definitive - list. This is enough to get us started with a few simple examples which may - be more illuminating: -</para> - -<para> - <emphasis><literal>/.*/banners/.*</literal></emphasis> - A simple example - that uses the common combination of <quote>.</quote> and <quote>*</quote> to - denote any character, zero or more times. In other words, any string at all. - So we start with a literal forward slash, then our regular expression pattern - (<quote>.*</quote>) another literal forward slash, the string - <quote>banners</quote>, another forward slash, and lastly another - <quote>.*</quote>. We are building - a directory path here. This will match any file with the path that has a - directory named <quote>banners</quote> in it. The <quote>.*</quote> matches - any characters, and this could conceivably be more forward slashes, so it - might expand into a much longer looking path. For example, this could match: - <quote>/eye/hate/spammers/banners/annoy_me_please.gif</quote>, or just - <quote>/banners/annoying.html</quote>, or almost an infinite number of other - possible combinations, just so it has <quote>banners</quote> in the path - somewhere. -</para> - -<para> - And now something a little more complex: -</para> - -<para> - <emphasis><literal>/.*/adv((er)?ts?|ertis(ing|ements?))?/</literal></emphasis> - - We have several literal forward slashes again (<quote>/</quote>), so we are - building another expression that is a file path statement. We have another - <quote>.*</quote>, so we are matching against any conceivable sub-path, just so - it matches our expression. The only true literal that <emphasis>must - match</emphasis> our pattern is <application>adv</application>, together with - the forward slashes. What comes after the <quote>adv</quote> string is the - interesting part. -</para> - -<para> - Remember the <quote>?</quote> means the preceding expression (either a - literal character or anything grouped with <quote>(...)</quote> in this case) - can exist or not, since this means either zero or one match. So - <quote>((er)?ts?|ertis(ing|ements?))</quote> is optional, as are the - individual sub-expressions: <quote>(er)</quote>, - <quote>(ing|ements?)</quote>, and the <quote>s</quote>. The <quote>|</quote> - means <quote>or</quote>. We have two of those. For instance, - <quote>(ing|ements?)</quote>, can expand to match either <quote>ing</quote> - <emphasis>OR</emphasis> <quote>ements?</quote>. What is being done here, is an - attempt at matching as many variations of <quote>advertisement</quote>, and - similar, as possible. So this would expand to match just <quote>adv</quote>, - or <quote>advert</quote>, or <quote>adverts</quote>, or - <quote>advertising</quote>, or <quote>advertisement</quote>, or - <quote>advertisements</quote>. You get the idea. But it would not match - <quote>advertizements</quote> (with a <quote>z</quote>). We could fix that by - changing our regular expression to: - <quote>/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/</quote>, which would then match - either spelling. -</para> - -<para> - <emphasis><literal>/.*/advert[0-9]+.(gif|jpe?g)</literal></emphasis> - Again - another path statement with forward slashes. Anything in the square brackets - <quote>[ ]</quote> can be matched. This is using <quote>0-9</quote> as a - shorthand expression to mean any digit one through nine. It is the same as - saying <quote>0123456789</quote>. So any digit matches. The <quote>+</quote> - means one or more of the preceding expression must be included. The preceding - expression here is what is in the square brackets -- in this case, any digit - one through nine. Then, at the end, we have a grouping: <quote>(gif|jpe?g)</quote>. - This includes a <quote>|</quote>, so this needs to match the expression on - either side of that bar character also. A simple <quote>gif</quote> on one side, and the other - side will in turn match either <quote>jpeg</quote> or <quote>jpg</quote>, - since the <quote>?</quote> means the letter <quote>e</quote> is optional and - can be matched once or not at all. So we are building an expression here to - match image GIF or JPEG type image file. It must include the literal - string <quote>advert</quote>, then one or more digits, and a <quote>.</quote> - (which is now a literal, and not a special character, since it is escaped - with <quote></quote>), and lastly either <quote>gif</quote>, or - <quote>jpeg</quote>, or <quote>jpg</quote>. Some possible matches would - include: <quote>//advert1.jpg</quote>, - <quote>/nasty/ads/advert1234.gif</quote>, - <quote>/banners/from/hell/advert99.jpg</quote>. It would not match - <quote>advert1.gif</quote> (no leading slash), or - <quote>/adverts232.jpg</quote> (the expression does not include an - <quote>s</quote>), or <quote>/advert1.jsp</quote> (<quote>jsp</quote> is not - in the expression anywhere). -</para> - -<para> - We are barely scratching the surface of regular expressions here so that you - can understand the default <application>Privoxy</application> - configuration files, and maybe use this knowledge to customize your own - installation. There is much, much more that can be done with regular - expressions. Now that you know enough to get started, you can learn more on - your own :/ -</para> - -<para> - More reading on Perl Compatible Regular expressions: - <ulink url="http://perldoc.perl.org/perlre.html">http://perldoc.perl.org/perlre.html</ulink> -</para> - -<para> - For information on regular expression based substitutions and their applications - in filters, please see the <link linkend="filter-file">filter file tutorial</link> - in this manual. -</para> -</sect2> - -<!-- ~ End section ~ --> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2> -<title>Privoxy's Internal Pages</title> - -<para> - Since <application>Privoxy</application> proxies each requested - web page, it is easy for <application>Privoxy</application> to - trap certain special URLs. In this way, we can talk directly to - <application>Privoxy</application>, and see how it is - configured, see how our rules are being applied, change these - rules and other configuration options, and even turn - <application>Privoxy's</application> filtering off, all with - a web browser. - -</para> - -<para> - The URLs listed below are the special ones that allow direct access - to <application>Privoxy</application>. Of course, - <application>Privoxy</application> must be running to access these. If - not, you will get a friendly error message. Internet access is not - necessary either. -</para> - -<para> - <itemizedlist> - - <listitem> - <para> - Privoxy main page: - </para> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink> - </para> - </blockquote> - <para> - There is a shortcut: <ulink url="http://p.p/">http://p.p/</ulink> (But it - doesn't provide a fall-back to a real page, in case the request is not - sent through <application>Privoxy</application>) - </para> - </listitem> - - <listitem> - <para> - Show information about the current configuration, including viewing and - editing of actions files: - </para> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink> - </para> - </blockquote> - </listitem> - - <listitem> - <para> - Show the source code version numbers: - </para> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/show-version">http://config.privoxy.org/show-version</ulink> - </para> - </blockquote> - </listitem> - - <listitem> - <para> - Show the browser's request headers: - </para> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/show-request">http://config.privoxy.org/show-request</ulink> - </para> - </blockquote> - </listitem> - - <listitem> - <para> - Show which actions apply to a URL and why: - </para> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink> - </para> - </blockquote> - </listitem> - - <listitem> - <para> - Toggle Privoxy on or off. This feature can be turned off/on in the main - <filename>config</filename> file. When toggled <quote>off</quote>, <quote>Privoxy</quote> - continues to run, but only as a pass-through proxy, with no actions taking - place: - </para> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/toggle">http://config.privoxy.org/toggle</ulink> - </para> - </blockquote> - <para> - Short cuts. Turn off, then on: - </para> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/toggle?set=disable">http://config.privoxy.org/toggle?set=disable</ulink> - </para> - </blockquote> - <blockquote> - <para> - <ulink url="http://config.privoxy.org/toggle?set=enable">http://config.privoxy.org/toggle?set=enable</ulink> - </para> - </blockquote> - </listitem> - - </itemizedlist> -</para> - -<para> - These may be bookmarked for quick reference. See next. - -</para> - -<sect3 id="bookmarklets"> -<title>Bookmarklets</title> -<para> - Below are some <quote>bookmarklets</quote> to allow you to easily access a - <quote>mini</quote> version of some of <application>Privoxy's</application> - special pages. 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 should work for testing). -</para> -<para> - To save them, right-click the link and choose <quote>Add to Favorites</quote> - (IE) or <quote>Add Bookmark</quote> (Netscape). You will get a warning that - the bookmark <quote>may not be safe</quote> - just click OK. Then you can run the - Bookmarklet directly from your favorites/bookmarks. For even faster access, - you can put them on the <quote>Links</quote> bar (IE) or the <quote>Personal - Toolbar</quote> (Netscape), and run them with a single click. -</para> - -<para> - <itemizedlist> - - <listitem> - <para> - <ulink - url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&set=enabled%27,%27ijbstatus%27,%... - Enable</ulink> - </para> - </listitem> - - <listitem> - <para> - <ulink - url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&set=disabled%27,%27ijbstatus%27,... - Disable</ulink> - </para> - </listitem> - - <listitem> - <para> - <ulink - url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&set=toggle%27,%27ijbstatus%27,%2... - Toggle Privoxy</ulink> (Toggles between enabled and disabled) - </para> - </listitem> - - <listitem> - <para> - <ulink - url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y%27,%27ijbstatus%27,%27width=250,heig... View Status</ulink> - </para> - </listitem> -<!-- - <listitem> - <para> - <ulink url="javascript:w=Math.floor(screen.width/2);h=Math.floor(screen.height*0.9);void(window.open('http://www.privoxy.org/actions/index.php?url='+escape(location.href),'Feedback','screenx='+w+',width='+w+',height='+h+',scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Submit Actions File Feedback</ulink> - </para> - </listitem> - --> - <listitem> - <para> - <ulink url="javascript:void(window.open('http://config.privoxy.org/show-url-info?url='+escape(location.href),'Why').focus());">Privoxy - Why?</ulink> - </para> - </listitem> - </itemizedlist> -</para> - -<para> - Credit: The site which gave us the general idea for these bookmarklets is - <ulink url="http://www.bookmarklets.com/">www.bookmarklets.com</ulink>. They - have more information about bookmarklets. -</para> - - -</sect3> - -</sect2> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="chain"> -<title>Chain of Events</title> -<para> - Let's take a quick look at how some of <application>Privoxy's</application> - core features are triggered, and the ensuing sequence of events when a web - page is requested by your browser: -</para> - -<para> - <itemizedlist> - <listitem> - <para> - First, your web browser requests a web page. The browser knows to send - the request to <application>Privoxy</application>, which will in turn, - relay the request to the remote web server after passing the following - tests: - </para> - </listitem> - <listitem> - <para> - <application>Privoxy</application> traps any request for its own internal CGI - pages (e.g <ulink url="http://p.p/">http://p.p/</ulink>) and sends the CGI page back to the browser. - </para> - </listitem> - <listitem> - <para> - Next, <application>Privoxy</application> checks to see if the URL - matches any <link - linkend="BLOCK"><quote>+block</quote></link> patterns. If - so, the URL is then blocked, and the remote web server will not be contacted. - <link linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link> - and - <link linkend="HANDLE-AS-EMPTY-DOCUMENT"><quote>+handle-as-empty-document</quote></link> - are then checked, and if there is no match, an - HTML <quote>BLOCKED</quote> page is sent back to the browser. Otherwise, if - it does match, an image is returned for the former, and an empty text - document for the latter. The type of image would depend on the setting of - <link linkend="SET-IMAGE-BLOCKER"><quote>+set-image-blocker</quote></link> - (blank, checkerboard pattern, or an HTTP redirect to an image elsewhere). - </para> - </listitem> - <listitem> - <para> - Untrusted URLs are blocked. If URLs are being added to the - <filename>trust</filename> file, then that is done. - </para> - </listitem> - <listitem> - <para> - If the URL pattern matches the <link - linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link> action, - it is then processed. Unwanted parts of the requested URL are stripped. - </para> - </listitem> - <listitem> - <para> - Now the rest of the client browser's request headers are processed. If any - of these match any of the relevant actions (e.g. <link - linkend="HIDE-USER-AGENT"><quote>+hide-user-agent</quote></link>, - etc.), headers are suppressed or forged as determined by these actions and - their parameters. - </para> - </listitem> - <listitem> - <para> - Now the web server starts sending its response back (i.e. typically a web - page). - </para> - </listitem> - <listitem> - <para> - First, the server headers are read and processed to determine, among other - things, the MIME type (document type) and encoding. The headers are then - filtered as determined by the - <link linkend="CRUNCH-INCOMING-COOKIES"><quote>+crunch-incoming-cookies</quote></link>, - <link linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link>, - and <link linkend="DOWNGRADE-HTTP-VERSION"><quote>+downgrade-http-version</quote></link> - actions. - </para> - </listitem> - <listitem> - <para> - If any <link linkend="FILTER"><quote>+filter</quote></link> action - or <link - linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link> - action applies (and the document type fits the action), the rest of the page is - read into memory (up to a configurable limit). Then the filter rules (from - <filename>default.filter</filename> and any other filter files) are - processed against the buffered content. Filters are applied in the order - they are specified in one of the filter files. Animated GIFs, if present, - are reduced to either the first or last frame, depending on the action - setting.The entire page, which is now filtered, is then sent by - <application>Privoxy</application> back to your browser. - </para> - <para> - If neither a <link linkend="FILTER"><quote>+filter</quote></link> action - or <link - linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link> - matches, then <application>Privoxy</application> passes the raw data through - to the client browser as it becomes available. - </para> - </listitem> - <listitem> - <para> - As the browser receives the now (possibly filtered) page content, it - reads and then requests any URLs that may be embedded within the page - source, e.g. ad images, stylesheets, JavaScript, other HTML documents (e.g. - frames), sounds, etc. For each of these objects, the browser issues a - separate request (this is easily viewable in <application>Privoxy's</application> - logs). And each such request is in turn processed just as above. Note that a - complex web page will have many, many such embedded URLs. If these - secondary requests are to a different server, then quite possibly a very - differing set of actions is triggered. - </para> - </listitem> - - </itemizedlist> -</para> -<para> - NOTE: This is somewhat of a simplistic overview of what happens with each URL - request. For the sake of brevity and simplicity, we have focused on - <application>Privoxy's</application> core features only. -</para> - -</sect2> - - -<!-- ~~~~~ New section ~~~~~ --> -<sect2 id="actionsanat"> -<title>Troubleshooting: Anatomy of an Action</title> - -<para> - The way <application>Privoxy</application> applies - <link linkend="ACTIONS">actions</link> and <link linkend="FILTER">filters</link> - to any given URL can be complex, and not always so - easy to understand what is happening. And sometimes we need to be able to - <emphasis>see</emphasis> just what <application>Privoxy</application> is - doing. Especially, if something <application>Privoxy</application> is doing - is causing us a problem inadvertently. It can be a little daunting to look at - the actions and filters files themselves, since they tend to be filled with - <link linkend="regex">regular expressions</link> whose consequences are not - always so obvious. -</para> - -<para> - One quick test to see if <application>Privoxy</application> is causing a problem - or not, is to disable it temporarily. This should be the first troubleshooting - step. See <link linkend="bookmarklets">the Bookmarklets</link> section on a quick - and easy way to do this (be sure to flush caches afterward!). Looking at the - logs is a good idea too. (Note that both the toggle feature and logging are - enabled via <filename>config</filename> file settings, and may need to be - turned <quote>on</quote>.) -</para> -<para> - Another easy troubleshooting step to try is if you have done any - customization of your installation, revert back to the installed - defaults and see if that helps. There are times the developers get complaints - about one thing or another, and the problem is more related to a customized - configuration issue. -</para> - -<para> - <application>Privoxy</application> also provides the - <ulink url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink> - page that can show us very specifically how <application>actions</application> - are being applied to any given URL. This is a big help for troubleshooting. -</para> - -<para> - First, enter one URL (or partial URL) at the prompt, and then - <application>Privoxy</application> will tell us - how the current configuration will handle it. This will not - help with filtering effects (i.e. the <link - linkend="FILTER"><quote>+filter</quote></link> action) from - one of the filter files since this is handled very - differently and not so easy to trap! It also will not tell you about any other - URLs that may be embedded within the URL you are testing. For instance, images - such as ads are expressed as URLs within the raw page source of HTML pages. So - you will only get info for the actual URL that is pasted into the prompt area - -- not any sub-URLs. If you want to know about embedded URLs like ads, you - will have to dig those out of the HTML source. Use your browser's <quote>View - Page Source</quote> option for this. Or right click on the ad, and grab the - URL. -</para> - -<para> - Let's try an example, <ulink url="http://google.com">google.com</ulink>, - and look at it one section at a time in a sample configuration (your real - configuration may vary): -</para> - -<para> - <screen> - Matches for http://www.google.com: - - In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton> - - {+change-x-forwarded-for{block} - +deanimate-gifs {last} - +fast-redirects {check-decoded-url} - +filter {refresh-tags} - +filter {img-reorder} - +filter {banners-by-size} - +filter {webbugs} - +filter {jumping-windows} - +filter {ie-exploits} - +hide-from-header {block} - +hide-referrer {forge} - +session-cookies-only - +set-image-blocker {pattern} -/ - - { -session-cookies-only } - .google.com - - { -fast-redirects } - .google.com - -In file: user.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton> -(no matches in this file) -</screen> -</para> - -<para> - This is telling us how we have defined our - <link linkend="ACTIONS"><quote>actions</quote></link>, and - which ones match for our test case, <quote>google.com</quote>. - Displayed is all the actions that are available to us. Remember, - the <literal>+</literal> sign denotes <quote>on</quote>. <literal>-</literal> - denotes <quote>off</quote>. So some are <quote>on</quote> here, but many - are <quote>off</quote>. Each example we try may provide a slightly different - end result, depending on our configuration directives. -</para> -<para> - The first listing - is for our <filename>default.action</filename> file. The large, multi-line - listing, is how the actions are set to match for all URLs, i.e. our default - settings. If you look at your <quote>actions</quote> file, this would be the - section just below the <quote>aliases</quote> section near the top. This - will apply to all URLs as signified by the single forward slash at the end - of the listing -- <quote> / </quote>. -</para> - -<para> - But we have defined additional actions that would be exceptions to these general - rules, and then we list specific URLs (or patterns) that these exceptions - would apply to. Last match wins. Just below this then are two explicit - matches for <quote>.google.com</quote>. The first is negating our previous - cookie setting, which was for <link - linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link> - (i.e. not persistent). So we will allow persistent cookies for google, at - least that is how it is in this example. The second turns - <emphasis>off</emphasis> any <link - linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link> - action, allowing this to take place unmolested. Note that there is a leading - dot here -- <quote>.google.com</quote>. This will match any hosts and - sub-domains, in the google.com domain also, such as - <quote>www.google.com</quote> or <quote>mail.google.com</quote>. But it would not - match <quote>www.google.de</quote>! So, apparently, we have these two actions - defined as exceptions to the general rules at the top somewhere in the lower - part of our <filename>default.action</filename> file, and - <quote>google.com</quote> is referenced somewhere in these latter sections. -</para> - -<para> - Then, for our <filename>user.action</filename> file, we again have no hits. - So there is nothing google-specific that we might have added to our own, local - configuration. If there was, those actions would over-rule any actions from - previously processed files, such as <filename>default.action</filename>. - <filename>user.action</filename> typically has the last word. This is the - best place to put hard and fast exceptions, -</para> - -<para> - And finally we pull it all together in the bottom section and summarize how - <application>Privoxy</application> is applying all its <quote>actions</quote> - to <quote>google.com</quote>: - -</para> - -<para> - <screen> - - Final results: - - -add-header - -block - +change-x-forwarded-for{block} - -client-header-filter{hide-tor-exit-notation} - -content-type-overwrite - -crunch-client-header - -crunch-if-none-match - -crunch-incoming-cookies - -crunch-outgoing-cookies - -crunch-server-header - +deanimate-gifs {last} - -downgrade-http-version - -fast-redirects - -filter {js-events} - -filter {content-cookies} - -filter {all-popups} - -filter {banners-by-link} - -filter {tiny-textforms} - -filter {frameset-borders} - -filter {demoronizer} - -filter {shockwave-flash} - -filter {quicktime-kioskmode} - -filter {fun} - -filter {crude-parental} - -filter {site-specifics} - -filter {js-annoyances} - -filter {html-annoyances} - +filter {refresh-tags} - -filter {unsolicited-popups} - +filter {img-reorder} - +filter {banners-by-size} - +filter {webbugs} - +filter {jumping-windows} - +filter {ie-exploits} - -filter {google} - -filter {yahoo} - -filter {msn} - -filter {blogspot} - -filter {no-ping} - -force-text-mode - -handle-as-empty-document - -handle-as-image - -hide-accept-language - -hide-content-disposition - +hide-from-header {block} - -hide-if-modified-since - +hide-referrer {forge} - -hide-user-agent - -limit-connect - -overwrite-last-modified - -prevent-compression - -redirect - -server-header-filter{xml-to-html} - -server-header-filter{html-to-xml} - -session-cookies-only - +set-image-blocker {pattern} </screen> -</para> - -<para> - Notice the only difference here to the previous listing, is to - <quote>fast-redirects</quote> and <quote>session-cookies-only</quote>, - which are activated specifically for this site in our configuration, - and thus show in the <quote>Final Results</quote>. -</para> - -<para> - Now another example, <quote>ad.doubleclick.net</quote>: -</para> - -<para> - <screen> - - { +block{Domains starts with "ad"} } - ad*. - - { +block{Domain contains "ad"} } - .ad. - - { +block{Doubleclick banner server} +handle-as-image } - .[a-vx-z]*.doubleclick.net -</screen> -</para> - -<para> - We'll just show the interesting part here - the explicit matches. It is - matched three different times. Two <quote>+block{}</quote> sections, - and a <quote>+block{} +handle-as-image</quote>, - which is the expanded form of one of our aliases that had been defined as: - <quote>+block-as-image</quote>. (<link - linkend="ALIASES"><quote>Aliases</quote></link> are defined in - the first section of the actions file and typically used to combine more - than one action.) -</para> - -<para> - Any one of these would have done the trick and blocked this as an unwanted - image. This is unnecessarily redundant since the last case effectively - would also cover the first. No point in taking chances with these guys - though ;-) Note that if you want an ad or obnoxious - URL to be invisible, it should be defined as <quote>ad.doubleclick.net</quote> - is done here -- as both a <link - linkend="BLOCK"><quote>+block{}</quote></link> - <emphasis>and</emphasis> an - <link linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link>. - The custom alias <quote><literal>+block-as-image</literal></quote> just - simplifies the process and make it more readable. -</para> - -<para> - One last example. Let's try <quote>http://www.example.net/adsl/HOWTO/</quote>. - This one is giving us problems. We are getting a blank page. Hmmm ... -</para> - -<para> - <screen> - - Matches for http://www.example.net/adsl/HOWTO/: - - In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton> - - {-add-header - -block - +change-x-forwarded-for{block} - -client-header-filter{hide-tor-exit-notation} - -content-type-overwrite - -crunch-client-header - -crunch-if-none-match - -crunch-incoming-cookies - -crunch-outgoing-cookies - -crunch-server-header - +deanimate-gifs - -downgrade-http-version - +fast-redirects {check-decoded-url} - -filter {js-events} - -filter {content-cookies} - -filter {all-popups} - -filter {banners-by-link} - -filter {tiny-textforms} - -filter {frameset-borders} - -filter {demoronizer} - -filter {shockwave-flash} - -filter {quicktime-kioskmode} - -filter {fun} - -filter {crude-parental} - -filter {site-specifics} - -filter {js-annoyances} - -filter {html-annoyances} - +filter {refresh-tags} - -filter {unsolicited-popups} - +filter {img-reorder} - +filter {banners-by-size} - +filter {webbugs} - +filter {jumping-windows} - +filter {ie-exploits} - -filter {google} - -filter {yahoo} - -filter {msn} - -filter {blogspot} - -filter {no-ping} - -force-text-mode - -handle-as-empty-document - -handle-as-image - -hide-accept-language - -hide-content-disposition - +hide-from-header{block} - +hide-referer{forge} - -hide-user-agent - -overwrite-last-modified - +prevent-compression - -redirect - -server-header-filter{xml-to-html} - -server-header-filter{html-to-xml} - +session-cookies-only - +set-image-blocker{blank} } - / - - { +block{Path contains "ads".} +handle-as-image } - /ads -</screen> -</para> - -<para> - Ooops, the <quote>/adsl/</quote> is matching <quote>/ads</quote> in our - configuration! But we did not want this at all! Now we see why we get the - blank page. It is actually triggering two different actions here, and - the effects are aggregated so that the URL is blocked, and &my-app; is told - to treat the block as if it were an image. But this is, of course, all wrong. - We could now add a new action below this (or better in our own - <filename>user.action</filename> file) that explicitly - <emphasis>un</emphasis> blocks ( - <link linkend="BLOCK"><quote>{-block}</quote></link>) paths with - <quote>adsl</quote> in them (remember, last match in the configuration - wins). There are various ways to handle such exceptions. Example: -</para> - -<para> - <screen> - - { -block } - /adsl -</screen> -</para> - -<para> - Now the page displays ;-) - Remember to flush your browser's caches when making these kinds of changes to - your configuration to insure that you get a freshly delivered page! Or, try - using <literal>Shift+Reload</literal>. -</para> - -<para> - But now what about a situation where we get no explicit matches like - we did with: -</para> - -<para> - <screen> - - { +block{Path starts with "ads".} +handle-as-image } - /ads -</screen> -</para> - -<para> - That actually was very helpful 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 of <filename>default.action</filename> 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 - <link linkend="FILTER"><quote>+filter</quote></link> actions. - These tend to be harder to troubleshoot. - Try adding the URL for the site to one of aliases that turn off - <link linkend="FILTER"><quote>+filter</quote></link>: -</para> - -<para> - <screen> - - { shop } - .quietpc.com - .worldpay.com # for quietpc.com - .jungle.com - .scan.co.uk - .forbes.com -</screen> -</para> - -<para> - <quote><literal>{ shop }</literal></quote> is an <quote>alias</quote> that expands to - <quote><literal>{ -filter -session-cookies-only }</literal></quote>. - Or you could do your own exception to negate filtering: - -</para> - -<para> - <screen> - - { -filter } - # Disable ALL filter actions for sites in this section - .forbes.com - developer.ibm.com - localhost -</screen> -</para> - -<para> - This would turn off all filtering for these sites. This is best - put in <filename>user.action</filename>, for local site - exceptions. Note that when a simple domain pattern is used by itself (without - the subsequent path portion), all sub-pages within that domain are included - automatically in the scope of the action. -</para> - -<para> - Images that are inexplicably being blocked, may well be hitting the -<link linkend="FILTER-BANNERS-BY-SIZE"><quote>+filter{banners-by-size}</quote></link> - rule, which assumes - that images of certain sizes are ad banners (works well - <emphasis>most of the time</emphasis> since these tend to be standardized). -</para> - -<para> - <quote><literal>{ fragile }</literal></quote> is an alias that disables most - actions that are the most likely to cause trouble. This can be used as a - last resort for problem sites. -</para> -<para> - <screen> - - { fragile } - # Handle with care: easy to break - mail.google. - mybank.example.com</screen> -</para> - - -<para> - <emphasis>Remember to flush caches!</emphasis> Note that the - <literal>mail.google</literal> reference lacks the TLD portion (e.g. - <quote>.com</quote>). This will effectively match any TLD with - <literal>google</literal> in it, such as <literal>mail.google.de.</literal>, - just as an example. -</para> -<para> - If this still does not work, you will have to go through the remaining - actions one by one to find which one(s) is causing the problem. -</para> - -</sect2> - -</sect1> - - <!-- - - This program is free software; you can redistribute it - and/or modify it under the terms of the GNU General - Public License as published by the Free Software - Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A - PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - The GNU General Public License should be included with - this file. If not, you can view it at - http://www.gnu.org/copyleft/gpl.html - or write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - USA - - $Log: user-manual.sgml,v $ - Revision 2.103 2009/03/21 10:49:05 fabiankeil - Merge updated ChangeLog. - - Revision 2.102 2009/03/15 19:31:36 fabiankeil - Update "What's New in this Release" section. - - Revision 2.101 2009/02/25 19:01:56 fabiankeil - Fix typo. - - Revision 2.100 2009/02/19 17:14:11 fabiankeil - - Copy the release cycle description from announce.txt into - the "What's New" section. - - Stop referring to the ChangeLog for a "complete list of changes". - The "What's New" section already contains the complete list. - - Revision 2.99 2009/02/19 02:20:22 hal9 - Make some links in seealso conditional. Man page is now privoxy only links. - - Revision 2.98 2009/02/16 17:10:33 fabiankeil - Fix entry about shortened log messages. Noticed by Lee. - - Revision 2.97 2009/02/14 18:01:00 fabiankeil - Import ChangeLog. - - Revision 2.96 2009/02/14 13:14:03 fabiankeil - Unbreak syntax. - - Revision 2.95 2009/02/14 12:51:26 fabiankeil - Mention match-all.action in the "Actions Files Tutorial" section. - - Revision 2.94 2009/02/14 11:50:31 fabiankeil - Some indentation fixes. - - Revision 2.93 2009/02/14 10:14:42 fabiankeil - Mention match-all.action in the action file descriptions. - - Revision 2.92 2009/02/12 16:08:26 fabiankeil - Declare the code stable. - - Revision 2.91 2009/01/13 16:50:35 fabiankeil - The standard.action file is gone. - - Revision 2.90 2008/09/26 16:53:09 fabiankeil - Update "What's new" section. - - Revision 2.89 2008/09/21 15:38:56 fabiankeil - Fix Portage tree sync instructions in Gentoo section. - Anonymously reported at ijbswa-developers@. - - Revision 2.88 2008/09/21 14:42:52 fabiankeil - Add documentation for change-x-forwarded-for{}, - remove documentation for hide-forwarded-for-headers. - - Revision 2.87 2008/08/30 15:37:35 fabiankeil - Update entities. - - Revision 2.86 2008/08/16 10:12:23 fabiankeil - Merge two sentences and move the URL to the end of the item. - - Revision 2.85 2008/08/16 10:04:59 fabiankeil - Some more syntax fixes. This version actually builds. - - Revision 2.84 2008/08/16 09:42:45 fabiankeil - Turns out building docs works better if the syntax is valid. - - Revision 2.83 2008/08/16 09:32:02 fabiankeil - Mention changes since 3.0.9 beta. - - Revision 2.82 2008/08/16 09:00:52 fabiankeil - Fix example URL pattern (once more with feeling). - - Revision 2.81 2008/08/16 08:51:28 fabiankeil - Update version-related entities. - - Revision 2.80 2008/07/18 16:54:30 fabiankeil - Remove erroneous whitespace in documentation link. - Reported by John Chronister in #2021611. - - Revision 2.79 2008/06/27 18:00:53 markm68k - remove outdated startup information for mac os x - - Revision 2.78 2008/06/21 17:03:03 fabiankeil - Fix typo. - - Revision 2.77 2008/06/14 13:45:22 fabiankeil - Re-add a colon I unintentionally removed a few revisions ago. - - Revision 2.76 2008/06/14 13:21:28 fabiankeil - Prepare for the upcoming 3.0.9 beta release. - - Revision 2.75 2008/06/13 16:06:48 fabiankeil - Update the "What's New in this Release" section with - the ChangeLog entries changelog2doc.pl could handle. - - Revision 2.74 2008/05/26 15:55:46 fabiankeil - - Update "default profiles" table. - - Add some more pcrs redirect examples and note that - enabling debug 128 helps to get redirects working. - - Revision 2.73 2008/05/23 14:43:18 fabiankeil - Remove previously out-commented block that caused syntax problems. - - Revision 2.72 2008/05/12 10:26:14 fabiankeil - Synchronize content filter descriptions with the ones in default.filter. - - Revision 2.71 2008/04/10 17:37:16 fabiankeil - Actually we use "modern" POSIX 1003.2 regular - expressions in path patterns, not PCRE. - - Revision 2.70 2008/04/10 15:59:12 fabiankeil - Add another section to the client-header-tagger example that shows - how to actually change the action settings once the tag is created. - - Revision 2.69 2008/03/29 12:14:25 fabiankeil - Remove send-wafer and send-vanilla-wafer actions. - - Revision 2.68 2008/03/28 15:13:43 fabiankeil - Remove inspect-jpegs action. - - Revision 2.67 2008/03/27 18:31:21 fabiankeil - Remove kill-popups action. - - Revision 2.66 2008/03/06 16:33:47 fabiankeil - If limit-connect isn't used, don't limit CONNECT requests to port 443. - - Revision 2.65 2008/03/04 18:30:40 fabiankeil - Remove the treat-forbidden-connects-like-blocks action. We now - use the "blocked" page for forbidden CONNECT requests by default. - - Revision 2.64 2008/03/01 14:10:28 fabiankeil - Use new block syntax. Still needs some polishing. - - Revision 2.63 2008/02/22 05:50:37 markm68k - fix merge problem - - Revision 2.62 2008/02/11 11:52:23 hal9 - Fix entity ... s/&/& - - Revision 2.61 2008/02/11 03:41:47 markm68k - more updates for mac os x - - Revision 2.60 2008/02/11 03:40:25 markm68k - more updates for mac os x - - Revision 2.59 2008/02/11 00:52:34 markm68k - reflect new changes for mac os x - - Revision 2.58 2008/02/03 21:37:40 hal9 - Apply patch from Mark: s/OSX/OS X/ - - Revision 2.57 2008/02/03 19:10:14 fabiankeil - Mention forward-socks5. - - Revision 2.56 2008/01/31 19:11:35 fabiankeil - Let the +client-header-filter{hide-tor-exit-notation} example apply - to all requests as "tainted" Referers aren't limited to exit TLDs. - - Revision 2.55 2008/01/19 21:26:37 hal9 - Add IE7 to configuration section per Gerry. - - Revision 2.54 2008/01/19 17:52:39 hal9 - Re-commit to fix various minor issues for new release. - - Revision 2.53 2008/01/19 15:03:05 hal9 - Doc sources tagged for 3.0.8 release. - - Revision 2.52 2008/01/17 01:49:51 hal9 - Change copyright notice for docs s/2007/2008/. All these will be rebuilt soon - enough. - - Revision 2.51 2007/12/23 16:48:24 fabiankeil - Use more precise example descriptions for the mysterious domain patterns. - - Revision 2.50 2007/12/08 12:44:36 fabiankeil - - Remove already commented out pre-3.0.7 changes. - - Update the "new log defaults" paragraph. - - Revision 2.49 2007/12/06 18:21:55 fabiankeil - Update hide-forwarded-for-headers description. - - Revision 2.48 2007/11/24 19:07:17 fabiankeil - - Mention request rewriting. - - Enable the conditional-forge paragraph. - - Minor rewordings. - - Revision 2.47 2007/11/18 14:59:47 fabiankeil - A few "Note to Upgraders" updates. - - Revision 2.46 2007/11/17 17:24:44 fabiankeil - - Use new action defaults. - - Minor fixes and rewordings. - - Revision 2.45 2007/11/16 11:48:46 hal9 - Fix one typo, and add a couple of small refinements. - - Revision 2.44 2007/11/15 03:30:20 hal9 - Results of spell check. - - Revision 2.43 2007/11/14 18:45:39 fabiankeil - - Mention some more contributors in the "New in this Release" list. - - Minor rewordings. - - Revision 2.42 2007/11/12 03:32:40 hal9 - Updates for "What's New" and "Notes to Upgraders". Various other changes in - preparation for new release. User Manual is almost ready. - - Revision 2.41 2007/11/11 16:32:11 hal9 - This is primarily syncing What's New and Note to Upgraders sections with the many - new features and changes (gleaned from memory but mostly from ChangeLog). - - Revision 2.40 2007/11/10 17:10:59 fabiankeil - In the first third of the file, mention several times that - the action editor is disabled by default in 3.0.7 beta and later. - - Revision 2.39 2007/11/05 02:34:49 hal9 - Various changes in preparation for the upcoming release. Much yet to be done. - - Revision 2.38 2007/09/22 16:01:42 fabiankeil - Update embedded show-url-info output. - - Revision 2.37 2007/08/27 16:09:55 fabiankeil - Fix pre-chroot-nslookup description which I failed to - copy and paste properly. Reported by Stephen Gildea. - - Revision 2.36 2007/08/26 16:47:14 fabiankeil - Add Stephen Gildea's pre-chroot-nslookup patch [#1276666], - extensive comments moved to user manual. - - Revision 2.35 2007/08/26 14:59:49 fabiankeil - Minor rewordings and fixes. - - Revision 2.34 2007/08/05 15:19:50 fabiankeil - - Don't claim HTTP/1.1 compliance. - - Use $ in some of the path pattern examples. - - Use a hide-user-agent example argument without - leading and trailing space. - - Make it clear that the cookie actions work with - HTTP cookies only. - - Rephrase the inspect-jpegs text to underline - that it's only meant to protect against a single - exploit. - - Revision 2.33 2007/07/27 10:57:35 hal9 - Add references for user-agent strings for hide-user-agenet - - Revision 2.32 2007/06/07 12:36:22 fabiankeil - Apply Roland's 29_usermanual.dpatch to fix a bunch - of syntax errors I collected over the last months. - - Revision 2.31 2007/06/02 14:01:37 fabiankeil - Start to document forward-override{}. - - Revision 2.30 2007/04/25 15:10:36 fabiankeil - - Describe installation for FreeBSD. - - Start to document taggers and tag patterns. - - Don't confuse devils and daemons. - - Revision 2.29 2007/04/05 11:47:51 fabiankeil - Some updates regarding header filtering, - handling of compressed content and redirect's - support for pcrs commands. - - Revision 2.28 2006/12/10 23:42:48 hal9 - Fix various typos reported by Adam P. Thanks. - - Revision 2.27 2006/11/14 01:57:47 hal9 - Dump all docs prior to 3.0.6 release. Various minor changes to faq and user - manual. - - Revision 2.26 2006/10/24 11:16:44 hal9 - Add new filters. - - Revision 2.25 2006/10/18 10:50:33 hal9 - Add note that since filters are off in Cautious, compression is ON. Turn off - compression to make filters work on all sites. - - Revision 2.24 2006/10/03 11:13:54 hal9 - More references to the new filters. Include html this time around. - - Revision 2.23 2006/10/02 22:43:53 hal9 - Contains new filter definitions from Fabian, and few other miscellaneous - touch-ups. - - Revision 2.22 2006/09/22 01:27:55 hal9 - Final commit of probably various minor changes here and there. Unless - something changes this should be ready for pending release. - - Revision 2.21 2006/09/20 03:21:36 david__schmidt - Just the tiniest tweak. Wafer thin! - - Revision 2.20 2006/09/10 14:53:54 hal9 - Results of spell check. User manual has some updates to standard.actions file - info. - - Revision 2.19 2006/09/08 12:19:02 fabiankeil - Adjust hide-if-modified-since example values - to reflect the recent changes. - - Revision 2.18 2006/09/08 02:38:57 hal9 - Various changes: - -Fix a number of broken links. - -Migrate the new Windows service command line options, and reference as - needed. - -Rebuild so that can be used with the new "user-manual" config capabilities. - -Etc. - - Revision 2.17 2006/09/05 13:25:12 david__schmidt - Add Windows service invocation stuff (duplicated) in FAQ and in user manual under Windows startup. One probably ought to reference the other. - - Revision 2.16 2006/09/02 12:49:37 hal9 - Various small updates for new actions, filterfiles, etc. - - Revision 2.15 2006/08/30 11:15:22 hal9 - More work on the new actions, especially filter-*-headers, and What's New - section. User Manual is close to final form for 3.0.4 release. Some tinkering - and proof reading left to do. - - Revision 2.14 2006/08/29 10:59:36 hal9 - Add a "Whats New in this release" Section. Further work on multiple filter - files, and assorted other minor changes. - - Revision 2.13 2006/08/22 11:04:59 hal9 - Silence warnings and errors. This should build now. New filters were only - stubbed in. More to be done. - - Revision 2.12 2006/08/14 08:40:39 fabiankeil - Documented new actions that were part of - the "minor Privoxy improvements". - - Revision 2.11 2006/07/18 14:48:51 david__schmidt - Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - with what was really the latest development (the v_3_0_branch branch) - - Revision 1.123.2.43 2005/05/23 09:59:10 hal9 - Fix typo 'loose' - - Revision 1.123.2.42 2004/12/04 14:39:57 hal9 - Fix two minor typos per bug SF report. - - Revision 1.123.2.41 2004/03/23 12:58:42 oes - Fixed an inaccuracy - - Revision 1.123.2.40 2004/02/27 12:48:49 hal9 - Add comment re: redirecting to local file system for set-image-blocker may - is dependent on browser. - - Revision 1.123.2.39 2004/01/30 22:31:40 oes - Added a hint re bookmarklets to Quickstart section - - Revision 1.123.2.38 2004/01/30 16:47:51 oes - Some minor clarifications - - Revision 1.123.2.37 2004/01/29 22:36:11 hal9 - Updates for no longer filtering text/plain, and demoronizer default settings, - and copyright notice dates. - - Revision 1.123.2.36 2003/12/10 02:26:26 hal9 - Changed the demoronizer filter description. - - Revision 1.123.2.35 2003/11/06 13:36:37 oes - Updated link to nightly CVS tarball - - Revision 1.123.2.34 2003/06/26 23:50:16 hal9 - Add a small bit on filtering and problems re: source code being corrupted. - - Revision 1.123.2.33 2003/05/08 18:17:33 roro - Use apt-get instead of dpkg to install Debian package, which is more - solid, uses the correct and most recent Debian version automatically. - - Revision 1.123.2.32 2003/04/11 03:13:57 hal9 - Add small note about only one filterfile (as opposed to multiple actions - files). - - Revision 1.123.2.31 2003/03/26 02:03:43 oes - Updated hard-coded copyright dates - - Revision 1.123.2.30 2003/03/24 12:58:56 hal9 - Add new section on Predefined Filters. - - Revision 1.123.2.29 2003/03/20 02:45:29 hal9 - More problems with \-\-chroot causing markup problems :( - - Revision 1.123.2.28 2003/03/19 00:35:24 hal9 - Manual edit of revision log because 'chroot' (even inside a comment) was - causing Docbook to hang here (due to double hyphen and the processor thinking - it was a comment). - - Revision 1.123.2.27 2003/03/18 19:37:14 oes - s/Advanced|Radical/Adventuresome/g to avoid complaints re fun filter - - Revision 1.123.2.26 2003/03/17 16:50:53 oes - Added documentation for new chroot option - - Revision 1.123.2.25 2003/03/15 18:36:55 oes - Adapted to the new filters - - Revision 1.123.2.24 2002/11/17 06:41:06 hal9 - Move default profiles table from FAQ to U-M, and other minor related changes. - Add faq on cookies. - - Revision 1.123.2.23 2002/10/21 02:32:01 hal9 - Updates to the user.action examples section. A few new ones. - - Revision 1.123.2.22 2002/10/12 00:51:53 hal9 - Add demoronizer to filter section. - - Revision 1.123.2.21 2002/10/10 04:09:35 hal9 - s/Advanced/Radical/ and added very brief note. - - Revision 1.123.2.20 2002/10/10 03:49:21 hal9 - Add notes to session-cookies-only and Quickstart about pre-existing - cookies. Also, note content-cookies work differently. - - Revision 1.123.2.19 2002/09/26 01:25:36 hal9 - More explanation on Privoxy patterns, more on content-cookies and SSL. - - Revision 1.123.2.18 2002/08/22 23:47:58 hal9 - Add 'Documentation' to Privoxy Menu shot in Configuration section to match - CGIs. - - Revision 1.123.2.17 2002/08/18 01:13:05 hal9 - Spell checked (only one typo this time!). - - Revision 1.123.2.16 2002/08/09 19:20:54 david__schmidt - Update to Mac OS X startup script name - - Revision 1.123.2.15 2002/08/07 17:32:11 oes - Converted some internal links from ulink to link for PDF creation; no content changed - - Revision 1.123.2.14 2002/08/06 09:16:13 oes - Nits re: actions file download - - Revision 1.123.2.13 2002/08/02 18:23:19 g_sauthoff - Just 2 small corrections to the Gentoo sections - - Revision 1.123.2.12 2002/08/02 18:17:21 g_sauthoff - Added 2 Gentoo sections - - Revision 1.123.2.11 2002/07/26 15:20:31 oes - - Added version info to title - - Added info on new filters - - Revised parts of the filter file tutorial - - Added info on where to get updated actions files - - Revision 1.123.2.10 2002/07/25 21:42:29 hal9 - Add brief notes on not proxying non-HTTP protocols. - - Revision 1.123.2.9 2002/07/11 03:40:28 david__schmidt - - Updated Mac OS X sections due to installation location change - - Revision 1.123.2.8 2002/06/09 16:36:32 hal9 - Clarifications on filtering and MIME. Hardcode 'latest release' in index.html. - - Revision 1.123.2.7 2002/06/09 00:29:34 hal9 - Touch ups on filtering, in actions section and Anatomy. - - Revision 1.123.2.6 2002/06/06 23:11:03 hal9 - Fix broken link. Linkchecked all docs. - - Revision 1.123.2.5 2002/05/29 02:01:02 hal9 - This is break out of the entire config section from u-m, so it can - eventually be used to generate the comments, etc in the main config file - so that these are in sync with each other. - - Revision 1.123.2.4 2002/05/27 03:28:45 hal9 - Ooops missed something from David. - - Revision 1.123.2.3 2002/05/27 03:23:17 hal9 - Fix FIXMEs for OS2 and Mac OS X startup. Fix Redhat typos (should be Red Hat). - That's a wrap, I think. - - Revision 1.123.2.2 2002/05/26 19:02:09 hal9 - Move Amiga stuff around to take of FIXME in start up section. - - Revision 1.123.2.1 2002/05/26 17:04:25 hal9 - -Spellcheck, very minor edits, and sync across branches - - Revision 1.123 2002/05/24 23:19:23 hal9 - Include new image (Proxy setup). More fun with guibutton. - Minor corrections/clarifications here and there. - - Revision 1.122 2002/05/24 13:24:08 oes - Added Bookmarklet for one-click pre-filled access to show-url-info - - Revision 1.121 2002/05/23 23:20:17 oes - - Changed more (all?) references to actions to the - <literal><link> style. - - Small fixes in the actions chapter - - Small clarifications in the quickstart to ad blocking - - Removed <emphasis> from <title>s since the new doc CSS - renders them red (bad in TOC). - - Revision 1.120 2002/05/23 19:16:43 roro - Correct Debian specials (installation and startup). - - Revision 1.119 2002/05/22 17:17:05 oes - Added Security hint - - Revision 1.118 2002/05/21 04:54:55 hal9 - -New Section: Quickstart to Ad Blocking - -Reformat Actions Anatomy to match new CGI layout - - Revision 1.117 2002/05/17 13:56:16 oes - - Reworked & extended Templates chapter - - Small changes to Regex appendix - - #included authors.sgml into (C) and hist chapter - - Revision 1.116 2002/05/17 03:23:46 hal9 - Fixing merge conflict in Quickstart section. - - Revision 1.115 2002/05/16 16:25:00 oes - Extended the Filter File chapter & minor fixes - - Revision 1.114 2002/05/16 09:42:50 oes - More ulink->link, added some hints to Quickstart section - - Revision 1.113 2002/05/15 21:07:25 oes - Extended and further commented the example actions files - - Revision 1.112 2002/05/15 03:57:14 hal9 - Spell check. A few minor edits here and there for better syntax and - clarification. - - Revision 1.111 2002/05/14 23:01:36 oes - Fixing the fixes - - Revision 1.110 2002/05/14 19:10:45 oes - Restored alphabetical order of actions - - Revision 1.109 2002/05/14 17:23:11 oes - Renamed the prevent-*-cookies actions, extended aliases section and moved it before the example AFs - - Revision 1.108 2002/05/14 15:29:12 oes - Completed proofreading the actions chapter - - Revision 1.107 2002/05/12 03:20:41 hal9 - Small clarifications for 127.0.0.1 vs localhost for listen-address since this - apparently an important distinction for some OS's. - - Revision 1.106 2002/05/10 01:48:20 hal9 - This is mostly proposed copyright/licensing additions and changes. Docs - are still GPL, but licensing and copyright are more visible. Also, copyright - changed in doc header comments (eliminate references to JB except FAQ). - - Revision 1.105 2002/05/05 20:26:02 hal9 - Sorting out license vs copyright in these docs. - - Revision 1.104 2002/05/04 08:44:45 swa - bumped version - - Revision 1.103 2002/05/04 00:40:53 hal9 - -Remove the TOC first page kludge. It's fixed proper now in ldp.dsl.in. - -Some minor additions to Quickstart. - - Revision 1.102 2002/05/03 17:46:00 oes - Further proofread & reactivated short build instructions - - Revision 1.101 2002/05/03 03:58:30 hal9 - Move the user-manual config directive to top of section. Add note about - Privoxy needing read permissions for configs, and write for logs. - - Revision 1.100 2002/04/29 03:05:55 hal9 - Add clarification on differences of new actions files. - - Revision 1.99 2002/04/28 16:59:05 swa - more structure in starting section - - Revision 1.98 2002/04/28 05:43:59 hal9 - This is the break up of configuration.html into multiple files. This - will probably break links elsewhere :( - - Revision 1.97 2002/04/27 21:04:42 hal9 - -Rewrite of Actions File example. - -Add section for user-manual directive in config. - - Revision 1.96 2002/04/27 05:32:00 hal9 - -Add short section to Filter Files to tie in with +filter action. - -Start rewrite of examples in Actions Examples (not finished). - - Revision 1.95 2002/04/26 17:23:29 swa - bookmarks cleaned, changed structure of user manual, screen and programlisting cleanups, and numerous other changes that I forgot - - Revision 1.94 2002/04/26 05:24:36 hal9 - -Add most of Andreas suggestions to Chain of Events section. - -A few other minor corrections and touch up. - - Revision 1.92 2002/04/25 18:55:13 hal9 - More catchups on new actions files, and new actions names. - Other assorted cleanups, and minor modifications. - - Revision 1.91 2002/04/24 02:39:31 hal9 - Add 'Chain of Events' section. - - Revision 1.90 2002/04/23 21:41:25 hal9 - Linuxconf is deprecated on RH, substitute chkconfig. - - Revision 1.89 2002/04/23 21:05:28 oes - Added hint for startup on Red Hat - - Revision 1.88 2002/04/23 05:37:54 hal9 - Add AmigaOS install stuff. - - Revision 1.87 2002/04/23 02:53:15 david__schmidt - Updated Mac OS X installation section - Added a few English tweaks here an there - - Revision 1.86 2002/04/21 01:46:32 hal9 - Re-write actions section. - - Revision 1.85 2002/04/18 21:23:23 hal9 - Fix ugly typo (mine). - - Revision 1.84 2002/04/18 21:17:13 hal9 - Spell Redhat correctly (ie Red Hat). A few minor grammar corrections. - - Revision 1.83 2002/04/18 18:21:12 oes - Added RPM install detail - - Revision 1.82 2002/04/18 12:04:50 oes - Cosmetics - - Revision 1.81 2002/04/18 11:50:24 oes - Extended Install section - needs fixing by packagers - - Revision 1.80 2002/04/18 10:45:19 oes - Moved text to buildsource.sgml, renamed some filters, details - - Revision 1.79 2002/04/18 03:18:06 hal9 - Spellcheck, and minor touchups. - - Revision 1.78 2002/04/17 18:04:16 oes - Proofreading part 2 - - Revision 1.77 2002/04/17 13:51:23 oes - Proofreading, part one - - Revision 1.76 2002/04/16 04:25:51 hal9 - -Added 'Note to Upgraders' and re-ordered the 'Quickstart' section. - -Note about proxy may need requests to re-read config files. - - Revision 1.75 2002/04/12 02:08:48 david__schmidt - Remove OS/2 building info... it is already in the developer-manual - - Revision 1.74 2002/04/11 00:54:38 hal9 - Add small section on submitting actions. - - Revision 1.73 2002/04/10 18:45:15 swa - generated - - Revision 1.72 2002/04/10 04:06:19 hal9 - Added actions feedback to Bookmarklets section - - Revision 1.71 2002/04/08 22:59:26 hal9 - Version update. Spell chkconfig correctly :) - - Revision 1.70 2002/04/08 20:53:56 swa - ? - - Revision 1.69 2002/04/06 05:07:29 hal9 - -Add privoxy-man-page.sgml, for man page. - -Add authors.sgml for AUTHORS (and p-authors.sgml) - -Reworked various aspects of various docs. - -Added additional comments to sub-docs. - - Revision 1.68 2002/04/04 18:46:47 swa - consistent look. reuse of copyright, history et. al. - - Revision 1.67 2002/04/04 17:27:57 swa - more single file to be included at multiple points. make maintaining easier - - Revision 1.66 2002/04/04 06:48:37 hal9 - Structural changes to allow for conditional inclusion/exclusion of content - based on entity toggles, e.g. 'entity % p-not-stable "INCLUDE"'. And - definition of internal entities, e.g. 'entity p-version "2.9.13"' that will - eventually be set by Makefile. - More boilerplate text for use across multiple docs. - - Revision 1.65 2002/04/03 19:52:07 swa - enhance squid section due to user suggestion - - Revision 1.64 2002/04/03 03:53:43 hal9 - A few minor bug fixes, and touch ups. Ready for review. - - Revision 1.63 2002/04/01 16:24:49 hal9 - Define entities to include boilerplate text. See doc/source/*. - - Revision 1.62 2002/03/30 04:15:53 hal9 - - Fix privoxy.org/config links. - - Paste in Bookmarklets from Toggle page. - - Move Quickstart nearer top, and minor rework. - - Revision 1.61 2002/03/29 01:31:08 hal9 - Minor update. - - Revision 1.60 2002/03/27 01:57:34 hal9 - Added more to Anatomy section. - - Revision 1.59 2002/03/27 00:54:33 hal9 - Touch up intro for new name. - - Revision 1.58 2002/03/26 22:29:55 swa - we have a new homepage! - - Revision 1.57 2002/03/24 20:33:30 hal9 - A few minor catch ups with name change. - - Revision 1.56 2002/03/24 16:17:06 swa - configure needs to be generated. - - Revision 1.55 2002/03/24 16:08:08 swa - we are too lazy to make a block-built - privoxy logo. hence removed the option. - - Revision 1.54 2002/03/24 15:46:20 swa - name change related issue. - - Revision 1.53 2002/03/24 11:51:00 swa - name change. changed filenames. - - Revision 1.52 2002/03/24 11:01:06 swa - name change - - Revision 1.51 2002/03/23 15:13:11 swa - renamed every reference to the old name with foobar. - fixed "application foobar application" tag, fixed - "the foobar" with "foobar". left junkbustser in cvs - comments and remarks to history untouched. - - Revision 1.50 2002/03/23 05:06:21 hal9 - Touch up. - - Revision 1.49 2002/03/21 17:01:05 hal9 - New section in Appendix. - - Revision 1.48 2002/03/12 06:33:01 hal9 - Catching up to Andreas and re_filterfile changes. - - Revision 1.47 2002/03/11 13:13:27 swa - correct feedback channels - - Revision 1.46 2002/03/10 00:51:08 hal9 - Added section on JB internal pages in Appendix. - - Revision 1.45 2002/03/09 17:43:53 swa - more distros - - Revision 1.44 2002/03/09 17:08:48 hal9 - New section on Jon's actions file editor, and move some stuff around. - - Revision 1.43 2002/03/08 00:47:32 hal9 - Added imageblock{pattern}. - - Revision 1.42 2002/03/07 18:16:55 swa - looks better - - Revision 1.41 2002/03/07 16:46:43 hal9 - Fix a few markup problems for jade. - - Revision 1.40 2002/03/07 16:28:39 swa - provide correct feedback channels - - Revision 1.39 2002/03/06 16:19:28 hal9 - Note on perceived filtering slowdown per FR. - - Revision 1.38 2002/03/05 23:55:14 hal9 - Stupid I did it again. Double hyphen in comment breaks jade. - - Revision 1.37 2002/03/05 23:53:49 hal9 - jade barfs on '- -' embedded in comments. - -user option broke it. - - Revision 1.36 2002/03/05 22:53:28 hal9 - Add new - - user option. - - Revision 1.35 2002/03/05 00:17:27 hal9 - Added section on command line options. - - Revision 1.34 2002/03/04 19:32:07 oes - Changed default port to 8118 - - Revision 1.33 2002/03/03 19:46:13 hal9 - Emphasis on where/how to report bugs, etc - - Revision 1.32 2002/03/03 09:26:06 joergs - AmigaOS changes, config is now loaded from PROGDIR: instead of - AmiTCP:db/junkbuster/ if no configuration file is specified on the - command line. - - Revision 1.31 2002/03/02 22:45:52 david__schmidt - Just tweaking - - Revision 1.30 2002/03/02 22:00:14 hal9 - Updated 'New Features' list. Ran through spell-checker. - - Revision 1.29 2002/03/02 20:34:07 david__schmidt - Update OS/2 build section - - Revision 1.28 2002/02/24 14:34:24 jongfoster - Formatting changes. Now changing the doctype to DocBook XML 4.1 - will work - no other changes are needed. - - Revision 1.27 2002/01/11 14:14:32 hal9 - Added a very short section on Templates - - Revision 1.26 2002/01/09 20:02:50 hal9 - Fix bug re: auto-detect config file changes. - - Revision 1.25 2002/01/09 18:20:30 hal9 - Touch ups for *.action files. - - Revision 1.24 2001/12/02 01:13:42 hal9 - Fix typo. - - Revision 1.23 2001/12/02 00:20:41 hal9 - Updates for recent changes. - - Revision 1.22 2001/11/05 23:57:51 hal9 - Minor update for startup now daemon mode. - - Revision 1.21 2001/10/31 21:11:03 hal9 - Correct 2 minor errors - - Revision 1.18 2001/10/24 18:45:26 hal9 - *** empty log message *** - - Revision 1.17 2001/10/24 17:10:55 hal9 - Catching up with Jon's recent work, and a few other things. - - Revision 1.16 2001/10/21 17:19:21 swa - wrong url in documentation - - Revision 1.15 2001/10/14 23:46:24 hal9 - Various minor changes. Fleshed out SEE ALSO section. - - Revision 1.13 2001/10/10 17:28:33 hal9 - Very minor changes. - - Revision 1.12 2001/09/28 02:57:04 hal9 - Ditto :/ - - Revision 1.11 2001/09/28 02:25:20 hal9 - Ditto. - - Revision 1.9 2001/09/27 23:50:29 hal9 - A few changes. A short section on regular expression in appendix. - - Revision 1.8 2001/09/25 00:34:59 hal9 - Some additions, and re-arranging. - - Revision 1.7 2001/09/24 14:31:36 hal9 - Diddling. - - Revision 1.6 2001/09/24 14:10:32 hal9 - Including David's OS/2 installation instructions. - - Revision 1.2 2001/09/13 15:27:40 swa - cosmetics - - Revision 1.1 2001/09/12 15:36:41 swa - source files for junkbuster documentation - - Revision 1.3 2001/09/10 17:43:59 swa - first proposal of a structure. - - Revision 1.2 2001/06/13 14:28:31 swa - docs should have an author. - - Revision 1.1 2001/06/13 14:20:37 swa - first import of project's documentation for the webserver. - - --> - -</article> diff --git a/external/privoxy/doc/source/webserver/index.sgml b/external/privoxy/doc/source/webserver/index.sgml deleted file mode 100644 index ef63867..0000000 --- a/external/privoxy/doc/source/webserver/index.sgml +++ /dev/null @@ -1,372 +0,0 @@ -<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ -<!entity % dummy "IGNORE"> -<!entity p-intro SYSTEM "privoxy.sgml"> -<!entity contacting SYSTEM "contacting.sgml"> -<!entity history SYSTEM "history.sgml"> -<!entity copyright SYSTEM "copyright.sgml"> -<!entity license SYSTEM "license.sgml"> -<!entity p-version "3.0.11"> -<!entity p-status "stable"> -<!entity % p-not-stable "IGNORE"> -<!entity % p-stable "INCLUDE"> -<!entity my-copy "©"> <!-- kludge for docbook2man --> -<!entity % p-homepage "IGNORE"> <!-- toggle for webserver index.html --> -<!entity % p-index "IGNORE"> <!-- toggle for local doc index --> -]> -<!-- - File : $Source: /cvsroot/ijbswa/current/doc/source/webserver/index.sgml,v $ - - Purpose : Index file of the project's homepage and also documentation index - This file belongs into - ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - - $Id: index.sgml,v 2.9 2009/02/19 14:12:02 fabiankeil Exp $ - - Copyright (C) 2001-2009 Privoxy Developers ijbswa-developers@lists.sourceforge.net - See LICENSE. - - ======================================================================== - NOTE: Please read developer-manual/documentation.html before touching - anything in this, or other Privoxy documentation. - ======================================================================== - - Note: This is the Privoxy home page *and* builds a page that can be - used with local documentation as a focal point for docs or other points - of interest. The Makefile is adding additional meta data and content via - perl. - - Generates: index.html, for webserver home page. - privoxy-index.html, for packaging with docs - ---> - -<article id="index"> -<artheader> - <title>Privoxy - <![%p-homepage;[Home Page]]><![%p-index;[The Privacy Enhancing Proxy]]></title> - <![%p-index;[<subtitle>Project Index Page v&p-version;</subtitle>]]> - -<!-- copyright is at bottom of page --> - - <keywordset> - <keyword>privoxy</keyword> <keyword>HTTP</keyword> <keyword>proxy</keyword> <keyword>privacy</keyword> - <keyword>popups</keyword> <keyword>po-ups</keyword> <keyword>HTML</keyword> <keyword>JavaScript</keyword> - <keyword>cleaning</keyword> <keyword>blocking</keyword> <keyword>cleaner</keyword> <keyword>blocker</keyword> - <keyword>filter</keyword> <keyword>proxy</keyword> <keyword>junk</keyword> <keyword>ad</keyword> - <keyword>advertisement</keyword> <keyword>banner</keyword> <keyword>webbugs</keyword> - <keyword>web-bugs</keyword> <keyword>werbung</keyword> <keyword>junkbusters</keyword> - <keyword>junkbuster</keyword> - </keywordset> - - <abstract> - -<![%dummy;[ - <para> - <comment> - This is here to keep vim syntax file from breaking :/ - If I knew enough to fix it, I would. - PLEASE DO NOT REMOVE! HB: hal@foobox.net - </comment> - </para> -]]> - -<!-- Include privoxy.sgml boilerplate: --> - &p-intro; -<!-- end boilerplate --> - -<![%p-homepage;[ - <para> - The most recent release is <ulink url="announce.txt">&p-version; (&p-status;)</ulink>. - </para> -]]> - - </abstract> -</artheader> - -<!-- ~~~~~ New section ~~~~~ --> - - -<sect1 renderas="sect2" id="download" label=""><title>Download</title> -<para> - <itemizedlist> - <listitem> - <para> - <ulink url="https://sourceforge.net/project/showfiles.php?group_id=11118">Download recent releases</ulink> - </para> - </listitem> - <!-- - deprecated - <listitem> - <para> - <ulink url="http://cvs.sourceforge.net/cvstarballs/ijbswa-cvsroot.tar.bz2">Download the latest CVS snapshot (source tarball)</ulink> - </para> - </listitem> - --> - <listitem> - <para> - <ulink url="user-manual/quickstart.html">Quickstart after installation</ulink> - </para> - </listitem> - </itemizedlist> -</para> -</sect1> - -<sect1 renderas="sect2" id="docs" label=""><title>Documentation</title> -<para> - <itemizedlist> - <listitem> - <para> - <ulink url="user-manual/index.html">User manual</ulink> - </para> - </listitem> - <listitem> - <para> - <ulink url="faq/index.html">Frequently Asked Questions</ulink> - </para> - </listitem> - <listitem> - <para> - <ulink url="developer-manual/index.html">Developer Manual</ulink> - </para> - </listitem> - <listitem> - <para> - <ulink url="man-page/privoxy-man-page.html">Classic Man Page</ulink> - </para> - </listitem> - </itemizedlist> -</para> -</sect1> - -<sect1 renderas="sect2" id="moreinfo" label=""><title>More information</title> -<para> - <itemizedlist> - <listitem> - <para> - <ulink url="user-manual/contact.html">Support & Service</ulink> - </para> - </listitem> - <listitem> - <para> - <ulink url="user-manual/copyright.html">Copyright, License, History & Authors</ulink> - </para> - </listitem> - <listitem> - <para> - <ulink url="user-manual/introduction.html#FEATURES">List of (new) Features</ulink> - </para> - </listitem> - <listitem> - <para> - <ulink url="https://sourceforge.net/projects/ijbswa/">The project page</ulink> - </para> - </listitem> - <listitem> - <para> - <ulink url="user-manual/seealso.html">Related links</ulink> - </para> - </listitem> - <listitem> - <para> - <!-- please leave this link absolute so this file can be bundled with --> - <!-- documentation and still used locally --> - <ulink url="http://privoxy.org/team/index.html">Pictures of the Privoxy Team</ulink> - </para> - </listitem> - </itemizedlist> -</para> -</sect1> - -<![%p-homepage;[ -<!-- ~~~~~ New section ~~~~~ --> -<sect1 label=""> -<!-- dummy section, for spacing --> -<title></title> -<para> -<!-- show the SF logo per AUP --> -<informaltable frame=none label="" pgwide="1"> - <tgroup cols=1 align="center" colsep=1 rowsep=1> - <colspec colname=c1 align="center"> - <tbody> - <row> - <entry align="center">Privoxy is developed on:</entry> - </row> - <row> - <entry align="center"> - <ulink url="http://sourceforge.net/"> - <inlinegraphic fileref="http://sourceforge.net/sflogo.php?group_id=11118&type=1&dummy=.gif"></inlinegraphic> - </ulink> - </entry> - </row> - </tbody> - </tgroup> -</informaltable> -</para> -]]> - -<!-- -<informalfigure pgwide="1"> - <ulink url="http://sourceforge.net/"> - <inlinegraphic align="center" fileref="http://sourceforge.net/sflogo.php?group_id=11118&type=1&dummy=.gif"></inlinegraphic> - </ulink> -</informalfigure> ---> - - -<![%p-index;[ -<sect1 label=""><title></title> -<!-- dummy section for layout and spacing --> -]]> - -<!-- Formal copyright markup does not work here. HB. --> -<!-- NOTE: I could not get docbook to completely ignore © --> -<!-- GNUMakefile is inserting this now --> -<para> - <subscript> - Copyright __copy 2001-2009 by Privoxy Developers - </subscript> -</para> - -</sect1> - - <!-- - - This program is free software; you can redistribute it - and/or modify it under the terms of the GNU General - Public License as published by the Free Software - Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A - PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - The GNU General Public License should be included with - this file. If not, you can view it at - http://www.gnu.org/copyleft/gpl.html - or write to the Free Software Foundation, Inc., 59 - Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - $Log: index.sgml,v $ - Revision 2.9 2009/02/19 14:12:02 fabiankeil - Change link to the project page to https://. - - Revision 2.8 2009/02/12 16:09:44 fabiankeil - Declare the code stable. - - Revision 2.7 2009/01/13 16:50:36 fabiankeil - The standard.action file is gone. - - Revision 2.6 2008/08/16 08:51:28 fabiankeil - Update version-related entities. - - Revision 2.5 2008/06/18 17:42:13 fabiankeil - - Remove link to soon-to-be-removed PDFs. - - Use https for the download URL. - - Update copyright year. - - Revision 2.4 2006/08/28 01:08:57 hal9 - Remove reference to defunct nightly cvs tarballs. - - Revision 2.3 2006/07/18 14:48:51 david__schmidt - Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - with what was really the latest development (the v_3_0_branch branch) - - Revision 1.16.2.12 2004/01/30 14:33:41 oes - Vi(m) syntax voodoo now hidden; copyright updated - - Revision 1.16.2.11 2003/08/16 12:16:30 hal9 - Update cvs tarball URL (to bz2) - - Revision 1.16.2.10 2003/03/28 03:33:09 hal9 - Include link for announce.txt, and change handling of ©. - - Revision 1.16.2.9 2003/03/26 02:03:45 oes - Updated hard-coded copyright dates - - Revision 1.16.2.8 2002/08/16 03:05:42 hal9 - Put all pdf docs in a zip archive now. - - Revision 1.16.2.7 2002/08/14 16:40:00 hal9 - Add links to pdf docs. - - Revision 1.16.2.6 2002/07/26 15:22:15 oes - Most recent release now inserted automatically (again) - - Revision 1.16.2.5 2002/06/09 18:59:16 hal9 - Correct typo. - - Revision 1.16.2.4 2002/06/09 16:36:33 hal9 - Clarifications on filtering and MIME. Hardcode 'latest release' in index.html. - - Revision 1.16.2.3 2002/05/28 02:31:38 hal9 - New file, privoxy-index.html, for bundling with documentation. Built from - index.sgml, like homepage, but with content toggles more suitable for this use. - - Revision 1.16.2.2 2002/05/26 22:04:46 hal9 - Add several comments, and reworded 'most recent release', ie we don't officially - release odd numbered versions. - - Revision 1.16.2.1 2002/05/26 17:40:02 hal9 - Make team pictures link absolute for docs. - - Revision 1.16 2002/05/24 10:06:31 oes - Nit - - Revision 1.15 2002/05/24 00:02:05 oes - Tried to make more useful and concise: - Reordered, no more TOC, link to instead of include info, - added some links. Should we use the free space to better - describe what Privoxy is good for? - - Revision 1.14 2002/05/10 01:48:20 hal9 - This is mostly proposed copyright/licensing additions and changes. Docs - are still GPL, but licensing and copyright are more visible. Also, copyright - changed in doc header comments (eliminate references to JB except FAQ). - - Revision 1.13 2002/05/05 20:29:59 hal9 - Ooops, fixing an accidental delete of title element. - - Revision 1.12 2002/05/05 20:26:02 hal9 - Sorting out license vs copyright in these docs. - - Revision 1.11 2002/05/04 08:44:45 swa - bumped version - - Revision 1.10 2002/04/26 17:24:31 swa - bookmarks cleaned, changed structure of user manual, screen and programlisting cleanups, and numerous other changes that I forgot - - Revision 1.9 2002/04/14 01:00:07 hal9 - Fix the logo properly with docbook. - - Revision 1.7 2002/04/12 10:11:53 swa - changed bookmarklet text so that users can easily find the bookmark - - Revision 1.6 2002/04/12 08:34:18 swa - added link to new page - - Revision 1.5 2002/04/12 02:05:19 david__schmidt - Tiny English fix: infos -> info - Add copyright date 2002 - - Revision 1.4 2002/04/08 20:42:07 swa - fixed JB spelling - - Revision 1.3 2002/04/07 20:27:18 hal9 - Fix meta data. - - Revision 1.2 2002/04/07 09:06:45 swa - users can now completely browse offline - - Revision 1.1 2002/04/07 08:10:48 swa - create some of the webserver docs - automatically (in particular if - those docs recycle other documentation - fragments). Now committed webserver's - index file. - - - --> - -</article> diff --git a/external/privoxy/doc/webserver/README.txt b/external/privoxy/doc/webserver/README.txt deleted file mode 100644 index 4221e3a..0000000 --- a/external/privoxy/doc/webserver/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -All files contained in this directory should eventually be -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/. - --Stefan, April 2002 \ No newline at end of file diff --git a/external/privoxy/doc/webserver/announce.txt b/external/privoxy/doc/webserver/announce.txt deleted file mode 100644 index be37205..0000000 --- a/external/privoxy/doc/webserver/announce.txt +++ /dev/null @@ -1,126 +0,0 @@ - Announcing Privoxy v.3.0.12 ------------------------------------------------------------------ - -Privoxy 3.0.12-stable is primarily a bugfix release. - -See http://www.privoxy.org/3.0.12/user-manual/whatsnew.html for details. - --------------------------------------------------------------------- -ChangeLog for Privoxy --------------------------------------------------------------------- -*** Version 3.0.12 *** - -- The socket-timeout option now also works on platforms whose - select() implementation modifies the timeout structure. - Previously the timeout was triggered even if the connection - didn't stall. Reported by cyberpatrol. -- The Connection: keep-alive code properly deals with files - larger than 2GB. Previously the connection was closed too - early. -- The content length for files above 2GB is logged correctly. -- The user-manual directive on the show-status page links to - the documentation location specified with the directive, - not to the Privoxy website. -- When running in daemon mode, Privoxy doesn't log anything - to the console unless there are errors before the logfile - has been opened. -- The show-status page prints warnings about invalid directives - on the same line as the directives themselves. -- Fixed several justified (but harmless) compiler warnings, - mostly on 64 bit platforms. -- The mingw32 version explicitly requests the default charset - to prevent display problems with some fonts available on more - recent Windows versions. Patch by Burberry. -- The mingw32 version uses the Privoxy icon in the alt-tab - windows. Patch by Burberry. -- The timestamp and the thread id is omitted in the "Fatal error" - message box on mingw32. -- Fixed two related mingw32-only buffer overflows. Triggering - them required control over the configuration file, therefore - this isn't seen as a security issue. -- In verbose mode, or if the new option --show-skipped-tests - is used, Privoxy-Regression-Test logs skipped tests and the - skip reason. - - ------------------------------------------------------------------ -About Privoxy: ------------------------------------------------------------------ - -Privoxy is a non-caching web proxy with advanced filtering capabilities for -enhancing privacy, modifying web page data and HTTP headers, controlling -access, and removing ads and other obnoxious Internet junk. Privoxy has a -flexible configuration and can be customized to suit individual needs and -tastes. It has application for both stand-alone systems and multi-user -networks. - -Privoxy is Free Software and licensed under the GPL2. - -Privoxy is an associated project of Software in the Public Interest (SPI). -Donations are welcome: http://www.privoxy.org/faq/general.html#DONATE - -At present, Privoxy is known to run on Windows(95, 98, ME, 2000, -XP, Vista), Linux (Ubuntu, RedHat, SuSE, Debian, Fedora, Gentoo and -others), Mac OSX, OS/2, AmigaOS, FreeBSD, NetBSD, OpenBSD, Solaris, and -various other flavors of Unix. - -In addition to the core features of ad blocking and cookie management, -Privoxy provides many supplemental features, that give the end-user -more control, more privacy and more freedom: - - - * Can keep outgoing connections alive and reuse them later on. - - * Supports tagging which allows to change the behaviour based on client - and server headers. - - * Can be run as an "intercepting" proxy, which obviates the need to - configure browsers individually. - - * Sophisticated actions and filters for manipulating both server and - client headers. - - * Can be chained with other proxies. - - * Integrated browser based configuration and control utility at - http://config.privoxy.org/ (shortcut: http://p.p/). Browser-based - tracing of rule and filter effects. Remote toggling. - - * Web page filtering (text replacements, removes banners based on size, - invisible "web-bugs", JavaScript and HTML annoyances, pop-up windows, - etc.) - - * Modularized configuration that allows for standard settings and user - settings to reside in separate files, so that installing updated actions - files won't overwrite individual user settings. - - * Support for Perl Compatible Regular Expressions in the configuration - files, and a more sophisticated and flexible configuration syntax. - - * Improved cookie management features (e.g. session based cookies). - - * GIF de-animation. - - * Bypass many click-tracking scripts (avoids script redirection). - - * Multi-threaded (POSIX and native threads). - - * User-customizable HTML templates for most proxy-generated pages (e.g. - "blocked" page). - - * Auto-detection and re-reading of config file changes. - - * Improved signal handling, and a true daemon mode (Unix). - - * Every feature now controllable on a per-site or per-location basis, - configuration more powerful and versatile over-all. - - -Download location: - http://sourceforge.net/project/showfiles.php?group_id=11118 - -Home Page: - http://www.privoxy.org/ - - - - Privoxy Developers ijbswa-developers@lists.sourceforge.net diff --git a/external/privoxy/doc/webserver/developer-manual/coding.html b/external/privoxy/doc/webserver/developer-manual/coding.html deleted file mode 100644 index 48259ed..0000000 --- a/external/privoxy/doc/webserver/developer-manual/coding.html +++ /dev/null @@ -1,2602 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Coding Guidelines</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Documentation Guidelines" -HREF="documentation.html"><LINK -REL="NEXT" -TITLE="Testing Guidelines" -HREF="testing.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="documentation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="testing.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CODING" ->4. Coding Guidelines</A -></H1 -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S1" ->4.1. Introduction</A -></H2 -><P ->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 - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->" consistent and reliable. Thus making - maintenance easier and increasing chances of success of the - project.</P -><P ->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. ;-></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S2" ->4.2. Using Comments</A -></H2 -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S3" ->4.2.1. Comment, Comment, Comment</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Comment as much as possible without commenting the obvious. - For example do not comment "variable_a is equal to variable_b". - Instead explain why variable_a should be equal to the variable_b. - 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!</P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->/* if page size greater than 1k ... */ -if ( page_length() > 1024 ) -{ - ... "block" the page up ... -} - -/* if page size is small, send it in blocks */ -if ( page_length() > 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.</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S4" ->4.2.2. Use blocks for comments</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->/********************************************************************* - * This will stand out clearly in your code! - *********************************************************************/ -if ( this_variable == that_variable ) -{ - do_something_very_important(); -} - - -/* unfortunately, this may not */ -if ( this_variable == that_variable ) -{ - do_something_very_important(); -} - - -if ( this_variable == that_variable ) /* this may not either */ -{ - do_something_very_important(); -}</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Exception:</I -></SPAN -></P -><P ->If you are trying to add a small logic comment and do not - wish to "disrupt" the flow of the code, feel free to use a 1 - line comment which is NOT on the same line as the code.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S5" ->4.2.3. Keep Comments on their own line</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->/********************************************************************* - * This will stand out clearly in your code, - * But the second example won't. - *********************************************************************/ -if ( this_variable == this_variable ) -{ - do_something_very_important(); -} - -if ( this_variable == this_variable ) /*can you see me?*/ -{ - do_something_very_important(); /*not easily*/ -} - - -/********************************************************************* - * But, the encouraged exceptions: - *********************************************************************/ -int urls_read = 0; /* # of urls read + rejected */ -int urls_rejected = 0; /* # of urls rejected */ - -if ( 1 == X ) -{ - do_something_very_important(); -} - - -short do_something_very_important( - short firstparam, /* represents something */ - short nextparam /* represents something else */ ) -{ - ...code here... - -} /* -END- do_something_very_important */</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S6" ->4.2.4. Comment each logical step</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Logical steps should be commented to help others follow the - intent of the written code and comments will make the code more - readable.</P -><P ->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.</P -><P ->Most "for", "while", "do", etc... loops _probably_ need a - comment. After all, these are usually major logic - containers.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S7" ->4.2.5. Comment All Functions Thoroughly</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S8" ->4.2.6. Comment at the end of braces if the - content is more than one screen length</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P ->As a suggestion , use the following flags to make the - comment and its brace more readable:</P -><P ->use following a closing brace: } /* -END- if() or while () - or etc... */</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->if ( 1 == X ) -{ - do_something_very_important(); - ...some long list of commands... -} /* -END- if x is 1 */ - -or: - -if ( 1 == X ) -{ - do_something_very_important(); - ...some long list of commands... -} /* -END- if ( 1 == X ) */</PRE -></TD -></TR -></TABLE -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S9" ->4.3. Naming Conventions</A -></H2 -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S10" ->4.3.1. Variable Names</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Use all lowercase, and separate 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++.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->int ms_iis5_hack = 0;</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->int msiis5hack = 0; int msIis5Hack = 0;</PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S11" ->4.3.2. Function Names</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Use all lowercase, and separate 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++.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->int load_some_file( struct client_state *csp )</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->int loadsomefile( struct client_state *csp ) -int loadSomeFile( struct client_state *csp )</PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S12" ->4.3.3. Header file prototypes</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->(.h) extern int load_aclfile( struct client_state *csp ); -(.c) int load_aclfile( struct client_state *csp )</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -> -<TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->(.h) extern int load_aclfile( struct client_state * ); or -(.h) extern int load_aclfile(); -(.c) int load_aclfile( struct client_state *csp )</PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S13" ->4.3.4. Enumerations, and #defines</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.)</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->(enumeration) : enum Boolean { FALSE, TRUE }; -(#define) : #define DEFAULT_SIZE 100;</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->#define FEATURE_FORCE 1 - -#ifdef FEATURE_FORCE -#define FORCE_PREFIX blah -#endif /* def FEATURE_FORCE */</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S14" ->4.3.5. Constants</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Spell common words out entirely (do not remove vowels).</P -><P ->Use only widely-known domain acronyms and abbreviations. - Capitalize all letters of an acronym.</P -><P ->Use underscore (_) to separate adjacent acronyms and - abbreviations. Never terminate a name with an underscore.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->#define USE_IMAGE_LIST 1</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->#define USE_IMG_LST 1 or -#define _USE_IMAGE_LIST 1 or -#define USE_IMAGE_LIST_ 1 or -#define use_image_list 1 or -#define UseImageList 1</PRE -></TD -></TR -></TABLE -></P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S15" ->4.4. Using Space</A -></H2 -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S16" ->4.4.1. Put braces on a line by themselves.</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->if ( this == that ) -{ - ... -}</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P ->if ( this == that ) { ... }</P -><P ->or</P -><P ->if ( this == that ) { ... }</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> In the special case that the if-statement is - inside a loop, and it is trivial, i.e. it tests for a - condition 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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> developer-discretion.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example exception:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->while ( more lines are read ) -{ - /* Please document what is/is not a comment line here */ - if ( it's a comment ) continue; - - do_something( line ); -}</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S17" ->4.4.2. ALL control statements should have a - block</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->if ( this == that ) -{ - do_something(); - do_something_else(); -}</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P ->if ( this == that ) do_something(); do_something_else();</P -><P ->or</P -><P ->if ( this == that ) do_something();</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S18" ->4.4.3. Do not belabor/blow-up boolean - expressions</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->structure->flag = ( condition );</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P ->if ( condition ) { structure->flag = 1; } else { - structure->flag = 0; }</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> The former is readable and concise. 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-)</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S19" ->4.4.4. Use white space freely because it is - free</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Make it readable. The notable exception to using white space - freely is listed in the next guideline.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->int first_value = 0; -int some_value = 0; -int another_value = 0; -int this_variable = 0; - -if ( this_variable == this_variable ) - -first_value = old_value + ( ( some_value - another_value ) - whatever )</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S20" ->4.4.5. Don't use white space around structure - operators</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->- structure pointer operator ( "->" ) - member operator ( - "." ) - functions and parentheses</P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->a_struct->a_member; -a_struct.a_member; -function_name();</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -> a_struct -> a_member; a_struct . a_member; - function_name ();</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S21" ->4.4.6. Make the last brace of a function stand - out</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->int function1( ... ) -{ - ...code... - return( ret_code ); - -} /* -END- function1 */ - - -int function2( ... ) -{ -} /* -END- function2 */</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P ->int function1( ... ) { ...code... return( ret_code ); } int - function2( ... ) { }</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> Use 1 blank line before the closing brace and 2 - lines afterward. This makes the end of function standout to - the most casual viewer. Although function comments help - separate 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!</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> developer-discretion on the number of blank - lines. Enforced is the end of function comments.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S22" ->4.4.7. Use 3 character indentions</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->static const char * const url_code_map[256] = -{ - NULL, ... -}; - - -int function1( ... ) -{ - if ( 1 ) - { - return( ALWAYS_TRUE ); - } - else - { - return( HOW_DID_YOU_GET_HERE ); - } - - return( NEVER_GETS_HERE ); - -}</PRE -></TD -></TR -></TABLE -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S23" ->4.5. Initializing</A -></H2 -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S24" ->4.5.1. Initialize all variables</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->short a_short = 0; -float a_float = 0; -struct *ptr = NULL;</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> It is much easier to debug a SIGSEGV if the - message says you are trying to access memory address 00000000 - and not 129FA012; or array_ptr[20] causes a SIGSEV vs. - array_ptr[0].</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> developer-discretion if and only if the - variable is assigned a value "shortly after" declaration.</P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S25" ->4.6. Functions</A -></H2 -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S26" ->4.6.1. Name functions that return a boolean as a - question.</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Value should be phrased as a question that would logically - be answered as a true or false statement</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->should_we_block_this(); -contains_an_image(); -is_web_page_blank();</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S27" ->4.6.2. Always specify a return type for a - function.</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S28" ->4.6.3. Minimize function calls when iterating by - using variables</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->It is easy to write the following code, and a clear argument - can be made that the code is easy to understand:</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->for ( size_t cnt = 0; cnt < block_list_length(); cnt++ ) -{ - .... -}</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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 block_list_length() 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 block_list_length() is a function - call, with the same overhead.</P -><P ->Instead of using a function call during the iterations, - assign the value to a variable, and evaluate using the - variable.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->size_t len = block_list_length(); - -for ( size_t cnt = 0; cnt < len; cnt++ ) -{ - .... -}</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Exceptions:</I -></SPAN -> if the value of block_list_length() - *may* change or could *potentially* change, then you must code the - function call in the for/while loop.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S29" ->4.6.4. Pass and Return by Const Reference</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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 );</P -><P ->I could then not use it to compare argv's in main: int main( - int argc, const char *argv[] ) { strcmp( argv[0], "privoxy" - ); }</P -><P ->Both these pointers are *const*! If the c runtime library - maintainers do it, we should too.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S30" ->4.6.5. Pass and Return by Value</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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 )</P -><P ->would not work. So, to be consistent, we should declare all - prototypes with "pass by value": int load_aclfile( struct - client_state *csp )</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S31" ->4.6.6. Names of include files</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->#include <iostream.h> /* This is not a local include */ -#include "config.h" /* This IS a local include */</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Exception:</I -></SPAN -></P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->/* This is not a local include, but requires a path element. */ -#include <sys/fileName.h></PRE -></TD -></TR -></TABLE -></P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> Please! do not add "-I." to the Makefile - without a _very_ good reason. This duplicates the #include - "file.h" behavior.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S32" ->4.6.7. Provide multiple inclusion - protection</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Prevents compiler and linker errors resulting from - redefinition of items.</P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED - ... -#endif /* ndef PROJECT_H_INCLUDED */</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S33" ->4.6.8. Use `extern "C"` when appropriate</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->#ifdef __cplusplus -extern "C" -{ -#endif /* def __cplusplus */ - -... function definitions here ... - -#ifdef __cplusplus -} -#endif /* def __cplusplus */</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S34" ->4.6.9. Where Possible, Use Forward Struct - Declaration Instead of Includes</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Useful in headers that include pointers to other struct's. - Modifications to excess header files may cause needless - compiles.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->/********************************************************************* - * We're avoiding an include statement here! - *********************************************************************/ -struct file_list; -extern file_list *xyz;</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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 unnecessary.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> Use with discretion.</P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S35" ->4.7. General Coding Practices</A -></H2 -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S36" ->4.7.1. Turn on warnings</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation</I -></SPAN -></P -><P ->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.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S37" ->4.7.2. Provide a default case for all switch - statements</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->switch( hash_string( cmd ) ) -{ - case hash_actions_file : - ... code ... - break; - - case hash_confdir : - ... code ... - break; - - default : - log_error( ... ); - ... anomaly code goes here ... - continue; / break; / exit( 1 ); / etc ... - -} /* end switch( hash_string( cmd ) ) */</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Another Note:</I -></SPAN -> This is not so much a readability issue - as a robust programming issue. The "anomaly code goes here" may - be no more than a print to the STDERR stream (as in - load_config). Or it may really be an abort condition.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> Programmer discretion is advised.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S38" ->4.7.3. Try to avoid falling through cases in a - switch statement.</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P ->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.</P -><P ->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.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S39" ->4.7.4. Use 'long' or 'short' Instead of - 'int'</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->On 32-bit platforms, int usually has the range of long. On - 16-bit platforms, int has the range of short.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> 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?</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S40" ->4.7.5. Don't mix size_t and other types</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S41" ->4.7.6. Declare each variable and struct on its - own line.</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->It can be tempting to declare a series of variables all on - one line. Don't.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->long a = 0; -long b = 0; -long c = 0;</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Instead of:</I -></SPAN -></P -><P ->long a, b, c;</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -> - 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</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Exceptions:</I -></SPAN -> when you want to declare a bunch of loop - variables or other trivial variables; feel free to declare them - on one line. You should, although, provide a good comment on - their functions.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> developer-discretion.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S42" ->4.7.7. Use malloc/zalloc sparingly</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->Create a local struct (on the stack) if the variable will - live and die within the context of one function call.</P -><P ->Only "malloc" a struct (on the heap) if the variable's life - will extend beyond the context of one function call.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->If a function creates a struct and stores a pointer to it in a -list, then it should definitely be allocated via `malloc'.</PRE -></TD -></TR -></TABLE -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S43" ->4.7.8. The Programmer Who Uses 'malloc' is - Responsible for Ensuring 'free'</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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/destructor type function to accommodate this.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->int load_re_filterfile( struct client_state *csp ) { ... } -static void unload_re_filterfile( void *f ) { ... }</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Exceptions:</I -></SPAN -></P -><P ->The developer cannot be expected to provide `free'ing - functions for C run-time library functions ... such as - `strdup'.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Status:</I -></SPAN -> developer-discretion. The "main" use of this - standard is for allocating and freeing data structures (complex - or nested).</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S44" ->4.7.9. Add loaders to the `file_list' structure - and in order</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="S45" ->4.7.10. "Uncertain" new code and/or changes to - existing code, use FIXME or XXX</A -></H3 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Explanation:</I -></SPAN -></P -><P ->If you have enough confidence in new code or confidence in - your changes, but are not *quite* sure of the repercussions, - add this:</P -><P ->/* FIXME: this code has a logic error on platform XYZ, * - attempting to fix */ #ifdef PLATFORM ...changed code here... - #endif</P -><P ->or:</P -><P ->/* FIXME: I think the original author really meant this... - */ ...changed code here...</P -><P ->or:</P -><P ->/* FIXME: new code that *may* break something else... */ - ...new code here...</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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 conversely exclude from the - project).</P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="S46" ->4.8. Addendum: Template for files and function - comment blocks:</A -></H2 -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example for file comments:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->const char FILENAME_rcs[] = "$Id: coding.html,v 1.42 2009/03/21 12:59:32 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/doc/webserver/developer-manual/coding.html,v $ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001-2009 - * the Privoxy team. http://www.privoxy.org/ - * - * 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/licenses/old-licenses/gpl-2.0.html - * or write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 , - * USA - * - * Revisions : - * $Log: coding.html,v $ - * Revision 1.42 2009/03/21 12:59:32 fabiankeil - * Rebuild with recent changes. - * - * - *********************************************************************/ - - -#include "config.h" - - ...necessary include files for us to do our work... - -const char FILENAME_h_rcs[] = FILENAME_H_VERSION;</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> 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.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> The formfeed character that is present right - after the comment flower box is handy for (X|GNU)Emacs users to - skip the verbiage and get to the heart of the code (via - `forward-page' and `backward-page'). Please include it if you - can.</P -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example for file header comments:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->#ifndef _FILENAME_H -#define _FILENAME_H -#define FILENAME_H_VERSION "$Id: coding.html,v 1.42 2009/03/21 12:59:32 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/doc/webserver/developer-manual/coding.html,v $ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001-2009 - * the Privoxy team. http://www.privoxy.org/ - * - * 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/licenses/old-licenses/gpl-2.0.html - * or write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 , - * USA - * - * Revisions : - * $Log: coding.html,v $ - * Revision 1.42 2009/03/21 12:59:32 fabiankeil - * Rebuild with recent changes. - * - * - *********************************************************************/ - - -#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: -*/</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Example for function comments:</I -></SPAN -></P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" ->/********************************************************************* - * - * Function : FUNCTION_NAME - * - * Description : (Fill me in with a good description!) - * - * parameters : - * 1 : param1 = pointer to an important thing - * 2 : x = pointer to something else - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int FUNCTION_NAME( void *param1, const char *x ) -{ - ... - return( 0 ); - -}</PRE -></TD -></TR -></TABLE -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Note:</I -></SPAN -> If we all follow this practice, we should be - able to parse our code to create a "self-documenting" web - page.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="documentation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="testing.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Documentation Guidelines</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Testing Guidelines</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/contact.html b/external/privoxy/doc/webserver/developer-manual/contact.html deleted file mode 100644 index 3d8ddc0..0000000 --- a/external/privoxy/doc/webserver/developer-manual/contact.html +++ /dev/null @@ -1,510 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Contacting the developers, Bug Reporting and Feature Requests</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Update the Webserver" -HREF="webserver-update.html"><LINK -REL="NEXT" -TITLE="Privoxy Copyright, License and History" -HREF="copyright.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="webserver-update.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="copyright.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CONTACT" ->8. Contacting the developers, Bug Reporting and Feature Requests</A -></H1 -><P -> We value your feedback. In fact, we rely on it to improve - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and its configuration. - However, please note the following hints, so we can - provide you with the best support:</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-SUPPORT" ->8.1. Get Support</A -></H2 -><P -> For casual users, our - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=211118" -TARGET="_top" ->support forum at SourceForge</A -> - is probably best suited: - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=211118" -TARGET="_top" ->http://sourceforge.net/tracker/?group_id=11118&atid=211118</A -></P -><P -> All users are of course welcome to discuss their issues on the <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-users" -TARGET="_top" ->users - mailing list</A ->, where the developers also hang around.</P -><P -> Please don't sent private support requests to individual Privoxy - developers, either use the mailing lists or the support trackers.</P -><P -> Note that the Privoxy mailing lists are moderated. Posts from unsubscribed - addresses have to be accepted manually by a moderator. This may cause a - delay of several days and if you use a subject that doesn't clearly - mention Privoxy or one of its features, your message may be accidentally - discarded as spam.</P -><P -> If you aren't subscribed, you should therefore spend a few seconds - to come up with a proper subject. Additionally you should make it clear - that you want to get CC'd. Otherwise some responses will be directed to - the mailing list only, and you won't see them.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="REPORTING" ->8.2. Reporting Problems</A -></H2 -><P -><SPAN -CLASS="QUOTE" ->"Problems"</SPAN -> for our purposes, come in two forms:</P -><P -></P -><UL -><LI -><P -> Configuration issues, such as ads that slip through, or sites that - don't function properly due to one <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - <SPAN -CLASS="QUOTE" ->"action"</SPAN -> or another being turned <SPAN -CLASS="QUOTE" ->"on"</SPAN ->. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"Bugs"</SPAN -> in the programming code that makes up - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, such as that might cause a crash. - </P -></LI -></UL -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="CONTACT-ADS" ->8.2.1. Reporting Ads or Other Configuration Problems</A -></H3 -><P -> Please send feedback on ads that slipped through, innocent images that were - blocked, sites that don't work properly, and other configuration related problem of - <TT -CLASS="FILENAME" ->default.action</TT -> file, to - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=460288" -TARGET="_top" -> http://sourceforge.net/tracker/?group_id=11118&atid=460288</A ->, - the Actions File Tracker.</P -><P -> New, improved <TT -CLASS="FILENAME" ->default.action</TT -> files may occasionally be made - available based on your feedback. These will be announced on the <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce" -TARGET="_top" ->ijbswa-announce</A -> - list and available from our the <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->files section</A -> of - our <A -HREF="http://sf.net/projects/ijbswa/" -TARGET="_top" ->project page</A ->.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="CONTACT-BUGS" ->8.2.2. Reporting Bugs</A -></H3 -><P -> Please report all bugs through our bug tracker: - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=111118" -TARGET="_top" ->http://sourceforge.net/tracker/?group_id=11118&atid=111118</A ->. </P -><P -> Before doing so, please make sure that the bug has <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not already been submitted</I -></SPAN -> - and observe the additional hints at the top of the <A -HREF="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=111118" -TARGET="_top" ->submit - form</A ->. If already submitted, please feel free to add any info to the - original report that might help to solve the issue.</P -><P -> Please try to verify that it is a <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> bug, - and not a browser or site bug or documented behaviour that just happens - to be different than what you expected. If unsure, - try <A -HREF="http://config.privoxy.org/toggle?set=disable" -TARGET="_top" ->toggling - off</A -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, and see if the problem persists.</P -><P -> If you are using your own custom configuration, please try - the stock configs to see if the problem is configuration related. - If you're having problems with a feature that is disabled by default, - please ask around on the mailing list if others can reproduce the problem.</P -><P -> If you aren't using the latest Privoxy version, the bug may have been found - and fixed in the meantime. We would appreciate if you could take the time - to <A -HREF="http://www.privoxy.org/user-manual/installation.html" -TARGET="_top" ->upgrade - to the latest version</A -> (or even the latest CVS snapshot) and verify - that your bug still exists.</P -><P ->Please be sure to provide the following information:</P -><P -> <P -></P -><UL -><LI -><P -> The exact <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version you are using - (if you got the source from CVS, please also provide the source code revisions - as shown in <A -HREF="http://config.privoxy.org/show-version" -TARGET="_top" ->http://config.privoxy.org/show-version</A ->). - </P -></LI -><LI -><P -> The operating system and versions you run - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on, (e.g. <SPAN -CLASS="APPLICATION" ->Windows - XP SP2</SPAN ->), if you are using a Unix flavor, - sending the output of <SPAN -CLASS="QUOTE" ->"uname -a"</SPAN -> should do, - in case of GNU/Linux, please also name the distribution. - </P -></LI -><LI -><P -> The name, platform, and version of the <SPAN -CLASS="APPLICATION" ->browser</SPAN -> - you were using (e.g. <SPAN -CLASS="APPLICATION" ->Internet Explorer v5.5</SPAN -> for Mac). - </P -></LI -><LI -><P -> The URL where the problem occurred, or some way for us to duplicate the - problem (e.g. <TT -CLASS="LITERAL" ->http://somesite.example.com/?somethingelse=123</TT ->). - </P -></LI -><LI -><P -> Whether your version of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is one supplied - by the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developers via SourceForge, - or if you got your copy somewhere else. - </P -></LI -><LI -><P -> Whether you are using <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in tandem with - another proxy such as <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->. If so, please - temporary disable the other proxy to see if the symptoms change. - </P -></LI -><LI -><P -> Whether you are using a personal firewall product. If so, does - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> work without it? - </P -></LI -><LI -><P -> Any other pertinent information to help identify the problem such as config - or log file excerpts (yes, you should have log file entries for each - action taken). - </P -></LI -></UL -></P -><P -> You don't have to tell us your actual name when filing a problem - report, but please use a nickname so we can differentiate between - your messages and the ones entered by other "anonymous" users that - may respond to your request if they have the same problem or already - found a solution.</P -><P -> Please also check the status of your request a few days after submitting - it, as we may request additional information. If you use a SF id, - you should automatically get a mail when someone responds to your request.</P -><P -> The <A -HREF="http://www.privoxy.org/user-manual/appendix.html#ACTIONSANAT" -TARGET="_top" ->appendix - of the Privoxy User Manual</A -> also has helpful information - on understanding <TT -CLASS="LITERAL" ->actions</TT ->, and <TT -CLASS="LITERAL" ->action</TT -> debugging. </P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-FEATURE" ->8.3. Request New Features</A -></H2 -><P -> You are welcome to submit ideas on new features or other proposals - for improvement through our feature request tracker at - <A -HREF="http://sourceforge.net/tracker/?atid=361118&group_id=11118" -TARGET="_top" ->http://sourceforge.net/tracker/?atid=361118&group_id=11118</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-OTHER" ->8.4. Other</A -></H2 -><P ->For any other issues, feel free to use the mailing lists. Technically interested users -and people who wish to contribute to the project are also welcome on the developers list! -You can find an overview of all <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->-related mailing lists, -including list archives, at: -<A -HREF="http://sourceforge.net/mail/?group_id=11118" -TARGET="_top" ->http://sourceforge.net/mail/?group_id=11118</A ->.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="webserver-update.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="copyright.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Update the Webserver</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Privoxy Copyright, License and History</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/copyright.html b/external/privoxy/doc/webserver/developer-manual/copyright.html deleted file mode 100644 index 5fbe9a4..0000000 --- a/external/privoxy/doc/webserver/developer-manual/copyright.html +++ /dev/null @@ -1,298 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy Copyright, License and History</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Contacting the developers, Bug Reporting and Feature Requests" -HREF="contact.html"><LINK -REL="NEXT" -TITLE="See also" -HREF="seealso.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="contact.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="seealso.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="COPYRIGHT" ->9. Privoxy Copyright, License and History</A -></H1 -><P -> Copyright © 2001-2009 by Privoxy Developers <CODE -CLASS="EMAIL" -><<A -HREF="mailto:ijbswa-developers@lists.sourceforge.net" ->ijbswa-developers@lists.sourceforge.net</A ->></CODE -></P -><P -> Some source code is based on code Copyright © 1997 by Anonymous Coders - and Junkbusters, Inc. and licensed under the <I -CLASS="CITETITLE" ->GNU General Public - License</I ->.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN1223" ->9.1. License</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is free software; you can - redistribute it and/or modify it under the terms of the - <I -CLASS="CITETITLE" ->GNU General Public License</I ->, version 2, - as published by the Free Software Foundation.</P -><P -> 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 <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" -> <I -CLASS="CITETITLE" ->GNU General Public License</I -></A -> for details.</P -><P -> You should have received a copy of the <I -CLASS="CITETITLE" ->GNU GPL</I -> - along with this program; if not, write to the <P -CLASS="ADDRESS" -> Free Software<br> - Foundation, Inc. <SPAN -CLASS="STREET" ->51 Franklin Street, Fifth Floor</SPAN -><br> - <SPAN -CLASS="CITY" ->Boston</SPAN ->, <SPAN -CLASS="STATE" ->MA</SPAN -> <SPAN -CLASS="POSTCODE" ->02110-1301</SPAN -><br> - <SPAN -CLASS="COUNTRY" ->USA</SPAN -> </P -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN1239" ->9.2. History</A -></H2 -><P -> A long time ago, there was the - <A -HREF="http://www.junkbusters.com/ijb.html" -TARGET="_top" -><SPAN -CLASS="APPLICATION" ->Internet Junkbuster</SPAN -></A ->, - by Anonymous Coders and <A -HREF="http://www.junkbusters.com/" -TARGET="_top" ->Junkbusters - Corporation</A ->. This saved many users a lot of pain in the early days of - web advertising and user tracking.</P -><P -> But the web, its protocols and standards, and with it, the techniques for - forcing ads on users, give up autonomy over their browsing, and - for tracking them, keeps evolving. Unfortunately, the <SPAN -CLASS="APPLICATION" ->Internet - Junkbuster</SPAN -> did not. Version 2.0.2, published in 1998, was - (and is) the last official - <A -HREF="http://www.junkbusters.com/ijbdist.html#release" -TARGET="_top" ->release</A -> - available from <A -HREF="http://www.junkbusters.com" -TARGET="_top" ->Junkbusters Corporation</A ->. - Fortunately, it had been released under the GNU - <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" ->GPL</A ->, - which allowed further development by others.</P -><P -> So Stefan Waldherr started maintaining an improved version of the - software, to which eventually a number of people contributed patches. - It could already replace banners with a transparent image, and had a first - version of pop-up killing, but it was still very closely based on the - original, with all its limitations, such as the lack of HTTP/1.1 support, - flexible per-site configuration, or content modification. The last release - from this effort was version 2.0.2-10, published in 2000.</P -><P -> Then, some - <A -HREF="http://www.privoxy.org/user-manual/copyright.html#AUTHORS" -TARGET="_top" ->developers</A -> - picked up the thread, and started turning the software inside out, upside down, - and then reassembled it, adding many - <A -HREF="http://www.privoxy.org/user-manual/introduction.html#FEATURES" -TARGET="_top" ->new - features</A -> along the way.</P -><P -> The result of this is <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, whose first - stable version, 3.0, was released August, 2002. - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="contact.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="seealso.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Contacting the developers, Bug Reporting and Feature Requests</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->See also</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/cvs.html b/external/privoxy/doc/webserver/developer-manual/cvs.html deleted file mode 100644 index db1fb9e..0000000 --- a/external/privoxy/doc/webserver/developer-manual/cvs.html +++ /dev/null @@ -1,330 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->The CVS Repository</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Introduction" -HREF="introduction.html"><LINK -REL="NEXT" -TITLE="Documentation Guidelines" -HREF="documentation.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="introduction.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="documentation.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CVS" ->2. The CVS Repository</A -></H1 -><P -> If you become part of the active development team, you will eventually - need write access to our holy grail, the CVS repository. One of the - team members will need to set this up for you. Please read - this chapter completely before accessing via CVS. - </P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CVSACCESS" ->2.1. Access to CVS</A -></H2 -><P -> The project's CVS repository is hosted on - <A -HREF="http://sourceforge.net/" -TARGET="_top" ->SourceForge.</A -> - Please refer to the chapters 6 and 7 in - <A -HREF="http://sourceforge.net/docman/?group_id=1" -TARGET="_top" ->SF's site - documentation</A -> for the technical access details for your - operating system. For historical reasons, the CVS server is - called <TT -CLASS="LITERAL" ->ijbswa.cvs.sourceforge.net</TT ->, the repository is - called <TT -CLASS="LITERAL" ->ijbswa</TT ->, and the source tree module is called - <TT -CLASS="LITERAL" ->current</TT ->. - </P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CVSBRANCHES" ->2.2. Branches</A -></H2 -><P -> Within the CVS repository, there are modules and branches. As - mentioned, the sources are in the <TT -CLASS="LITERAL" ->current</TT -> - <SPAN -CLASS="QUOTE" ->"module"</SPAN ->. Other modules are present for platform specific - issues. There is a webview of the CVS hierarchy at <A -HREF="http://ijbswa.cvs.sourceforge.net/ijbswa/" -TARGET="_top" ->http://ijbswa.cvs.sourceforge.net/ijbswa/</A ->, - which might help with visualizing how these pieces fit together. - </P -><P -> Branches are used to fork a sub-development path from the main trunk. - Within the <TT -CLASS="LITERAL" ->current</TT -> module where the sources are, there - is always at least one <SPAN -CLASS="QUOTE" ->"branch"</SPAN -> from the main trunk - devoted to a stable release series. The main trunk is where active - development takes place for the next stable series (e.g. 3.2.x). - So just prior to each stable series (e.g. 3.0.x), a branch is created - just for stable series releases (e.g. 3.0.0 -> 3.0.1 -> 3.0.2, etc). - Once the initial stable release of any stable branch has taken place, - this branch is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->only used for bugfixes</I -></SPAN ->, which have - had prior testing before being committed to CVS. (See <A -HREF="newrelease.html#VERSIONNUMBERS" ->Version Numbers</A -> below for details on - versioning.) - </P -><P -> At one time there were two distinct branches: stable and unstable. The - more drastic changes were to be in the unstable branch. These branches - have now been merged to minimize time and effort of maintaining two - branches. - </P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CVSCOMMIT" ->2.3. CVS Commit Guidelines</A -></H2 -><P -> The source tree is the heart of every software project. Every effort must - be made to ensure that it is readable, compilable and consistent at all - times. There are differing guidelines for the stable branch and the - main development trunk, and we ask anyone with CVS access to strictly - adhere to the following guidelines: - </P -><P -> Basic Guidelines, for all branches: - </P -><P -> <P -></P -><UL -><LI -><P -> Please don't commit even - a small change without testing it thoroughly first. When we're - close to a public release, ask a fellow developer to review your - changes. - </P -></LI -><LI -><P -> Your commit message should give a concise overview of <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->what you - changed</I -></SPAN -> (no big details) and <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->why you changed it</I -></SPAN -> - Just check previous messages for good examples. - </P -></LI -><LI -><P -> Don't use the same message on multiple files, unless it equally applies to - all those files. - </P -></LI -><LI -><P -> If your changes span multiple files, and the code won't recompile unless - all changes are committed (e.g. when changing the signature of a function), - then commit all files one after another, without long delays in between. - If necessary, prepare the commit messages in advance. - </P -></LI -><LI -><P -> Before changing things on CVS, make sure that your changes are in line - with the team's general consensus on what should be done. - </P -></LI -><LI -><P -> Note that near a major public release, we get more cautious. - There is always the possibility to submit a patch to the <A -HREF="http://sourceforge.net/tracker/?atid=311118&group_id=11118&func=brow..." -TARGET="_top" ->patch - tracker</A -> instead. - </P -></LI -></UL -> - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="introduction.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="documentation.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Introduction</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Documentation Guidelines</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/documentation.html b/external/privoxy/doc/webserver/developer-manual/documentation.html deleted file mode 100644 index d547c23..0000000 --- a/external/privoxy/doc/webserver/developer-manual/documentation.html +++ /dev/null @@ -1,944 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Documentation Guidelines</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="The CVS Repository" -HREF="cvs.html"><LINK -REL="NEXT" -TITLE="Coding Guidelines" -HREF="coding.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="cvs.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="coding.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="DOCUMENTATION" ->3. Documentation Guidelines</A -></H1 -><P -> All formal documents are maintained in Docbook SGML and located in the - <SAMP -CLASS="COMPUTEROUTPUT" ->doc/source/*</SAMP -> directory. You will need - <A -HREF="http://www.docbook.org" -TARGET="_top" ->Docbook</A ->, the Docbook - DTD's and the Docbook modular stylesheets (or comparable alternatives), - and either <SPAN -CLASS="APPLICATION" ->jade</SPAN -> or - <SPAN -CLASS="APPLICATION" ->openjade</SPAN -> (recommended) installed in order to - build docs from source. Currently there is <A -HREF="../user-manual/index.html" -TARGET="_top" -><I -CLASS="CITETITLE" ->user-manual</I -></A ->, - <A -HREF="../faq/index.html" -TARGET="_top" -><I -CLASS="CITETITLE" ->FAQ</I -></A ->, and, of - course this, the <I -CLASS="CITETITLE" ->developer-manual</I -> in this format. - The <I -CLASS="CITETITLE" ->README</I ->, <I -CLASS="CITETITLE" ->AUTHORS</I ->, - <I -CLASS="CITETITLE" ->INSTALL</I ->, - <I -CLASS="CITETITLE" ->privoxy.1</I -> (man page), and - <I -CLASS="CITETITLE" ->config</I -> files are also now maintained as Docbook - SGML. These files, when built, in the top-level source directory are - generated files! Also, the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> <TT -CLASS="FILENAME" ->index.html</TT -> (and a - variation on this file, <TT -CLASS="FILENAME" ->privoxy-index.html</TT ->, - meant for inclusion with doc packages), are maintained as SGML as well. - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->DO NOT edit these directly</I -></SPAN ->. Edit the SGML source, or - contact someone involved in the documentation. - </P -><P -> <TT -CLASS="FILENAME" ->config</TT -> requires some special handling. The reason it - is maintained this way is so that the extensive comments in the file - mirror those in <I -CLASS="CITETITLE" ->user-manual</I ->. But the conversion - process requires going from SGML to HTML to text to special formatting - required for the embedded comments. Some of this does not survive so - well. Especially some of the examples that are longer than 80 characters. - The build process for this file outputs to <TT -CLASS="FILENAME" ->config.new</TT ->, - which should be reviewed for errors and mis-formatting. Once satisfied - that it is correct, then it should be hand copied to - <TT -CLASS="FILENAME" ->config</TT ->. - </P -><P -> Other, less formal documents (e.g. <TT -CLASS="FILENAME" ->LICENSE</TT ->) are - maintained as plain text files in the top-level source directory. - </P -><P -> Packagers are encouraged to include this documentation. For those without - the ability to build the docs locally, text versions of each are kept in - CVS. HTML versions are also being kept in CVS under - <TT -CLASS="FILENAME" ->doc/webserver/*</TT ->. And PDF version are kept in - <TT -CLASS="FILENAME" ->doc/pdf/*</TT ->. - </P -><P -> Formal documents are built with the Makefile targets of - <SAMP -CLASS="COMPUTEROUTPUT" ->make dok</SAMP ->, or alternately - <SAMP -CLASS="COMPUTEROUTPUT" ->make redhat-dok</SAMP ->. If you have problems, - try both. The build process uses the document SGML sources in - <SAMP -CLASS="COMPUTEROUTPUT" ->doc/source/*/*</SAMP -> to update all text files in - <SAMP -CLASS="COMPUTEROUTPUT" ->doc/text/</SAMP -> and to update all HTML - documents in <SAMP -CLASS="COMPUTEROUTPUT" ->doc/webserver/</SAMP ->. - </P -><P -> Documentation writers should please make sure documents build - successfully before committing to CVS, if possible. - </P -><P -> How do you update the webserver (i.e. the pages on privoxy.org)? - - <P -></P -><OL -TYPE="1" -><LI -><P -> First, build the docs by running <SAMP -CLASS="COMPUTEROUTPUT" ->make - dok</SAMP -> (or alternately <SAMP -CLASS="COMPUTEROUTPUT" ->make - redhat-dok</SAMP ->). For PDF docs, do <SAMP -CLASS="COMPUTEROUTPUT" ->make - dok-pdf</SAMP ->. - </P -></LI -><LI -><P -> Run <SAMP -CLASS="COMPUTEROUTPUT" ->make webserver</SAMP -> which copies all - files from <SAMP -CLASS="COMPUTEROUTPUT" ->doc/webserver</SAMP -> to the - sourceforge webserver via scp. - </P -></LI -></OL -> - </P -><P -> Finished docs should be occasionally submitted to CVS - (<TT -CLASS="FILENAME" ->doc/webserver/*/*.html</TT ->) so that those without - the ability to build them locally, have access to them if needed. - This is especially important just prior to a new release! Please - do this <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->after</I -></SPAN -> the <TT -CLASS="LITERAL" ->$VERSION</TT -> and - other release specific data in <TT -CLASS="FILENAME" ->configure.in</TT -> has been - updated (this is done just prior to a new release). - </P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="SGML" ->3.1. Quickstart to Docbook and SGML</A -></H2 -><P -> If you are not familiar with SGML, it is a markup language similar to HTML. - Actually, not a mark up language per se, but a language used to define - markup languages. In fact, HTML is an SGML application. Both will use - <SPAN -CLASS="QUOTE" ->"tags"</SPAN -> to format text and other content. SGML tags can be much - more varied, and flexible, but do much of the same kinds of things. The tags, - or <SPAN -CLASS="QUOTE" ->"elements"</SPAN ->, are definable in SGML. There is no set - <SPAN -CLASS="QUOTE" ->"standards"</SPAN ->. Since we are using - <SPAN -CLASS="APPLICATION" ->Docbook</SPAN ->, our tags are those that are defined by - <SPAN -CLASS="APPLICATION" ->Docbook</SPAN ->. Much of how the finish document is - rendered is determined by the <SPAN -CLASS="QUOTE" ->"stylesheets"</SPAN ->. - The stylesheets determine how each tag gets translated to HTML, or other - formats.</P -><P -> Tags in Docbook SGML need to be always <SPAN -CLASS="QUOTE" ->"closed"</SPAN ->. If not, you - will likely generate errors. Example: <TT -CLASS="LITERAL" -><title>My - Title</title></TT ->. They are also case-insensitive, but we - strongly suggest using all lower case. This keeps compatibility with - [Docbook] <SPAN -CLASS="APPLICATION" ->XML</SPAN ->.</P -><P -> Our documents use <SPAN -CLASS="QUOTE" ->"sections"</SPAN -> for the most part. Sections - will be processed into HTML headers (e.g. <TT -CLASS="LITERAL" ->h1</TT -> for - <TT -CLASS="LITERAL" ->sect1</TT ->). The <SPAN -CLASS="APPLICATION" ->Docbook</SPAN -> stylesheets - will use these to also generate the Table of Contents for each doc. Our - TOC's are set to a depth of three. Meaning <TT -CLASS="LITERAL" ->sect1</TT ->, - <TT -CLASS="LITERAL" ->sect2</TT ->, and <TT -CLASS="LITERAL" ->sect3</TT -> will have TOC - entries, but <TT -CLASS="LITERAL" ->sect4</TT -> will not. Each section requires - a <TT -CLASS="LITERAL" -><title></TT -> element, and at least one - <TT -CLASS="LITERAL" -><para></TT ->. There is a limit of five section - levels in Docbook, but generally three should be sufficient for our - purposes.</P -><P -> Some common elements that you likely will use: </P -><P -> <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><para></para></I -></SPAN ->, paragraph delimiter. Most - text needs to be within paragraph elements (there are some exceptions). - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><emphasis></emphasis></I -></SPAN ->, the stylesheets - make this italics. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><filename></filename></I -></SPAN ->, files and directories. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><command></command></I -></SPAN ->, command examples. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><literallayout></literallayout></I -></SPAN ->, like - <TT -CLASS="LITERAL" -><pre></TT ->, more or less. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><itemizedlist></itemizedlist></I -></SPAN ->, list with bullets. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><listitem></listitem></I -></SPAN ->, member of the above. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><screen></screen></I -></SPAN ->, screen output, implies - <TT -CLASS="LITERAL" -><literallayout></TT ->. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><ulink url="example.com"></ulink></I -></SPAN ->, like - HTML <TT -CLASS="LITERAL" -><a></TT -> tag. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><quote></quote></I -></SPAN ->, for, doh, quoting text. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -> Look at any of the existing docs for examples of all these and more.</P -><P -> You might also find <SPAN -CLASS="QUOTE" ->"<A -HREF="http://opensource.bureau-cornavin.com/crash-course/index.html" -TARGET="_top" ->Writing Documentation - Using DocBook - A Crash Course</A ->"</SPAN -> useful.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="DOCSTYLE" ->3.2. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Documentation Style</A -></H2 -><P -> It will be easier if everyone follows a similar writing style. This - just makes it easier to read what someone else has written if it - is all done in a similar fashion. - </P -><P -> Here it is: - </P -><P -> <P -></P -><UL -><LI -><P -> All tags should be lower case. - </P -></LI -><LI -><P -> Tags delimiting a <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->block</I -></SPAN -> of text (even small - blocks) should be on their own line. Like: - <P -CLASS="LITERALLAYOUT" -> <para><br> - Some text goes here.<br> - </para><br> - </P -> - Tags marking individual words, or few words, should be in-line: - <P -CLASS="LITERALLAYOUT" -> Just to <emphasis>emphasize</emphasis>, some text goes here.<br> - </P -> - </P -></LI -><LI -><P -> Tags should be nested and step indented for block text like: (except - in-line tags) - <P -CLASS="LITERALLAYOUT" -> <para><br> - <itemizedlist><br> - <para><br> - <listitem><br> - Some text goes here in our list example.<br> - </listitem><br> - </para><br> - </itemizedlist><br> - </para><br> - </P -> - This makes it easier to find the text amongst the tags ;-) - </P -></LI -><LI -><P -> Use white space to separate logical divisions within a document, - like between sections. Running everything together consistently - makes it harder to read and work on. - </P -></LI -><LI -><P -> Do not hesitate to make comments. Comments can either use the - <comment> element, or the <!-- --> style comment - familiar from HTML. (Note in Docbook v4.x <comment> is - replaced by <remark>.) - </P -></LI -><LI -><P -> We have an international audience. Refrain from slang, or English - idiosyncrasies (too many to list :). Humor also does not translate - well sometimes. - </P -></LI -><LI -><P -> Try to keep overall line lengths in source files to 80 characters or less - for obvious reasons. This is not always possible, with lengthy URLs for - instance. - </P -></LI -><LI -><P -> Our documents are available in differing formats. Right now, they - are just plain text, HTML, and PDF, but others are always a - future possibility. Be careful with URLs (<ulink>), and avoid - this mistake: - </P -><P -> My favorite site is <ulink url="http://example.com%22%3Ehere%3C/ulink%3E;. - </P -><P -> This will render as <SPAN -CLASS="QUOTE" ->"My favorite site is here"</SPAN ->, which is - not real helpful in a text doc. Better like this: - </P -><P -> My favorite site is <ulink url="http://example.com%22%3Eexample.com%3C/ulink%3E;. - </P -></LI -><LI -><P -> All documents should be spell checked occasionally. - <SPAN -CLASS="APPLICATION" ->aspell</SPAN -> can check SGML with the - <TT -CLASS="LITERAL" ->-H</TT -> option. (<SPAN -CLASS="APPLICATION" ->ispell</SPAN -> I think - too.) - </P -></LI -></UL -> - </P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN217" ->3.3. Privoxy Custom Entities</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> documentation is using - a number of customized <SPAN -CLASS="QUOTE" ->"entities"</SPAN -> to facilitate - documentation maintenance. - </P -><P -> We are using a set of <SPAN -CLASS="QUOTE" ->"boilerplate"</SPAN -> files with generic text, - that is used by multiple docs. This way we can write something once, and use - it repeatedly without having to re-write the same content over and over again. - If editing such a file, keep in mind that it should be - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->generic</I -></SPAN ->. That is the purpose; so it can be used in varying - contexts without additional modifications. - </P -><P -> We are also using what <SPAN -CLASS="APPLICATION" ->Docbook</SPAN -> calls - <SPAN -CLASS="QUOTE" ->"internal entities"</SPAN ->. These are like variables in - programming. Well, sort of. For instance, we have the - <TT -CLASS="LITERAL" ->p-version</TT -> entity that contains the current - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version string. You are strongly - encouraged to use these where possible. Some of these obviously - require re-setting with each release (done by the Makefile). A sampling of - custom entities are listed below. See any of the main docs for examples. - </P -><P -> <P -></P -><UL -><LI -><P -> Re- <SPAN -CLASS="QUOTE" ->"boilerplate"</SPAN -> text entities are defined like: - </P -><P -> <TT -CLASS="LITERAL" -><!entity supported SYSTEM "supported.sgml"></TT -> - </P -><P -> In this example, the contents of the file, - <TT -CLASS="FILENAME" ->supported.sgml</TT -> is available for inclusion anywhere - in the doc. To make this happen, just reference the now defined - entity: <TT -CLASS="LITERAL" ->&supported;</TT -> (starts with an ampersand - and ends with a semi-colon), and the contents will be dumped into - the finished doc at that point. - </P -></LI -><LI -><P -> Commonly used <SPAN -CLASS="QUOTE" ->"internal entities"</SPAN ->: - </P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->p-version</I -></SPAN ->: the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - version string, e.g. <SPAN -CLASS="QUOTE" ->"3.0.12"</SPAN ->. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->p-status</I -></SPAN ->: the project status, either - <SPAN -CLASS="QUOTE" ->"alpha"</SPAN ->, <SPAN -CLASS="QUOTE" ->"beta"</SPAN ->, or <SPAN -CLASS="QUOTE" ->"stable"</SPAN ->. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->p-not-stable</I -></SPAN ->: use to conditionally include - text in <SPAN -CLASS="QUOTE" ->"not stable"</SPAN -> releases (e.g. <SPAN -CLASS="QUOTE" ->"beta"</SPAN ->). - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->p-stable</I -></SPAN ->: just the opposite. - </TD -></TR -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->p-text</I -></SPAN ->: this doc is only generated as text. - </TD -></TR -></TBODY -></TABLE -><P -></P -></LI -></UL -> - </P -><P -> There are others in various places that are defined for a specific - purpose. Read the source! - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="cvs.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="coding.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->The CVS Repository</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Coding Guidelines</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/index.html b/external/privoxy/doc/webserver/developer-manual/index.html deleted file mode 100644 index 4360e6b..0000000 --- a/external/privoxy/doc/webserver/developer-manual/index.html +++ /dev/null @@ -1,688 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy Developer Manual</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="NEXT" -TITLE="Introduction" -HREF="introduction.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="ARTICLE" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="ARTICLE" -><DIV -CLASS="TITLEPAGE" -><H1 -CLASS="TITLE" -><A -NAME="AEN2" ->Privoxy Developer Manual</A -></H1 -><P -CLASS="PUBDATE" -> <SUB -> - - <A -HREF="copyright.html" ->Copyright</A -> © 2001-2009 by - <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->Privoxy Developers</A -> - </SUB -> - <BR></P -><P -CLASS="PUBDATE" ->$Id: index.html,v 1.42 2009/03/21 12:59:32 fabiankeil Exp $<BR></P -><DIV -><DIV -CLASS="ABSTRACT" -><P -></P -><A -NAME="AEN9" -></A -><P -> The developer manual provides guidance on coding, testing, packaging, documentation - and other issues of importance to those involved with - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> development. It is mandatory (and helpful!) reading - for anyone who wants to join the team. Note that it's currently out of date - and may not be entirely correct. As always, patches are welcome.</P -><P -> Please note that this document is constantly evolving. This copy represents - the state at the release of version 3.0.12. - You can find the latest version of the this manual at <A -HREF="http://www.privoxy.org/developer-manual/" -TARGET="_top" ->http://www.privoxy.org/developer-manual/</A ->. - Please see <A -HREF="contact.html" ->the Contact section</A -> - on how to contact the developers.</P -><P -></P -></DIV -></DIV -><HR></DIV -><DIV -CLASS="TOC" -><DL -><DT -><B ->Table of Contents</B -></DT -><DT ->1. <A -HREF="introduction.html" ->Introduction</A -></DT -><DD -><DL -><DT ->1.1. <A -HREF="introduction.html#QUICKSTART" ->Quickstart to Privoxy Development</A -></DT -></DL -></DD -><DT ->2. <A -HREF="cvs.html" ->The CVS Repository</A -></DT -><DD -><DL -><DT ->2.1. <A -HREF="cvs.html#CVSACCESS" ->Access to CVS</A -></DT -><DT ->2.2. <A -HREF="cvs.html#CVSBRANCHES" ->Branches</A -></DT -><DT ->2.3. <A -HREF="cvs.html#CVSCOMMIT" ->CVS Commit Guidelines</A -></DT -></DL -></DD -><DT ->3. <A -HREF="documentation.html" ->Documentation Guidelines</A -></DT -><DD -><DL -><DT ->3.1. <A -HREF="documentation.html#SGML" ->Quickstart to Docbook and SGML</A -></DT -><DT ->3.2. <A -HREF="documentation.html#DOCSTYLE" -><SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Documentation Style</A -></DT -><DT ->3.3. <A -HREF="documentation.html#AEN217" ->Privoxy Custom Entities</A -></DT -></DL -></DD -><DT ->4. <A -HREF="coding.html" ->Coding Guidelines</A -></DT -><DD -><DL -><DT ->4.1. <A -HREF="coding.html#S1" ->Introduction</A -></DT -><DT ->4.2. <A -HREF="coding.html#S2" ->Using Comments</A -></DT -><DD -><DL -><DT ->4.2.1. <A -HREF="coding.html#S3" ->Comment, Comment, Comment</A -></DT -><DT ->4.2.2. <A -HREF="coding.html#S4" ->Use blocks for comments</A -></DT -><DT ->4.2.3. <A -HREF="coding.html#S5" ->Keep Comments on their own line</A -></DT -><DT ->4.2.4. <A -HREF="coding.html#S6" ->Comment each logical step</A -></DT -><DT ->4.2.5. <A -HREF="coding.html#S7" ->Comment All Functions Thoroughly</A -></DT -><DT ->4.2.6. <A -HREF="coding.html#S8" ->Comment at the end of braces if the - content is more than one screen length</A -></DT -></DL -></DD -><DT ->4.3. <A -HREF="coding.html#S9" ->Naming Conventions</A -></DT -><DD -><DL -><DT ->4.3.1. <A -HREF="coding.html#S10" ->Variable Names</A -></DT -><DT ->4.3.2. <A -HREF="coding.html#S11" ->Function Names</A -></DT -><DT ->4.3.3. <A -HREF="coding.html#S12" ->Header file prototypes</A -></DT -><DT ->4.3.4. <A -HREF="coding.html#S13" ->Enumerations, and #defines</A -></DT -><DT ->4.3.5. <A -HREF="coding.html#S14" ->Constants</A -></DT -></DL -></DD -><DT ->4.4. <A -HREF="coding.html#S15" ->Using Space</A -></DT -><DD -><DL -><DT ->4.4.1. <A -HREF="coding.html#S16" ->Put braces on a line by themselves.</A -></DT -><DT ->4.4.2. <A -HREF="coding.html#S17" ->ALL control statements should have a - block</A -></DT -><DT ->4.4.3. <A -HREF="coding.html#S18" ->Do not belabor/blow-up boolean - expressions</A -></DT -><DT ->4.4.4. <A -HREF="coding.html#S19" ->Use white space freely because it is - free</A -></DT -><DT ->4.4.5. <A -HREF="coding.html#S20" ->Don't use white space around structure - operators</A -></DT -><DT ->4.4.6. <A -HREF="coding.html#S21" ->Make the last brace of a function stand - out</A -></DT -><DT ->4.4.7. <A -HREF="coding.html#S22" ->Use 3 character indentions</A -></DT -></DL -></DD -><DT ->4.5. <A -HREF="coding.html#S23" ->Initializing</A -></DT -><DD -><DL -><DT ->4.5.1. <A -HREF="coding.html#S24" ->Initialize all variables</A -></DT -></DL -></DD -><DT ->4.6. <A -HREF="coding.html#S25" ->Functions</A -></DT -><DD -><DL -><DT ->4.6.1. <A -HREF="coding.html#S26" ->Name functions that return a boolean as a - question.</A -></DT -><DT ->4.6.2. <A -HREF="coding.html#S27" ->Always specify a return type for a - function.</A -></DT -><DT ->4.6.3. <A -HREF="coding.html#S28" ->Minimize function calls when iterating by - using variables</A -></DT -><DT ->4.6.4. <A -HREF="coding.html#S29" ->Pass and Return by Const Reference</A -></DT -><DT ->4.6.5. <A -HREF="coding.html#S30" ->Pass and Return by Value</A -></DT -><DT ->4.6.6. <A -HREF="coding.html#S31" ->Names of include files</A -></DT -><DT ->4.6.7. <A -HREF="coding.html#S32" ->Provide multiple inclusion - protection</A -></DT -><DT ->4.6.8. <A -HREF="coding.html#S33" ->Use `extern "C"` when appropriate</A -></DT -><DT ->4.6.9. <A -HREF="coding.html#S34" ->Where Possible, Use Forward Struct - Declaration Instead of Includes</A -></DT -></DL -></DD -><DT ->4.7. <A -HREF="coding.html#S35" ->General Coding Practices</A -></DT -><DD -><DL -><DT ->4.7.1. <A -HREF="coding.html#S36" ->Turn on warnings</A -></DT -><DT ->4.7.2. <A -HREF="coding.html#S37" ->Provide a default case for all switch - statements</A -></DT -><DT ->4.7.3. <A -HREF="coding.html#S38" ->Try to avoid falling through cases in a - switch statement.</A -></DT -><DT ->4.7.4. <A -HREF="coding.html#S39" ->Use 'long' or 'short' Instead of - 'int'</A -></DT -><DT ->4.7.5. <A -HREF="coding.html#S40" ->Don't mix size_t and other types</A -></DT -><DT ->4.7.6. <A -HREF="coding.html#S41" ->Declare each variable and struct on its - own line.</A -></DT -><DT ->4.7.7. <A -HREF="coding.html#S42" ->Use malloc/zalloc sparingly</A -></DT -><DT ->4.7.8. <A -HREF="coding.html#S43" ->The Programmer Who Uses 'malloc' is - Responsible for Ensuring 'free'</A -></DT -><DT ->4.7.9. <A -HREF="coding.html#S44" ->Add loaders to the `file_list' structure - and in order</A -></DT -><DT ->4.7.10. <A -HREF="coding.html#S45" ->"Uncertain" new code and/or changes to - existing code, use FIXME or XXX</A -></DT -></DL -></DD -><DT ->4.8. <A -HREF="coding.html#S46" ->Addendum: Template for files and function - comment blocks:</A -></DT -></DL -></DD -><DT ->5. <A -HREF="testing.html" ->Testing Guidelines</A -></DT -><DD -><DL -><DT ->5.1. <A -HREF="testing.html#TESTING-PLAN" ->Testplan for releases</A -></DT -><DT ->5.2. <A -HREF="testing.html#TESTING-REPORT" ->Test reports</A -></DT -></DL -></DD -><DT ->6. <A -HREF="newrelease.html" ->Releasing a New Version</A -></DT -><DD -><DL -><DT ->6.1. <A -HREF="newrelease.html#VERSIONNUMBERS" ->Version numbers</A -></DT -><DT ->6.2. <A -HREF="newrelease.html#BEFORERELEASE" ->Before the Release: Freeze</A -></DT -><DT ->6.3. <A -HREF="newrelease.html#THERELEASE" ->Building and Releasing the Packages</A -></DT -><DD -><DL -><DT ->6.3.1. <A -HREF="newrelease.html#PACK-GUIDELINES" ->Note on Privoxy Packaging</A -></DT -><DT ->6.3.2. <A -HREF="newrelease.html#NEWRELEASE-TARBALL" ->Source Tarball</A -></DT -><DT ->6.3.3. <A -HREF="newrelease.html#NEWRELEASE-RPM" ->SuSE, Conectiva or Red Hat RPM</A -></DT -><DT ->6.3.4. <A -HREF="newrelease.html#NEWRELEASE-OS2" ->OS/2</A -></DT -><DT ->6.3.5. <A -HREF="newrelease.html#NEWRELEASE-SOLARIS" ->Solaris</A -></DT -><DT ->6.3.6. <A -HREF="newrelease.html#NEWRELEASE-WINDOWS" ->Windows</A -></DT -><DT ->6.3.7. <A -HREF="newrelease.html#NEWRELEASE-DEBIAN" ->Debian</A -></DT -><DT ->6.3.8. <A -HREF="newrelease.html#NEWRELEASE-MACOSX" ->Mac OS X</A -></DT -><DT ->6.3.9. <A -HREF="newrelease.html#NEWRELEASE-FREEBSD" ->FreeBSD</A -></DT -><DT ->6.3.10. <A -HREF="newrelease.html#NEWRELEASE-HPUX" ->HP-UX 11</A -></DT -><DT ->6.3.11. <A -HREF="newrelease.html#NEWRELEASE-AMIGA" ->Amiga OS</A -></DT -><DT ->6.3.12. <A -HREF="newrelease.html#NEWRELEASE-AIX" ->AIX</A -></DT -></DL -></DD -><DT ->6.4. <A -HREF="newrelease.html#RELEASING" ->Uploading and Releasing Your Package</A -></DT -><DT ->6.5. <A -HREF="newrelease.html#AFTERRELEASE" ->After the Release</A -></DT -></DL -></DD -><DT ->7. <A -HREF="webserver-update.html" ->Update the Webserver</A -></DT -><DT ->8. <A -HREF="contact.html" ->Contacting the developers, Bug Reporting and Feature Requests</A -></DT -><DD -><DL -><DT ->8.1. <A -HREF="contact.html#CONTACT-SUPPORT" ->Get Support</A -></DT -><DT ->8.2. <A -HREF="contact.html#REPORTING" ->Reporting Problems</A -></DT -><DD -><DL -><DT ->8.2.1. <A -HREF="contact.html#CONTACT-ADS" ->Reporting Ads or Other Configuration Problems</A -></DT -><DT ->8.2.2. <A -HREF="contact.html#CONTACT-BUGS" ->Reporting Bugs</A -></DT -></DL -></DD -><DT ->8.3. <A -HREF="contact.html#CONTACT-FEATURE" ->Request New Features</A -></DT -><DT ->8.4. <A -HREF="contact.html#CONTACT-OTHER" ->Other</A -></DT -></DL -></DD -><DT ->9. <A -HREF="copyright.html" ->Privoxy Copyright, License and History</A -></DT -><DD -><DL -><DT ->9.1. <A -HREF="copyright.html#AEN1223" ->License</A -></DT -><DT ->9.2. <A -HREF="copyright.html#AEN1239" ->History</A -></DT -></DL -></DD -><DT ->10. <A -HREF="seealso.html" ->See also</A -></DT -></DL -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -> </TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="introduction.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -> </TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Introduction</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/introduction.html b/external/privoxy/doc/webserver/developer-manual/introduction.html deleted file mode 100644 index 5ac1e59..0000000 --- a/external/privoxy/doc/webserver/developer-manual/introduction.html +++ /dev/null @@ -1,199 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Introduction</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="NEXT" -TITLE="The CVS Repository" -HREF="cvs.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="index.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="cvs.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="INTRODUCTION" ->1. Introduction</A -></H1 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, as an heir to - <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN ->, is a Free Software project - and the code is licensed under the GNU General Public License version 2. - As such, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> development is potentially open - to anyone who has the time, knowledge, and desire to contribute - in any capacity. Our goals are simply to continue the mission, - to improve <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, and - to make it available to as wide an audience as possible. - </P -><P -> One does not have to be a programmer to contribute. Packaging, testing, - documenting and porting, are all important jobs as well. - </P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="QUICKSTART" ->1.1. Quickstart to Privoxy Development</A -></H2 -><P -> The first step is to join the <A -HREF="mailto:ijbswa-developers@lists.sourceforge.net" -TARGET="_top" ->developer's mailing list</A ->. - You can submit your ideas, or even better patches. Patches are best - submitted to the Sourceforge tracker set up for this purpose, but - can be sent to the list for review too. - </P -><P -> You will also need to have a cvs package installed, which will - entail having ssh installed as well (which seems to be a requirement of - SourceForge), in order to access the cvs repository. Having the GNU build - tools is also going to be important (particularly, autoconf and gmake). - </P -><P -> For the time being (read, this section is under construction), you can - also refer to the extensive comments in the source code. In fact, - reading the code is recommended in any case. - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="cvs.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Privoxy Developer Manual</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->The CVS Repository</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/newrelease.html b/external/privoxy/doc/webserver/developer-manual/newrelease.html deleted file mode 100644 index 0cdb485..0000000 --- a/external/privoxy/doc/webserver/developer-manual/newrelease.html +++ /dev/null @@ -1,1956 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Releasing a New Version</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Testing Guidelines" -HREF="testing.html"><LINK -REL="NEXT" -TITLE="Update the Webserver" -HREF="webserver-update.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="testing.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="webserver-update.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="NEWRELEASE" ->6. Releasing a New Version</A -></H1 -><P -> When we release versions of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, - our work leaves our cozy secret lab and has to work in the cold - RealWorld[tm]. Once it is released, there is no way to call it - back, so it is very important that great care is taken to ensure - that everything runs fine, and not to introduce problems in the - very last minute. - </P -><P -> So when releasing a new version, please adhere exactly to the - procedure outlined in this chapter. - </P -><P -> The following programs are required to follow this process: - <TT -CLASS="FILENAME" ->ncftpput</TT -> (ncftp), <TT -CLASS="FILENAME" ->scp, ssh</TT -> (ssh), - <TT -CLASS="FILENAME" ->gmake</TT -> (GNU's version of make), autoconf, cvs. - </P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="VERSIONNUMBERS" ->6.1. Version numbers</A -></H2 -><P -> First you need to determine which version number the release will have. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version numbers consist of three numbers, - separated by dots, like in X.Y.Z (e.g. 3.0.0), where: - <P -></P -><UL -><LI -><P -> X, the version major, is rarely ever changed. It is increased by one if - turning a development branch into stable substantially changes the functionality, - user interface or configuration syntax. Majors 1 and 2 were - <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN ->, and 3 will be the first stable - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> release. - </P -></LI -><LI -><P -> Y, the version minor, represents the branch within the major version. - At any point in time, there are two branches being maintained: - The stable branch, with an even minor, say, 2N, in which no functionality is - being added and only bug-fixes are made, and 2N+1, the development branch, in - which the further development of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> takes - place. - This enables us to turn the code upside down and inside out, while at the same time - providing and maintaining a stable version. - The minor is reset to zero (and one) when the major is incremented. When a development - branch has matured to the point where it can be turned into stable, the old stable branch - 2N is given up (i.e. no longer maintained), the former development branch 2N+1 becomes the - new stable branch 2N+2, and a new development branch 2N+3 is opened. - </P -></LI -><LI -><P -> Z, the point or sub version, represents a release of the software within a branch. - It is therefore incremented immediately before each code freeze. - In development branches, only the even point versions correspond to actual releases, - while the odd ones denote the evolving state of the sources on CVS in between. - It follows that Z is odd on CVS in development branches most of the time. There, it gets - increased to an even number immediately before a code freeze, and is increased to an odd - number again immediately thereafter. - This ensures that builds from CVS snapshots are easily distinguished from released versions. - The point version is reset to zero when the minor changes. - </P -><P -> Stable branches work a little differently, since there should be - little to no development happening in such branches. Remember, - only bugfixes, which presumably should have had some testing - before being committed. Stable branches will then have their - version reported as <TT -CLASS="LITERAL" ->0.0.0</TT ->, during that period - between releases when changes are being added. This is to denote - that this code is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not for release</I -></SPAN ->. Then - as the release nears, the version is bumped according: e.g. - <TT -CLASS="LITERAL" ->3.0.1 -> 0.0.0 -> 3.0.2</TT ->. - </P -></LI -></UL -> - </P -><P -> In summary, the main CVS trunk is the development branch where new - features are being worked on for the next stable series. This should - almost always be where the most activity takes place. There is always at - least one stable branch from the trunk, e.g now it is - <TT -CLASS="LITERAL" ->3.0</TT ->, which is only used to release stable versions. - Once the initial *.0 release of the stable branch has been done, then as a - rule, only bugfixes that have had prior testing should be committed to - the stable branch. Once there are enough bugfixes to justify a new - release, the version of this branch is again incremented Example: 3.0.0 - -> 3.0.1 -> 3.0.2, etc are all stable releases from within the stable - branch. 3.1.x is currently the main trunk, and where work on 3.2.x is - taking place. If any questions, please post to the devel list - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->before</I -></SPAN -> committing to a stable branch! - </P -><P -> Developers should remember too that if they commit a bugfix to the stable - branch, this will more than likely require a separate submission to the - main trunk, since these are separate development trees within CVS. If you - are working on both, then this would require at least two separate check - outs (i.e main trunk, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and</I -></SPAN -> the stable release branch, - which is <TT -CLASS="LITERAL" ->v_3_0_branch</TT -> at the moment). - </P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="BEFORERELEASE" ->6.2. Before the Release: Freeze</A -></H2 -><P -> The following <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->must be done by one of the - developers</I -></SPAN -> prior to each new release. - </P -><P -> <P -></P -><UL -><LI -><P -> Make sure that everybody who has worked on the code in the last - couple of days has had a chance to yell <SPAN -CLASS="QUOTE" ->"no!"</SPAN -> in case - they have pending changes/fixes in their pipelines. Announce the - freeze so that nobody will interfere with last minute changes. - </P -></LI -><LI -><P -> Increment the version number (point from odd to even in development - branches!) in <TT -CLASS="FILENAME" ->configure.in</TT ->. (RPM spec files - will need to be incremented as well.) - </P -></LI -><LI -><P -> If <TT -CLASS="FILENAME" ->default.action</TT -> has changed since last - release (i.e. software release or standalone actions file release), - bump up its version info to A.B in this line: - </P -><P -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> {+add-header{X-Actions-File-Version: A.B} -filter -no-popups}</PRE -></TD -></TR -></TABLE -> - </P -><P -> - Then change the version info in doc/webserver/actions/index.php, - line: '$required_actions_file_version = "A.B";' - </P -></LI -><LI -><P -> All documentation should be rebuild after the version bump. - Finished docs should be then be committed to CVS (for those - without the ability to build these). Some docs may require - rather obscure processing tools. <TT -CLASS="FILENAME" ->config</TT ->, - the man page (and the html version of the man page), and the PDF docs - fall in this category. REAMDE, the man page, AUTHORS, and config - should all also be committed to CVS for other packagers. The - formal docs should be uploaded to the webserver. See the - Section "Updating the webserver" in this manual for details. - </P -></LI -><LI -><P -> The <I -CLASS="CITETITLE" ->User Manual</I -> is also used for context - sensitive help for the CGI editor. This is version sensitive, so that - the user will get appropriate help for his/her release. So with - each release a fresh version should be uploaded to the webserver - (this is in addition to the main <I -CLASS="CITETITLE" ->User Manual</I -> - link from the main page since we need to keep manuals for various - versions available). The CGI pages will link to something like - <TT -CLASS="LITERAL" ->http://privoxy.org/$(VERSION)/user-manual/</TT ->. This - will need to be updated for each new release. There is no Makefile - target for this at this time!!! It needs to be done manually. - </P -></LI -><LI -><P -> All developers should look at the <TT -CLASS="FILENAME" ->ChangeLog</TT -> and - make sure noteworthy changes are referenced. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Commit all files that were changed in the above steps!</I -></SPAN -> - </P -></LI -><LI -><P -> Tag all files in CVS with the version number with - <SPAN -CLASS="QUOTE" ->"<B -CLASS="COMMAND" ->cvs tag v_X_Y_Z</B ->"</SPAN ->. - Don't use vX_Y_Z, ver_X_Y_Z, v_X.Y.Z (won't work) etc. - </P -></LI -><LI -><P -> If the release was in a development branch, increase the point version - from even to odd (X.Y.(Z+1)) again in <TT -CLASS="FILENAME" ->configure.in</TT -> and - commit your change. - </P -></LI -><LI -><P -> On the webserver, copy the user manual to a new top-level directory - called <TT -CLASS="FILENAME" ->X.Y.Z</TT ->. This ensures that help links from the CGI - pages, which have the version as a prefix, will go into the right version of the manual. - If this is a development branch release, also symlink <TT -CLASS="FILENAME" ->X.Y.(Z-1)</TT -> - to <TT -CLASS="FILENAME" ->X.Y.Z</TT -> and <TT -CLASS="FILENAME" ->X.Y.(Z+1)</TT -> to - <TT -CLASS="FILENAME" ->.</TT -> (i.e. dot). - </P -></LI -></UL -> - </P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="THERELEASE" ->6.3. Building and Releasing the Packages</A -></H2 -><P -> Now the individual packages can be built and released. Note that for - GPL reasons the first package to be released is always the source tarball. - </P -><P -> For <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> types of packages, including the source tarball, - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->you must make sure that you build from clean sources by exporting - the right version from CVS into an empty directory</I -></SPAN -> (just press return when - asked for a password): - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> mkdir dist # delete or choose different name if it already exists - cd dist - cvs -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa export -r v_X_Y_Z current</PRE -></TD -></TR -></TABLE -> - </P -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Do NOT change</I -></SPAN -> a single bit, including, but not limited to - version information after export from CVS. This is to make sure that - all release packages, and with them, all future bug reports, are based - on exactly the same code. - </P -><DIV -CLASS="WARNING" -><P -></P -><TABLE -CLASS="WARNING" -BORDER="1" -WIDTH="100%" -><TR -><TD -ALIGN="CENTER" -><B ->Warning</B -></TD -></TR -><TR -><TD -ALIGN="LEFT" -><P -> Every significant release of Privoxy has included at least one - package that either had incorrect versions of files, missing files, - or incidental leftovers from a previous build process that gave - unknown numbers of users headaches to try to figure out what was - wrong. PLEASE, make sure you are using pristene sources, and are - following the prescribed process! - </P -></TD -></TR -></TABLE -></DIV -><P -> Please find additional instructions for the source tarball and the - individual platform dependent binary packages below. And details - on the Sourceforge release process below that. - </P -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="PACK-GUIDELINES" ->6.3.1. Note on Privoxy Packaging</A -></H3 -><P -> Please keep these general guidelines in mind when putting together - your package. These apply to <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> platforms! - </P -><P -> <P -></P -><UL -><LI -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->requires</I -></SPAN -> - write access to: all <TT -CLASS="FILENAME" ->*.action</TT -> files, all - logfiles, and the <TT -CLASS="FILENAME" ->trust</TT -> file. You will - need to determine the best way to do this for your platform. - </P -></LI -><LI -><P -> Please include up to date documentation. At a bare minimum: - </P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="FILENAME" ->LICENSE</TT -> (top-level directory) - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="FILENAME" ->README</TT -> (top-level directory) - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="FILENAME" ->AUTHORS</TT -> (top-level directory) - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="FILENAME" ->man page</TT -> (top-level directory, Unix-like - platforms only) - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="FILENAME" ->The User Manual</TT -> (doc/webserver/user-manual/) - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="FILENAME" ->FAQ</TT -> (doc/webserver/faq/) - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -> Also suggested: <TT -CLASS="FILENAME" ->Developer Manual</TT -> - (doc/webserver/developer-manual) and <TT -CLASS="FILENAME" ->ChangeLog</TT -> - (top-level directory). <TT -CLASS="FILENAME" ->FAQ</TT -> and the manuals are - HTML docs. There are also text versions in - <TT -CLASS="FILENAME" ->doc/text/</TT -> which could conceivably also be - included. - </P -><P -> The documentation has been designed such that the manuals are linked - to each other from parallel directories, and should be packaged - that way. <TT -CLASS="FILENAME" ->privoxy-index.html</TT -> can also be - included and can serve as a focal point for docs and other links of - interest (and possibly renamed to <TT -CLASS="FILENAME" ->index.html</TT ->). - This should be one level up from the manuals. There is a link also - on this page to an HTMLized version of the man page. To avoid 404 for - this, it is in CVS as - <TT -CLASS="FILENAME" ->doc/webserver/man-page/privoxy-man-page.html</TT ->, - and should be included along with the manuals. There is also a - css stylesheets that can be included for better presentation: - <TT -CLASS="FILENAME" ->p_doc.css</TT ->. This should be in the same directory - with <TT -CLASS="FILENAME" ->privoxy-index.html</TT ->, (i.e. one level up from - the manual directories). - </P -></LI -><LI -><P -> <TT -CLASS="FILENAME" ->user.action</TT -> and <TT -CLASS="FILENAME" ->user.filter</TT -> - are designed for local preferences. Make sure these do not get overwritten! - <TT -CLASS="FILENAME" ->config</TT -> should not be overwritten either. This - has especially important configuration data in it. - <TT -CLASS="FILENAME" ->trust</TT -> should be left in tact as well. - </P -></LI -><LI -><P -> Other configuration files (<TT -CLASS="FILENAME" ->default.action</TT -> and - <TT -CLASS="FILENAME" ->default.filter</TT ->) should be installed as the new - defaults, but all previously installed configuration files should be - preserved as backups. This is just good manners :-) These files are - likely to change between releases and contain important new features - and bug fixes. - </P -></LI -><LI -><P -> Please check platform specific notes in this doc, if you haven't - done <SPAN -CLASS="QUOTE" ->"Privoxy"</SPAN -> packaging before for other platform - specific issues. Conversely, please add any notes that you know - are important for your platform (or contact one of the doc - maintainers to do this if you can't). - </P -></LI -><LI -><P -> Packagers should do a <SPAN -CLASS="QUOTE" ->"clean"</SPAN -> install of their - package after building it. So any previous installs should be - removed first to ensure the integrity of the newly built package. - Then run the package for a while to make sure there are no - obvious problems, before uploading. - </P -></LI -></UL -> - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-TARBALL" ->6.3.2. Source Tarball</A -></H3 -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd current - autoheader && autoconf && ./configure</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then do: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make tarball-dist</PRE -></TD -></TR -></TABLE -> - </P -><P -> To upload the package to Sourceforge, simply issue - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make tarball-upload</PRE -></TD -></TR -></TABLE -> - </P -><P -> Go to the displayed URL and release the file publicly on Sourceforge. - For the change log field, use the relevant section of the - <TT -CLASS="FILENAME" ->ChangeLog</TT -> file. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-RPM" ->6.3.3. SuSE, Conectiva or Red Hat RPM</A -></H3 -><P -> In following text, replace <TT -CLASS="REPLACEABLE" -><I ->dist</I -></TT -> - with either <SPAN -CLASS="QUOTE" ->"rh"</SPAN -> for Red Hat or <SPAN -CLASS="QUOTE" ->"suse"</SPAN -> for SuSE. - </P -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). - </P -><P -> As the only exception to not changing anything after export from CVS, - now examine the file <TT -CLASS="FILENAME" ->privoxy-</TT -><TT -CLASS="REPLACEABLE" -><I ->dist</I -></TT -><TT -CLASS="FILENAME" ->.spec</TT -> - and make sure that the version information and the RPM release number are - correct. The RPM release numbers for each version start at one. Hence it must - be reset to one if this is the first RPM for - <TT -CLASS="REPLACEABLE" -><I ->dist</I -></TT -> which is built from version - X.Y.Z. Check the - <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->file - list</A -> if unsure. Else, it must be set to the highest already available RPM - release number for that version plus one. - </P -><P -> Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd current - autoheader && autoconf && ./configure</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then do - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make <TT -CLASS="REPLACEABLE" -><I ->dist</I -></TT ->-dist</PRE -></TD -></TR -></TABLE -> - </P -><P -> To upload the package to Sourceforge, simply issue - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make <TT -CLASS="REPLACEABLE" -><I ->dist</I -></TT ->-upload <TT -CLASS="REPLACEABLE" -><I ->rpm_packagerev</I -></TT -></PRE -></TD -></TR -></TABLE -> - </P -><P -> where <TT -CLASS="REPLACEABLE" -><I ->rpm_packagerev</I -></TT -> is the - RPM release number as determined above. - Go to the displayed URL and release the file publicly on Sourceforge. - Use the release notes and change log from the source tarball package. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-OS2" ->6.3.4. OS/2</A -></H3 -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then get the OS/2 Setup module: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co os2setup</PRE -></TD -></TR -></TABLE -> - </P -><P -> You will need a mix of development tools. - The main compilation takes place with IBM Visual Age C++. - Some ancillary work takes place with GNU tools, available from - various sources like hobbes.nmsu.edu. - Specificially, you will need <TT -CLASS="FILENAME" ->autoheader</TT ->, - <TT -CLASS="FILENAME" ->autoconf</TT -> and <TT -CLASS="FILENAME" ->sh</TT -> tools. - The packaging takes place with WarpIN, available from various sources, including - its home page: <A -HREF="http://www.xworkplace.org/" -TARGET="_top" ->xworkplace</A ->. - </P -><P -> Change directory to the <TT -CLASS="FILENAME" ->os2setup</TT -> directory. - Edit the os2build.cmd file to set the final executable filename. - For example, - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> installExeName='privoxyos2_setup_X.Y.Z.exe'</PRE -></TD -></TR -></TABLE -> - </P -><P -> Next, edit the <TT -CLASS="FILENAME" ->IJB.wis</TT -> file so the release number matches - in the <TT -CLASS="FILENAME" ->PACKAGEID</TT -> section: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> PACKAGEID="Privoxy Team\Privoxy\Privoxy Package\X\Y\Z"</PRE -></TD -></TR -></TABLE -> - </P -><P -> You're now ready to build. Run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> os2build</PRE -></TD -></TR -></TABLE -> - </P -><P -> You will find the WarpIN-installable executable in the - <TT -CLASS="FILENAME" ->./files</TT -> directory. Upload this anonymously to - <TT -CLASS="FILENAME" ->uploads.sourceforge.net/incoming</TT ->, create a release - for it, and you're done. Use the release notes and Change Log from the - source tarball package. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-SOLARIS" ->6.3.5. Solaris</A -></H3 -><P -> Login to Sourceforge's compilefarm via ssh: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> ssh cf.sourceforge.net</PRE -></TD -></TR -></TABLE -> - </P -><P -> Choose the right operating system (not the Debian one). - When logged in, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd current - autoheader && autoconf && ./configure</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then run - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> gmake solaris-dist</PRE -></TD -></TR -></TABLE -> - </P -><P -> which creates a gzip'ed tar archive. Sadly, you cannot use <B -CLASS="COMMAND" ->make - solaris-upload</B -> on the Sourceforge machine (no ncftpput). You now have - to manually upload the archive to Sourceforge's ftp server and release - the file publicly. Use the release notes and Change Log from the - source tarball package. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-WINDOWS" ->6.3.6. Windows</A -></H3 -><P -> You should ensure you have the latest version of Cygwin (from - <A -HREF="http://www.cygwin.com/" -TARGET="_top" ->http://www.cygwin.com/</A ->). - Run the following commands from within a Cygwin bash shell. - </P -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then get the Windows setup module: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co winsetup</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then you can build the package. This is fully automated, and is - controlled by <TT -CLASS="FILENAME" ->winsetup/GNUmakefile</TT ->. - All you need to do is: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd winsetup - make</PRE -></TD -></TR -></TABLE -> - </P -><P -> Now you can manually rename <TT -CLASS="FILENAME" ->privoxy_setup.exe</TT -> to - <TT -CLASS="FILENAME" ->privoxy_setup_X_Y_Z.exe</TT ->, and upload it to - SourceForge. When releasing the package on SourceForge, use the release notes - and Change Log from the source tarball package. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-DEBIAN" ->6.3.7. Debian</A -></H3 -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the - right version into an empty directory</I -></SPAN ->. (See - "Building and releasing packages" above). Then add a log - entry to <TT -CLASS="FILENAME" ->debian/changelog</TT ->, if it is not - already there, for example by running: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> debchange -v 3.0.12-stable-1 "New upstream version"</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then, run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> dpkg-buildpackage -rfakeroot -us -uc -b</PRE -></TD -></TR -></TABLE -> - </P -><P -> This will create - <TT -CLASS="FILENAME" ->../privoxy_3.0.12-stable-1_i386.deb</TT -> - which can be uploaded. To upload the package to Sourceforge, simply - issue - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make debian-upload</PRE -></TD -></TR -></TABLE -> - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-MACOSX" ->6.3.8. Mac OS X</A -></H3 -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then get the Mac OS X setup module: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co osxsetup</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd osxsetup - build</PRE -></TD -></TR -></TABLE -> - </P -><P -> This will run <TT -CLASS="FILENAME" ->autoheader</TT ->, <TT -CLASS="FILENAME" ->autoconf</TT -> and - <TT -CLASS="FILENAME" ->configure</TT -> as well as <TT -CLASS="FILENAME" ->make</TT ->. - Finally, it will copy over the necessary files to the ./osxsetup/files directory - for further processing by <TT -CLASS="FILENAME" ->PackageMaker</TT ->. - </P -><P -> Bring up PackageMaker with the PrivoxyPackage.pmsp definition file, modify the package - name to match the release, and hit the "Create package" button. - If you specify ./Privoxy.pkg as the output package name, you can then create - the distributable zip file with the command: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> zip -r privoxyosx_setup_x.y.z.zip Privoxy.pkg</PRE -></TD -></TR -></TABLE -> - </P -><P -> You can then upload <TT -CLASS="FILENAME" ->privoxyosx_setup_x.y.z.zip</TT -> anonymously to - <TT -CLASS="FILENAME" ->uploads.sourceforge.net/incoming</TT ->, - create a release for it, and you're done. Use the release notes - and Change Log from the source tarball package. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-FREEBSD" ->6.3.9. FreeBSD</A -></H3 -><P -> Login to Sourceforge's compile-farm via ssh: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> ssh cf.sourceforge.net</PRE -></TD -></TR -></TABLE -> - </P -><P -> Choose the right operating system. - When logged in, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd current - autoheader && autoconf && ./configure</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> gmake freebsd-dist</PRE -></TD -></TR -></TABLE -> - </P -><P -> which creates a gzip'ed tar archive. Sadly, you cannot use <B -CLASS="COMMAND" ->make - freebsd-upload</B -> on the Sourceforge machine (no ncftpput). You now have - to manually upload the archive to Sourceforge's ftp server and release - the file publicly. Use the release notes and Change Log from the - source tarball package. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-HPUX" ->6.3.10. HP-UX 11</A -></H3 -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd current - autoheader && autoconf && ./configure</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then do FIXME. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-AMIGA" ->6.3.11. Amiga OS</A -></H3 -><P -> First, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd current - autoheader && autoconf && ./configure</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then do FIXME. - </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="NEWRELEASE-AIX" ->6.3.12. AIX</A -></H3 -><P -> Login to Sourceforge's compilefarm via ssh: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> ssh cf.sourceforge.net</PRE -></TD -></TR -></TABLE -> - </P -><P -> Choose the right operating system. - When logged in, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->make sure that you have freshly exported the right - version into an empty directory</I -></SPAN ->. (See "Building and releasing - packages" above). Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> cd current - autoheader && autoconf && ./configure</PRE -></TD -></TR -></TABLE -> - </P -><P -> Then run: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make aix-dist</PRE -></TD -></TR -></TABLE -> - </P -><P -> which creates a gzip'ed tar archive. Sadly, you cannot use <B -CLASS="COMMAND" ->make - aix-upload</B -> on the Sourceforge machine (no ncftpput). You now have - to manually upload the archive to Sourceforge's ftp server and release - the file publicly. Use the release notes and Change Log from the - source tarball package. - </P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="RELEASING" ->6.4. Uploading and Releasing Your Package</A -></H2 -><P -> After the package is ready, it is time to upload it - to SourceForge, and go through the release steps. The upload - is done via FTP: - </P -><P -> <P -></P -><UL -><LI -><P -> Upload to: <A -HREF="ftp://upload.sourceforge.net/incoming" -TARGET="_top" ->ftp://upload.sourceforge.net/incoming</A -> - </P -></LI -><LI -><P -> user: <TT -CLASS="LITERAL" ->anonymous</TT -> - </P -></LI -><LI -><P -> password: <TT -CLASS="LITERAL" ->ijbswa-developers@lists.sourceforge.net</TT -> - </P -></LI -></UL -> - </P -><P -> Or use the <B -CLASS="COMMAND" ->make</B -> targets as described above. - </P -><P -> Once this done go to <A -HREF="https://sourceforge.net/project/admin/editpackages.php?group_id=11118" -TARGET="_top" ->https://sourceforge.net/project/admin/editpackages.php?group_id=11118</A ->, - making sure you are logged in. Find your target platform in the - second column, and click <TT -CLASS="LITERAL" ->Add Release</TT ->. You will - then need to create a new release for your package, using the format - of <TT -CLASS="LITERAL" ->$VERSION ($CODE_STATUS)</TT ->, e.g. <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->3.0.12 - (beta)</I -></SPAN ->. - </P -><P -> Now just follow the prompts. Be sure to add any appropriate Release - notes. You should see your freshly uploaded packages in - <SPAN -CLASS="QUOTE" ->"Step 2. Add Files To This Release"</SPAN ->. Check the - appropriate box(es). Remember at each step to hit the - <SPAN -CLASS="QUOTE" ->"Refresh/Submit"</SPAN -> buttons! You should now see your - file(s) listed in Step 3. Fill out the forms with the appropriate - information for your platform, being sure to hit <SPAN -CLASS="QUOTE" ->"Update"</SPAN -> - for each file. If anyone is monitoring your platform, check the - <SPAN -CLASS="QUOTE" ->"email"</SPAN -> box at the very bottom to notify them of - the new package. This should do it! - </P -><P -> If you have made errors, or need to make changes, you can go through - essentially the same steps, but select <TT -CLASS="LITERAL" ->Edit Release</TT ->, - instead of <TT -CLASS="LITERAL" ->Add Release</TT ->. - </P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AFTERRELEASE" ->6.5. After the Release</A -></H2 -><P -> When all (or: most of the) packages have been uploaded and made available, - send an email to the <A -HREF="mailto:ijbswa-announce@lists.sourceforge.net" -TARGET="_top" ->announce - mailing list</A ->, Subject: "Version X.Y.Z available for download". Be sure to - include the - <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->download - location</A ->, the release notes and the Changelog. Also, post an - updated News item on the project page Sourceforge, and update the Home - page and docs linked from the Home page (see below). Other news sites - and release oriented sites, such as Freshmeat, should also be notified. - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="testing.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="webserver-update.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Testing Guidelines</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Update the Webserver</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/quickstart.html b/external/privoxy/doc/webserver/developer-manual/quickstart.html deleted file mode 100644 index ba84f13..0000000 --- a/external/privoxy/doc/webserver/developer-manual/quickstart.html +++ /dev/null @@ -1,150 +0,0 @@ -<HTML -><HEAD -><TITLE ->Quickstart to Privoxy Development</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.64 -"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Introduction" -HREF="introduction.html"><LINK -REL="NEXT" -TITLE="The CVS Repository" -HREF="cvs.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="introduction.html" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="cvs.html" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="QUICKSTART" ->3. Quickstart to Privoxy Development</A -></H1 -><P -> You'll need an account on <A -HREF="http://sourceforge.net/" -TARGET="_top" ->Sourceforge</A -> to support our - development. Mail your ID to <A -HREF="mailto:developers@privoxy.org" -TARGET="_top" ->the list</A -> and wait until a - project manager has added you. - </P -><P -> For the time being (read, this section is under construction), please - refer to the extensive comments in the source code. - </P -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="introduction.html" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="cvs.html" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Introduction</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->The CVS Repository</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/seealso.html b/external/privoxy/doc/webserver/developer-manual/seealso.html deleted file mode 100644 index 35ee27c..0000000 --- a/external/privoxy/doc/webserver/developer-manual/seealso.html +++ /dev/null @@ -1,405 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->See also</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Privoxy Copyright, License and History" -HREF="copyright.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="copyright.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -> </TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="SEEALSO" ->10. See also</A -></H1 -><P -> Other references and sites of interest to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - users:</P -><P -> <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->http://www.privoxy.org/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Home page. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/faq/" -TARGET="_top" ->http://www.privoxy.org/faq/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> FAQ. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/developer-manual/" -TARGET="_top" ->http://www.privoxy.org/developer-manual/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developer manual. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://sourceforge.net/projects/ijbswa/" -TARGET="_top" ->https://sourceforge.net/projects/ijbswa/</A ->, - the Project Page for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on - <A -HREF="http://sourceforge.net" -TARGET="_top" ->SourceForge</A ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A ->, - the web-based user interface. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> must be - running for this to work. Shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A -> - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://sourceforge.net/tracker/?group_id=11118&atid=460288" -TARGET="_top" ->https://sourceforge.net/tracker/?group_id=11118&atid=460288</A ->, to submit <SPAN -CLASS="QUOTE" ->"misses"</SPAN -> and other - configuration related suggestions to the developers. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - - - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.junkbusters.com/ht/en/cookies.html" -TARGET="_top" ->http://www.junkbusters.com/ht/en/cookies.html</A ->, - an explanation how cookies are used to track web users. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.junkbusters.com/ijb.html" -TARGET="_top" ->http://www.junkbusters.com/ijb.html</A ->, - the original Internet Junkbuster. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.squid-cache.org/" -TARGET="_top" ->http://www.squid-cache.org/</A ->, a popular - caching proxy, which is often used together with <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.pps.jussieu.fr/~jch/software/polipo/" -TARGET="_top" ->http://www.pps.jussieu.fr/~jch/software/polipo/</A ->, - <SPAN -CLASS="APPLICATION" ->Polipo</SPAN -> is a caching proxy with advanced features - like pipelining, multiplexing and caching of partial instances. In many setups - it can be used as <SPAN -CLASS="APPLICATION" ->Squid</SPAN -> replacement. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://www.torproject.org/" -TARGET="_top" ->https://www.torproject.org/</A ->, - <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> can help anonymize web browsing, - web publishing, instant messaging, IRC, SSH, and other applications. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - </P -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="copyright.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -> </TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Privoxy Copyright, License and History</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -> </TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/testing.html b/external/privoxy/doc/webserver/developer-manual/testing.html deleted file mode 100644 index 80d3f29..0000000 --- a/external/privoxy/doc/webserver/developer-manual/testing.html +++ /dev/null @@ -1,259 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Testing Guidelines</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Coding Guidelines" -HREF="coding.html"><LINK -REL="NEXT" -TITLE="Releasing a New Version" -HREF="newrelease.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="coding.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="newrelease.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="TESTING" ->5. Testing Guidelines</A -></H1 -><P ->To be filled.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="TESTING-PLAN" ->5.1. Testplan for releases</A -></H2 -><P -> Explain release numbers. major, minor. developer releases. etc. - -<P -></P -><OL -TYPE="1" -><LI -><P ->Remove any existing rpm with rpm -e</P -></LI -><LI -><P ->Remove any file that was left over. This includes (but is not limited to) - <P -></P -><UL -><LI -><P ->/var/log/privoxy</P -></LI -><LI -><P ->/etc/privoxy</P -></LI -><LI -><P ->/usr/sbin/privoxy</P -></LI -><LI -><P ->/etc/init.d/privoxy</P -></LI -><LI -><P ->/usr/doc/privoxy*</P -></LI -></UL -></P -></LI -><LI -><P ->Install the rpm. Any error messages?</P -></LI -><LI -><P ->start,stop,status <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with the specific script - (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does - autostart work?</P -></LI -><LI -><P ->Start browsing. Does <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> work? Logfile written?</P -></LI -><LI -><P ->Remove the rpm. Any error messages? All files removed?</P -></LI -></OL -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="TESTING-REPORT" ->5.2. Test reports</A -></H2 -><P ->Please submit test reports only with the <A -HREF="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005" -TARGET="_top" ->test form</A -> -at sourceforge. Three simple steps: - <P -></P -><UL -><LI -><P ->Select category: the distribution you test on.</P -></LI -><LI -><P ->Select group: the version of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> that we are about to release.</P -></LI -><LI -><P ->Fill the Summary and Detailed Description with something - intelligent (keep it short and precise).</P -></LI -></UL -> - Do not mail to the mailing list (we cannot keep track on issues there). - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="coding.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="newrelease.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Coding Guidelines</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Releasing a New Version</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/developer-manual/webserver-update.html b/external/privoxy/doc/webserver/developer-manual/webserver-update.html deleted file mode 100644 index b54d646..0000000 --- a/external/privoxy/doc/webserver/developer-manual/webserver-update.html +++ /dev/null @@ -1,260 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Update the Webserver</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Developer Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Releasing a New Version" -HREF="newrelease.html"><LINK -REL="NEXT" -TITLE="Contacting the developers, Bug Reporting and Feature Requests" -HREF="contact.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Developer Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="newrelease.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="contact.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="WEBSERVER-UPDATE" ->7. Update the Webserver</A -></H1 -><P -> The webserver should be updated at least with each stable release. When - updating, please follow these steps to make sure that no broken links, - inconsistent contents or permission problems will occur (as it has many - times in the past!): - </P -><P -> If you have changed anything in the stable-branch documentation source - SGML files, do: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make dok dok-pdf # (or 'make redhat-dok dok-pdf' if 'make dok' doesn't work for you)</PRE -></TD -></TR -></TABLE -> - </P -><P -> That will generate <TT -CLASS="FILENAME" ->doc/webserver/user-manual</TT ->, - <TT -CLASS="FILENAME" ->doc/webserver/developer-manual</TT ->, - <TT -CLASS="FILENAME" ->doc/webserver/faq</TT ->, - <TT -CLASS="FILENAME" ->doc/pdf/*.pdf</TT -> and - <TT -CLASS="FILENAME" ->doc/webserver/index.html</TT -> automatically. - </P -><P -> If you changed the manual page sources, generate - <TT -CLASS="FILENAME" ->doc/webserver/man-page/privoxy-man-page.html</TT -> - by running <SPAN -CLASS="QUOTE" ->"<B -CLASS="COMMAND" ->make man</B ->"</SPAN ->. (This is - a separate target due to dependencies on some obscure perl scripts - [now in CVS, but not well tested]. See comments in <TT -CLASS="FILENAME" ->GNUmakefile</TT ->.) - </P -><P -> If you want to add new files to the webserver, create them locally in - the <TT -CLASS="FILENAME" ->doc/webserver/*</TT -> directory (or - create new directories under <TT -CLASS="FILENAME" ->doc/webserver</TT ->). - </P -><P -> Next, commit any changes from the above steps to CVS. All set? - If these are docs in the stable branch, then do: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> make webserver</PRE -></TD -></TR -></TABLE -> - </P -><P -> This will do the upload to <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->the - webserver</A -> (www.privoxy.org) and ensure all files and directories - there are group writable. - </P -><P -> Please do <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->NOT</I -></SPAN -> use any other means of transferring - files to the webserver to avoid permission problems. Also, please do not - upload docs from development branches or versions. The publicly posted - docs should be in sync with the last official release. - </P -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="newrelease.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="contact.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Releasing a New Version</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Contacting the developers, Bug Reporting and Feature Requests</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/configuration.html b/external/privoxy/doc/webserver/faq/configuration.html deleted file mode 100644 index 01c001b..0000000 --- a/external/privoxy/doc/webserver/faq/configuration.html +++ /dev/null @@ -1,1797 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Configuration</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Installation" -HREF="installation.html"><LINK -REL="NEXT" -TITLE="Miscellaneous" -HREF="misc.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Frequently Asked Questions</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="installation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="misc.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CONFIGURATION" ->3. Configuration</A -></H1 -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN354" ->3.1. What exactly is an <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> file?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> utilizes the concept of <SPAN -CLASS="QUOTE" ->" <A -HREF="../user-manual/actions-file.html#ACTIONS" -TARGET="_top" ->actions</A ->"</SPAN -> - that are used to manipulate and control web page data. - <A -HREF="../user-manual/actions-file.html" -TARGET="_top" ->Actions files</A -> - are where these <A -HREF="../user-manual/actions-file.html#ACTIONS" -TARGET="_top" ->actions</A -> - that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> could take while processing a certain - request, are configured. Typically, you would define a set of default actions - that apply globally to all URLs, then add exceptions to these defaults where needed. - There is a wide array of actions available that give the user a high degree - of control and flexibility on how to process each and every web page.</P -><P -> Actions can be defined on a <A -HREF="../user-manual/actions-file.html#AF-PATTERNS" -TARGET="_top" ->URL pattern</A -> basis, i.e. - for single URLs, whole web sites, groups or parts thereof etc. Actions can also be - grouped together and then applied to requests matching one or more patterns. - There are many possible actions that might apply to any given site. As an example, - if you are blocking <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookies</A -> - as one of your default actions, but need to accept cookies from a given site, - you would need to define an exception for this site in one of your actions - files, preferably in <TT -CLASS="FILENAME" ->user.action</TT ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="ACTIONSS" ->3.2. The <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> concept confuses me. Please list -some of these <SPAN -CLASS="QUOTE" ->"actions"</SPAN ->.</A -></H3 -><P -> For a comprehensive discussion of the actions concept, please refer - to the <A -HREF="../user-manual/actions-file.html" -TARGET="_top" ->actions file - chapter</A -> in the <A -HREF="../user-manual/index.html" -TARGET="_top" ->User - Manual</A ->. It includes a <A -HREF="../user-manual/actions-file.html#ACTIONS" -TARGET="_top" ->list of all actions</A -> - and an <A -HREF="../user-manual/actions-file.html#ACT-EXAMPLES" -TARGET="_top" ->actions - file tutorial</A -> to get you started.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN377" ->3.3. How are actions files configured? What is the easiest -way to do this?</A -></H3 -><P -> Actions files are just text files in a special syntax and can be edited - with a text editor. But probably the easiest way is to access - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s user interface with your web browser - at <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> - (Shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->) and then select - <SPAN -CLASS="QUOTE" ->"<A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->View & - change the current configuration</A ->"</SPAN -> from the menu. Note - that this feature must be explicitly enabled in the main config file - (see <A -HREF="../user-manual/config.html#ENABLE-EDIT-ACTIONS" -TARGET="_top" ->enable-edit-actions</A ->).</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN386" ->3.4. There are several different <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> files. What are -the differences?</A -></H3 -><P -> Three actions files - are being included by the developers, to be used for - different purposes: These are - <TT -CLASS="FILENAME" ->default.action</TT ->, the <SPAN -CLASS="QUOTE" ->"main"</SPAN -> actions file - which is actively maintained by the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - developers and typically sets the default policies, <TT -CLASS="FILENAME" ->user.action</TT ->, - where users are encouraged to make their private customizations. - Please see <A -HREF="../user-manual/actions-file.html" -TARGET="_top" ->the actions chapter</A -> - in the <A -HREF="../user-manual/index.html" -TARGET="_top" ->User Manual</A -> for a more - detailed explanation.</P -><P -> Earlier versions included three different versions of the - <TT -CLASS="FILENAME" ->default.action</TT -> file. The new scheme allows for - greater flexibility of local configuration, and for browser based - selection of pre-defined <SPAN -CLASS="QUOTE" ->"aggressiveness"</SPAN -> levels.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="GETUPDATES" ->3.5. Where can I get updated Actions Files?</A -></H3 -><P -> Based on your feedback and the continuing development, updates of - <TT -CLASS="FILENAME" ->default.action</TT -> will be - made available from time to time on the <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->files section</A -> of - our <A -HREF="http://sf.net/projects/ijbswa/" -TARGET="_top" ->project page</A ->. - </P -><P -> If you wish to receive an email notification whenever we release updates of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> or the actions file, <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce/" -TARGET="_top" ->subscribe - to our announce mailing list</A ->, ijbswa-announce@lists.sourceforge.net. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NEWCONFIG" ->3.6. Can I use my old config files?</A -></H3 -><P -> The syntax and purpose of configuration files has remained roughly the - same throughout the 3.x series, but backwards compatibility is not guaranteed. - Also each release contains updated, <SPAN -CLASS="QUOTE" ->"improved"</SPAN -> versions and it is - therefore strongly recommended to install the newer configuration files - and merge back your modifications. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DIFFICULT" ->3.7. Why is the configuration so complicated?</A -></H3 -><P -> <SPAN -CLASS="QUOTE" ->"Complicated"</SPAN -> is in the eye of the beholder. Those that are - familiar with some of the underlying concepts, such as regular expression - syntax, take to it like a fish takes to water. Also, software that tries - hard to be <SPAN -CLASS="QUOTE" ->"user friendly"</SPAN ->, often lacks sophistication and - flexibility. There is always that trade-off there between power vs. - easy-of-use. Furthermore, anyone is welcome to contribute ideas and - implementations to enhance <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="YAHOO" ->3.8. How can I make my Yahoo/Hotmail/Gmail account work?</A -></H3 -><P -> The default configuration shouldn't impact the usability of any of these services. - It may, however, make all <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookies</A -> - temporary, so that your browser will forget your - login credentials in between browser sessions. If you would like not to have to log - in manually each time you access those websites, simply turn off all cookie handling - for them in the <TT -CLASS="FILENAME" ->user.action</TT -> file. An example for yahoo might - look like: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Allow all cookies for Yahoo login: -# -{ -<A -HREF="../user-manual/actions-file.html#CRUNCH-INCOMING-COOKIES" -TARGET="_top" ->crunch-incoming-cookies</A -> -<A -HREF="../user-manual/actions-file.html#CRUNCH-OUTGOING-COOKIES" -TARGET="_top" ->crunch-outgoing-cookies</A -> -<A -HREF="../user-manual/actions-file.html#SESSION-COOKIES-ONLY" -TARGET="_top" ->session-cookies-only</A -> } -.login.yahoo.com</PRE -></TD -></TR -></TABLE -> - </P -><P -> These kinds of sites are often quite complex and heavy with - <A -HREF="http://en.wikipedia.org/wiki/Javascript" -TARGET="_top" ->Javascript</A -> and - thus <SPAN -CLASS="QUOTE" ->"fragile"</SPAN ->. So if <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->still</I -></SPAN -> a problem, - we have an <A -HREF="../user-manual/actions-file.html#ALIASES" -TARGET="_top" ->alias</A -> just for such - sticky situations: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Gmail is a _fragile_ site: -# -{ <TT -CLASS="LITERAL" ->fragile</TT -> } - # Gmail is ... - mail.google.com</PRE -></TD -></TR -></TABLE -> - </P -><P -> Be sure to flush your browser's caches whenever making these kinds of - changes, just to make sure the changes <SPAN -CLASS="QUOTE" ->"take"</SPAN ->. - </P -><P -> Make sure the domain, host and path are appropriate as well. Your browser can - tell you where you are specifically and you should use that information for - your configuration settings. Note that above it is not referenced as - <TT -CLASS="LITERAL" ->gmail.com</TT ->, which is a valid domain name. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="CONFIGFILES" ->3.9. What's the difference between the -<SPAN -CLASS="QUOTE" ->"Cautious"</SPAN ->, <SPAN -CLASS="QUOTE" ->"Medium"</SPAN -> and <SPAN -CLASS="QUOTE" ->"Advanced"</SPAN -> defaults?</A -></H3 -><P -> Configuring <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is not entirely trivial. To - help you get started, we provide you with three different default action - <SPAN -CLASS="QUOTE" ->"profiles"</SPAN -> in the web based actions file editor at <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A ->. - See the <A -HREF="../user-manual/actions-file.html" -TARGET="_top" -><I -CLASS="CITETITLE" ->User - Manual</I -></A -> for a list of actions, and how the default - profiles are set. - </P -><P -> Where the defaults are likely to break some sites, exceptions for - known popular <SPAN -CLASS="QUOTE" ->"problem"</SPAN -> sites are included, but in - general, the more aggressive your default settings are, the more exceptions - you will have to make later. New users are best to start off in - <SPAN -CLASS="QUOTE" ->"Cautious"</SPAN -> setting. This is safest and will have the fewest - problems. See the <A -HREF="../user-manual/index.html" -TARGET="_top" -><I -CLASS="CITETITLE" ->User Manual</I -></A -> - for a more detailed discussion.</P -><P -> It should be noted that the <SPAN -CLASS="QUOTE" ->"Advanced"</SPAN -> profile (formerly known - as the <SPAN -CLASS="QUOTE" ->"Adventuresome"</SPAN -> profile) is more - aggressive, and will make use of some of - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> advanced features. Use at your own risk!</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="BROWSECONFIG" ->3.10. Why can I change the configuration -with a browser? Does that not raise security issues?</A -></H3 -><P -> It may seem strange that regular users can edit the config files with their - browsers, although the whole <TT -CLASS="FILENAME" ->/etc/privoxy</TT -> hierarchy - belongs to the user <SPAN -CLASS="QUOTE" ->"privoxy"</SPAN ->, with only 644 permissions. - </P -><P -> When you use the browser-based editor, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - itself is writing to the config files. Because - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is running as the user <SPAN -CLASS="QUOTE" ->"privoxy"</SPAN ->, - it can update its own config files. - </P -><P -> If you run <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> for multiple untrusted users (e.g. in - a LAN) or aren't entirely in control of your own browser, you will probably want - to make sure that the the web-based editor and remote toggle features are - <SPAN -CLASS="QUOTE" ->"off"</SPAN -> by setting <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" -><A -HREF="../user-manual/config.html#ENABLE-EDIT-ACTIONS" -TARGET="_top" ->enable-edit-actions</A -> - 0</TT ->"</SPAN -> and <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" -><A -HREF="../user-manual/config.html#ENABLE-REMOTE-TOGGLE" -TARGET="_top" ->enable-remote-toggle</A -> - 0</TT ->"</SPAN -> in the <A -HREF="../user-manual/config.html" -TARGET="_top" ->main configuration file</A ->. - </P -><P -> As of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.7 these options are disabled by default. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN481" ->3.11. What is the <TT -CLASS="FILENAME" ->default.filter</TT -> file? What is a <SPAN -CLASS="QUOTE" ->"filter"</SPAN ->?</A -></H3 -><P -> The <A -HREF="../user-manual/filter-file.html" -TARGET="_top" -><TT -CLASS="FILENAME" ->default.filter</TT -></A -> - file is where <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->filters</I -></SPAN -> as supplied by the developers are defined. - Filters are a special subset of actions that can be used to modify or - remove web page content or headers on the fly. Content filters can - be applied to <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->anything</I -></SPAN -> in the page source, - header filters can be applied to either server or client headers. - Regular expressions are used to accomplish this.</P -><P -> There are a number of pre-defined filters to deal with common annoyances. The - filters are only defined here, to invoke them, you need to use the - <A -HREF="../user-manual/actions-file.html#FILTER" -TARGET="_top" -><TT -CLASS="LITERAL" ->filter</TT -> - action</A -> in one of the actions files. Content filtering is automatically - disabled for inappropriate MIME types, but if you now better than Privoxy - what should or should not be filtered you can filter any content you like.</P -><P -> Filters should - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not</I -></SPAN -> be confused with <A -HREF="../user-manual/actions-file.html#BLOCK" -TARGET="_top" -><TT -CLASS="LITERAL" ->blocks</TT -></A ->, which - is a completely different action, and is more typically used to block ads and - unwanted sites.</P -><P -> If you are familiar with regular expressions, and HTML, you can look at - the provided <TT -CLASS="FILENAME" ->default.filter</TT -> with a text editor and define - your own filters. This is potentially a very powerful feature, but - requires some expertise in both regular expressions and HTML/HTTP. - You should - place any modifications to the default filters, or any new ones you create - in a separate file, such as <TT -CLASS="FILENAME" ->user.filter</TT ->, so they won't - be overwritten during upgrades. - The ability to define multiple filter files - in <TT -CLASS="FILENAME" ->config</TT -> is a new feature as of v. 3.0.5.</P -><P -> There is no GUI editor option for this part of the configuration, - but you can disable/enable the various pre-defined filters of the included - <TT -CLASS="FILENAME" ->default.filter</TT -> file with the <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->web-based actions file editor</A ->. - Note that the custom actions editor must be explicitly enabled in - the main config file (see <A -HREF="../user-manual/config.html#ENABLE-EDIT-ACTIONS" -TARGET="_top" ->enable-edit-actions</A ->).</P -><P -> If you intend to develop your own filters, you might want to have a look at - <A -HREF="http://www.fabiankeil.de/sourcecode/pft/" -TARGET="_top" ->Privoxy-Filter-Test</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="LANCONFIG" ->3.12. How can I set up Privoxy to act as a proxy for my - LAN?</A -></H3 -><P -> By default, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> only responds to requests - from <TT -CLASS="LITERAL" ->127.0.0.1</TT -> (localhost). To have it act as a server for - a network, this needs to be changed in the <A -HREF="../user-manual/config.html" -TARGET="_top" ->main configuration file</A ->. Look for - the <TT -CLASS="LITERAL" -><A -HREF="../user-manual/config.html#LISTEN-ADDRESS" -TARGET="_top" ->listen-address</A -></TT -> - option, which may be commented out with a <SPAN -CLASS="QUOTE" ->"#"</SPAN -> symbol. Make sure - it is uncommented, and assign it the address of the LAN gateway interface, - and port number to use. Assuming your LAN address is 192.168.1.1 and you - wish to run <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on port 8118, this line - should look like:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> listen-address 192.168.1.1:8118</PRE -></TD -></TR -></TABLE -></P -><P -> Save the file, and restart <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. Configure - all browsers on the network then to use this address and port number.</P -><P -> Alternately, you can have <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> listen on - all available interfaces:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> listen-address :8118</PRE -></TD -></TR -></TABLE -></P -><P -> And then use <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - <A -HREF="../user-manual/config.html#PERMIT-ACCESS" -TARGET="_top" ->permit-access</A -> - feature to limit connections. A firewall in this situation is recommended - as well.</P -><P -> The above steps should be the same for any TCP network, regardless of - operating system.</P -><P -> If you run <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on a LAN with untrusted users, - we recommend that you double-check the <A -HREF="../user-manual/config.html#ACCESS-CONTROL" -TARGET="_top" ->access control and security</A -> - options!</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN532" ->3.13. Instead of ads, now I get a checkerboard pattern. I don't want to see anything.</A -></H3 -><P -> The replacement for blocked images can be controlled with the <A -HREF="../user-manual/actions-file.html#SET-IMAGE-BLOCKER" -TARGET="_top" -><TT -CLASS="LITERAL" ->set-image-blocker</TT -> - action</A ->. You have the choice of a checkerboard pattern, a transparent 1x1 GIF - image (aka <SPAN -CLASS="QUOTE" ->"blank"</SPAN ->), or a redirect to a custom image of your choice. - Note that this choice only has effect for images which are blocked as images, i.e. - whose URLs match both a <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#HANDLE-AS-IMAGE" -TARGET="_top" ->handle-as-image</A -></TT -> - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and</I -></SPAN -> <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#BLOCK" -TARGET="_top" ->block</A -></TT -> action.</P -><P -> If you want to see nothing, then change the <A -HREF="../user-manual/actions-file.html#SET-IMAGE-BLOCKER" -TARGET="_top" -><TT -CLASS="LITERAL" ->set-image-blocker</TT -> - action</A -> to <SPAN -CLASS="QUOTE" ->"blank"</SPAN ->. This can be done by editing the - <TT -CLASS="FILENAME" ->user.action</TT -> file, or through the <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->web-based actions file editor</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN549" ->3.14. Why would anybody want to see a checkerboard pattern?</A -></H3 -><P -> Remember that <A -HREF="general.html#WHATSANAD" ->telling which image is an ad and which - isn't</A ->, is an educated guess. While we hope that the standard configuration - is rather smart, it will make occasional mistakes. The checkerboard image is visually - decent, and it shows you where images have been blocked, which can be very - helpful in case some navigation aid or otherwise innocent image was - erroneously blocked. It is recommended for new users so they can - <SPAN -CLASS="QUOTE" ->"see"</SPAN -> what is happening. Some people might also enjoy seeing how - many banners they <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->don't</I -></SPAN -> have to see.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN555" ->3.15. I see some images being replaced with text -instead of the checkerboard image. Why and how do I get rid of this?</A -></H3 -><P -> This happens when the banners are not embedded in the HTML code of the - page itself, but in separate HTML (sub)documents that are loaded into (i)frames - or (i)layers, and these external HTML documents are blocked. Being non-images - they get replaced by a substitute HTML page rather than a substitute image, - which wouldn't work out technically, since the browser expects and accepts - only HTML when it has requested an HTML document. </P -><P -> The substitute page adapts to the available space and shows itself as a - miniature two-liner if loaded into small frames, or full-blown with a - large red "BLOCKED" banner if space allows.</P -><P -> If you prefer the banners to be blocked by images, you must see to it that - the HTML documents in which they are embedded are not blocked. Clicking - the <SPAN -CLASS="QUOTE" ->"See why"</SPAN -> link offered in the substitute page will show - you which rule blocked the page. After changing the rule and un-blocking - the HTML documents, the browser will try to load the actual banner images - and the usual image blocking will (hopefully!) kick in.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="SRVANY" ->3.16. Can Privoxy run as a service -on Win2K/NT/XP?</A -></H3 -><P -> Yes. Version 3.0.5 introduces full <SPAN -CLASS="APPLICATION" ->Windows</SPAN -> service - functionality. See <A -HREF="../user-manual/installation.html#installation-pack-win" -TARGET="_top" -> the <I -CLASS="CITETITLE" ->User Manual</I -></A -> for details on how to install and configure - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> as a service.</P -><P -> Earlier 3.x versions could run as a system service using <B -CLASS="COMMAND" ->srvany.exe</B ->. - See the discussion at <A -HREF="http://sourceforge.net/tracker/?func=detail&atid=361118&aid=485617&a..." -TARGET="_top" ->http://sourceforge.net/tracker/?func=detail&atid=361118&aid=485617&a...</A ->, - for details, and a sample configuration.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="OTHERPROXY" ->3.17. How can I make Privoxy work with other -proxies like Squid or Tor?</A -></H3 -><P -> This can be done and is often useful to combine the benefits of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with those of a another proxy. - See the <A -HREF="../user-manual/config.html#FORWARDING" -TARGET="_top" ->forwarding chapter</A -> - in the <A -HREF="../user-manual/index.html" -TARGET="_top" ->User Manual</A -> which - describes how to do this, and the <A -HREF="misc.html#TOR" -> How do I use Privoxy together with - Tor</A -> section below.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="PORT-80" ->3.18. Can I just set Privoxy to use port 80 -and thus avoid individual browser configuration?</A -></H3 -><P -> No, its more complicated than that. This only works with special kinds - of proxies known as <SPAN -CLASS="QUOTE" ->"intercepting"</SPAN -> proxies (see below).</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="TRANSPARENT" ->3.19. Can Privoxy run as a <SPAN -CLASS="QUOTE" ->"transparent"</SPAN -> proxy?</A -></H3 -><P -> The whole idea of Privoxy is to modify client requests - and server responses in all sorts of ways and therefore - it's not a transparent proxy as described in - <A -HREF="http://tools.ietf.org/html/rfc2616" -TARGET="_top" ->RFC 2616</A ->.</P -><P -> However, some people say <SPAN -CLASS="QUOTE" ->"transparent proxy"</SPAN -> when they - mean <SPAN -CLASS="QUOTE" ->"intercepting proxy"</SPAN ->. If you are one of them, - please read the <A -HREF="#intercepting" -TARGET="_top" ->next entry</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="INTERCEPTING" ->3.20. Can Privoxy run as a <SPAN -CLASS="QUOTE" ->"intercepting"</SPAN -> proxy?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can't intercept traffic itself, - but it can handle requests that where intercepted and redirected - with a packet filter (like <SPAN -CLASS="APPLICATION" ->PF</SPAN -> or - <SPAN -CLASS="APPLICATION" ->iptables</SPAN ->), as long as the <TT -CLASS="LITERAL" ->Host</TT -> - header is present. - </P -><P -> As the <TT -CLASS="LITERAL" ->Host</TT -> header is required by HTTP/1.1 and as most - web sites rely on it anyway, this limitation shouldn't be a problem.</P -><P -> Please refer to your packet filter's documentation to learn how to - intercept and redirect traffic into <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - Afterward you just have to configure <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to - <A -HREF="../user-manual/config.html#ACCEPT-INTERCEPTED-REQUESTS" -TARGET="_top" ->accept - intercepted requests</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="OUTLOOK" ->3.21. How can I configure Privoxy for use with Outlook?</A -></H3 -><P -> Versions of <SPAN -CLASS="APPLICATION" ->Outlook</SPAN -> prior to Office 2007, use - <SPAN -CLASS="APPLICATION" ->Internet Explorer</SPAN -> components to both render HTML, - and fetch any HTTP requests that may be embedded in an HTML email. So however - you have <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> configured to work with IE, this - configuration should automatically be shared, at least with older version of - Internet Explorer.</P -><P -> Starting with Office 2007, Microsoft is instead using the MS-Word rendering - engine with Outlook. It is unknown whether this can be configured to use a - proxy. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="OUTLOOK-MORE" ->3.22. How can I have separate rules just for HTML mail?</A -></H3 -><P -> The short answer is, you can't. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has no way - of knowing which particular application makes a request, so there is no way to - distinguish between web pages and HTML mail. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> just blindly proxies all requests. In the - case of <SPAN -CLASS="APPLICATION" ->Outlook Express</SPAN -> (see above), OE uses - IE anyway, and there is no way for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to ever - be able to distinguish between them (nor could any other proxy type application for - that matter).</P -><P -> For a good discussion of some of the issues involved (including privacy and - security issues), see - <A -HREF="http://sourceforge.net/tracker/?func=detail&atid=211118&aid=629518&a..." -TARGET="_top" ->http://sourceforge.net/tracker/?func=detail&atid=211118&aid=629518&a...</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="SNEAKY-COOKIES" ->3.23. I sometimes notice cookies sneaking through. How?</A -></H3 -><P -> <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->Cookies</A -> can be - set in several ways. The classic method is via the - <TT -CLASS="LITERAL" ->Set-Cookie</TT -> HTTP header. This is straightforward, and an - easy one to manipulate, such as the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> concept of - <A -HREF="../user-manual/actions-file.html#SESSION-COOKIES-ONLY" -TARGET="_top" ->session-cookies-only</A ->. - There is also the possibility of using - <A -HREF="http://en.wikipedia.org/wiki/Javascript" -TARGET="_top" ->Javascript</A -> to - set cookies (<SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> calls these <TT -CLASS="LITERAL" ->content-cookies</TT ->). This - is trickier because the syntax can vary widely, and thus requires a certain - amount of guesswork. It is not realistic to catch all of these short of - disabling Javascript, which would break many sites. And lastly, if the - cookies are embedded in a HTTPS/SSL secure session via Javascript, they are beyond - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> reach.</P -><P -> All in all, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can help manage cookies in general, can help minimize - the loss of privacy posed by cookies, but can't realistically stop all - cookies.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="EVIL-COOKIES" ->3.24. Are all cookies bad? Why?</A -></H3 -><P -> No, in fact there are many beneficial uses of - <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookies</A ->. Cookies are just a - method that browsers can use to store data between pages, or between browser - sessions. Sometimes there is a good reason for this, and the user's life is a - bit easier as a result. But there is a long history of some websites taking - advantage of this layer of trust, and using the data they glean from you and - your browsing habits for their own purposes, and maybe to your potential - detriment. Such sites are using you and storing their data on your system. - That is why the privacy conscious watch from whom those cookies come, and why - they really <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->need</I -></SPAN -> to be there.</P -><P -> See the - <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->Wikipedia cookie - definition</A -> for more.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="ALLOW-COOKIES" ->3.25. How can I allow permanent cookies for my trusted sites?</A -></H3 -><P -> There are several actions that relate to cookies. The default behavior is to - allow only <SPAN -CLASS="QUOTE" ->"session cookies"</SPAN ->, which means the cookies only last - for the current browser session. This eliminates most kinds of abuse related - to cookies. But there may be cases where you want cookies to last.</P -><P -> To disable all cookie actions, so that cookies are allowed unrestricted, - both in and out, for <TT -CLASS="LITERAL" ->example.com</TT ->: </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { -crunch-incoming-cookies -crunch-outgoing-cookies -session-cookies-only -filter{content-cookies} } - .example.com</PRE -></TD -></TR -></TABLE -></P -><P -> Place the above in <TT -CLASS="FILENAME" ->user.action</TT ->. Note that some of these may - be off by default anyway, so this might be redundant, but there is no harm - being explicit in what you want to happen. <TT -CLASS="FILENAME" ->user.action</TT -> - includes an alias for this situation, called - <TT -CLASS="LITERAL" ->allow-all-cookies</TT ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="MULTIPLES" ->3.26. Can I have separate configurations for different users?</A -></H3 -><P -> Each instance of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has its own - configuration, including such attributes as the TCP port that it listens on. - What you can do is run multiple instances of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, each with - a unique - <A -HREF="../user-manual/config.html#LISTEN-ADDRESS" -TARGET="_top" ->listen-address</A -> - configuration setting, and configuration path, and then - each of these can have their own configurations. Think of it as per-port - configuration.</P -><P -> - Simple enough for a few users, but for large installations, consider having - groups of users that might share like configurations.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="WHITELISTS" ->3.27. Can I set-up Privoxy as a whitelist of -<SPAN -CLASS="QUOTE" ->"good"</SPAN -> sites?</A -></H3 -><P -> Sure. There are a couple of things you can do for simple white-listing. - Here's one real easy one:</P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> ############################################################ - # Blacklist - ############################################################ - { <A -HREF="../user-manual/actions-file.html#BLOCK" -TARGET="_top" ->+block</A -> } - / # Block *all* URLs - - ############################################################ - # Whitelist - ############################################################ - { <A -HREF="../user-manual/actions-file.html#BLOCK" -TARGET="_top" ->-block</A -> } - kids.example.com - toys.example.com - games.example.com</PRE -></TD -></TR -></TABLE -><P -> This allows access to only those three sites by first blocking all URLs, and - then subsequently allowing three specific exceptions.</P -><P -> Another approach is <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - <TT -CLASS="LITERAL" ->trustfile</TT -> concept, which incorporates the notion of - <SPAN -CLASS="QUOTE" ->"trusted referrers"</SPAN ->. See the <A -HREF="../user-manual/config.html#TRUSTFILE" -TARGET="_top" ->Trust documentation</A -> - for details.</P -><P -> These are fairly simple approaches and are not completely foolproof. There - are various other configuration options that should be disabled (described - elsewhere here and in <A -HREF="../user-manual/" -TARGET="_top" ->the User Manual</A ->) - so that users can't modify their own configuration and easily circumvent the - whitelist.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NO-ADBLOCK" ->3.28. How can I turn off ad-blocking?</A -></H3 -><P -> Ad blocking is achieved through a complex application of various <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - <A -HREF="../user-manual/actions-file.html" -TARGET="_top" ->actions</A ->. These - actions are deployed against simple images, banners, flash animations, - text pages, JavaScript, pop-ups and pop-unders, etc., so its not as simple as - just turning one or two actions off. The various actions that make up - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> ad blocking are hard-coded into the default configuration files. It - has been assumed that everyone using <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is interested in this - particular feature. - </P -><P -> If you want to do without this, there are several approaches you can take: - You can manually undo the many block rules in - <TT -CLASS="FILENAME" ->default.action</TT ->. Or even easier, just create your own - <TT -CLASS="FILENAME" ->default.action</TT -> file from scratch without the many ad - blocking rules, and corresponding exceptions. Or lastly, if you are not - concerned about the additional blocks that are done for privacy reasons, you - can very easily over-ride <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> blocking with the - following very simple rule in your <TT -CLASS="FILENAME" ->user.action</TT ->: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # Unblock everybody, everywhere - { <A -HREF="../user-manual/actions-file.html#BLOCK" -TARGET="_top" ->-block</A -> } - / # UN-Block *all* URLs</PRE -></TD -></TR -></TABLE -></P -><P -> - Or even a more comprehensive reversing of various ad related actions:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # Unblock everybody, everywhere, and turn off appropriate filtering, etc - { <A -HREF="../user-manual/actions-file.html#BLOCK" -TARGET="_top" ->-block</A -> \ - <A -HREF="../user-manual/actions-file.html#FILTER-BANNERS-BY-SIZE" -TARGET="_top" ->-filter{banners-by-size}</A -> \ - <A -HREF="../user-manual/actions-file.html#FILTER-BANNERS-BY-LINK" -TARGET="_top" ->-filter{banners-by-link}</A -> \ - <TT -CLASS="LITERAL" ->allow-popups</TT -> \ - } - / # UN-Block *all* URLs and allow ads</PRE -></TD -></TR -></TABLE -></P -><P -> This last <SPAN -CLASS="QUOTE" ->"action"</SPAN -> in this compound statement, - <TT -CLASS="LITERAL" ->allow-popups</TT ->, is an <A -HREF="../user-manual/actions-file.html#ALIASES" -TARGET="_top" ->alias</A -> that disables - various pop-up blocking features.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="TEMPLATES" ->3.29. How can I have custom template pages, like the -<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->BLOCKED</I -></SPAN -> page?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> <SPAN -CLASS="QUOTE" ->"templates"</SPAN -> are specialized text files utilized by - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> for various purposes and can easily be modified using any text - editor. All the template pages are installed in a sub-directory appropriately - named: <TT -CLASS="FILENAME" ->templates</TT ->. Knowing something about HTML syntax - will of course be helpful.</P -><P -> Be forewarned that the default templates are subject to being overwritten - during upgrades. You can, however, create completely new templates, - place them in another directory and specify the alternate path in the main - <TT -CLASS="FILENAME" ->config</TT ->. For details, have a look at the <A -HREF="../user-manual/config.html#templdir" -TARGET="_top" ->templdir</A -> option. </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="BLOCKALL" ->3.30. How can I remove the <SPAN -CLASS="QUOTE" ->"Go There Anyway"</SPAN -> link from -the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->BLOCKED</I -></SPAN -> page?</A -></H3 -><P -> There is more than one way to do it (although Perl is not involved).</P -><P -> Editing the BLOCKED template page (see above) may dissuade some users, but - this method is easily circumvented. Where you need this level of control, you - might want to build <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> from source, and disable various features that are - available as compile-time options. You should - <B -CLASS="COMMAND" ->configure</B -> the sources as follows:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> ./configure --disable-toggle --disable-editor --disable-force</PRE -></TD -></TR -></TABLE -></P -><P -> This will create an executable with hard-coded security features so that - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> does not allow easy bypassing of blocked sites, or changing the - current configuration via any connected user's web browser.</P -><P -> Finally, all of these features can also be toggled on/off via options in - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> main <A -HREF="../user-manual/config.html#ACCESS-CONTROL" -TARGET="_top" ->config</A -> file which - means you don't have to recompile anything.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="installation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="misc.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Installation</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Miscellaneous</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/contact.html b/external/privoxy/doc/webserver/faq/contact.html deleted file mode 100644 index c9d18c7..0000000 --- a/external/privoxy/doc/webserver/faq/contact.html +++ /dev/null @@ -1,510 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Contacting the developers, Bug Reporting and Feature Requests</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Troubleshooting" -HREF="trouble.html"><LINK -REL="NEXT" -TITLE="Privoxy Copyright, License and History" -HREF="copyright.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Frequently Asked Questions</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="trouble.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="copyright.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CONTACT" ->6. Contacting the developers, Bug Reporting and Feature Requests</A -></H1 -><P -> We value your feedback. In fact, we rely on it to improve - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and its configuration. - However, please note the following hints, so we can - provide you with the best support:</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-SUPPORT" ->6.1. Get Support</A -></H2 -><P -> For casual users, our - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=211118" -TARGET="_top" ->support forum at SourceForge</A -> - is probably best suited: - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=211118" -TARGET="_top" ->http://sourceforge.net/tracker/?group_id=11118&atid=211118</A -></P -><P -> All users are of course welcome to discuss their issues on the <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-users" -TARGET="_top" ->users - mailing list</A ->, where the developers also hang around.</P -><P -> Please don't sent private support requests to individual Privoxy - developers, either use the mailing lists or the support trackers.</P -><P -> Note that the Privoxy mailing lists are moderated. Posts from unsubscribed - addresses have to be accepted manually by a moderator. This may cause a - delay of several days and if you use a subject that doesn't clearly - mention Privoxy or one of its features, your message may be accidentally - discarded as spam.</P -><P -> If you aren't subscribed, you should therefore spend a few seconds - to come up with a proper subject. Additionally you should make it clear - that you want to get CC'd. Otherwise some responses will be directed to - the mailing list only, and you won't see them.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="REPORTING" ->6.2. Reporting Problems</A -></H2 -><P -><SPAN -CLASS="QUOTE" ->"Problems"</SPAN -> for our purposes, come in two forms:</P -><P -></P -><UL -><LI -><P -> Configuration issues, such as ads that slip through, or sites that - don't function properly due to one <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - <SPAN -CLASS="QUOTE" ->"action"</SPAN -> or another being turned <SPAN -CLASS="QUOTE" ->"on"</SPAN ->. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"Bugs"</SPAN -> in the programming code that makes up - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, such as that might cause a crash. - </P -></LI -></UL -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="CONTACT-ADS" ->6.2.1. Reporting Ads or Other Configuration Problems</A -></H3 -><P -> Please send feedback on ads that slipped through, innocent images that were - blocked, sites that don't work properly, and other configuration related problem of - <TT -CLASS="FILENAME" ->default.action</TT -> file, to - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=460288" -TARGET="_top" -> http://sourceforge.net/tracker/?group_id=11118&atid=460288</A ->, - the Actions File Tracker.</P -><P -> New, improved <TT -CLASS="FILENAME" ->default.action</TT -> files may occasionally be made - available based on your feedback. These will be announced on the <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce" -TARGET="_top" ->ijbswa-announce</A -> - list and available from our the <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->files section</A -> of - our <A -HREF="http://sf.net/projects/ijbswa/" -TARGET="_top" ->project page</A ->.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="CONTACT-BUGS" ->6.2.2. Reporting Bugs</A -></H3 -><P -> Please report all bugs through our bug tracker: - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=111118" -TARGET="_top" ->http://sourceforge.net/tracker/?group_id=11118&atid=111118</A ->. </P -><P -> Before doing so, please make sure that the bug has <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not already been submitted</I -></SPAN -> - and observe the additional hints at the top of the <A -HREF="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=111118" -TARGET="_top" ->submit - form</A ->. If already submitted, please feel free to add any info to the - original report that might help to solve the issue.</P -><P -> Please try to verify that it is a <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> bug, - and not a browser or site bug or documented behaviour that just happens - to be different than what you expected. If unsure, - try <A -HREF="http://config.privoxy.org/toggle?set=disable" -TARGET="_top" ->toggling - off</A -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, and see if the problem persists.</P -><P -> If you are using your own custom configuration, please try - the stock configs to see if the problem is configuration related. - If you're having problems with a feature that is disabled by default, - please ask around on the mailing list if others can reproduce the problem.</P -><P -> If you aren't using the latest Privoxy version, the bug may have been found - and fixed in the meantime. We would appreciate if you could take the time - to <A -HREF="http://www.privoxy.org/user-manual/installation.html" -TARGET="_top" ->upgrade - to the latest version</A -> (or even the latest CVS snapshot) and verify - that your bug still exists.</P -><P ->Please be sure to provide the following information:</P -><P -> <P -></P -><UL -><LI -><P -> The exact <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version you are using - (if you got the source from CVS, please also provide the source code revisions - as shown in <A -HREF="http://config.privoxy.org/show-version" -TARGET="_top" ->http://config.privoxy.org/show-version</A ->). - </P -></LI -><LI -><P -> The operating system and versions you run - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on, (e.g. <SPAN -CLASS="APPLICATION" ->Windows - XP SP2</SPAN ->), if you are using a Unix flavor, - sending the output of <SPAN -CLASS="QUOTE" ->"uname -a"</SPAN -> should do, - in case of GNU/Linux, please also name the distribution. - </P -></LI -><LI -><P -> The name, platform, and version of the <SPAN -CLASS="APPLICATION" ->browser</SPAN -> - you were using (e.g. <SPAN -CLASS="APPLICATION" ->Internet Explorer v5.5</SPAN -> for Mac). - </P -></LI -><LI -><P -> The URL where the problem occurred, or some way for us to duplicate the - problem (e.g. <TT -CLASS="LITERAL" ->http://somesite.example.com/?somethingelse=123</TT ->). - </P -></LI -><LI -><P -> Whether your version of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is one supplied - by the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developers via SourceForge, - or if you got your copy somewhere else. - </P -></LI -><LI -><P -> Whether you are using <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in tandem with - another proxy such as <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->. If so, please - temporary disable the other proxy to see if the symptoms change. - </P -></LI -><LI -><P -> Whether you are using a personal firewall product. If so, does - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> work without it? - </P -></LI -><LI -><P -> Any other pertinent information to help identify the problem such as config - or log file excerpts (yes, you should have log file entries for each - action taken). - </P -></LI -></UL -></P -><P -> You don't have to tell us your actual name when filing a problem - report, but please use a nickname so we can differentiate between - your messages and the ones entered by other "anonymous" users that - may respond to your request if they have the same problem or already - found a solution.</P -><P -> Please also check the status of your request a few days after submitting - it, as we may request additional information. If you use a SF id, - you should automatically get a mail when someone responds to your request.</P -><P -> The <A -HREF="http://www.privoxy.org/user-manual/appendix.html#ACTIONSANAT" -TARGET="_top" ->appendix - of the Privoxy User Manual</A -> also has helpful information - on understanding <TT -CLASS="LITERAL" ->actions</TT ->, and <TT -CLASS="LITERAL" ->action</TT -> debugging. </P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-FEATURE" ->6.3. Request New Features</A -></H2 -><P -> You are welcome to submit ideas on new features or other proposals - for improvement through our feature request tracker at - <A -HREF="http://sourceforge.net/tracker/?atid=361118&group_id=11118" -TARGET="_top" ->http://sourceforge.net/tracker/?atid=361118&group_id=11118</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-OTHER" ->6.4. Other</A -></H2 -><P ->For any other issues, feel free to use the mailing lists. Technically interested users -and people who wish to contribute to the project are also welcome on the developers list! -You can find an overview of all <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->-related mailing lists, -including list archives, at: -<A -HREF="http://sourceforge.net/mail/?group_id=11118" -TARGET="_top" ->http://sourceforge.net/mail/?group_id=11118</A ->.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="trouble.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="copyright.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Troubleshooting</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Privoxy Copyright, License and History</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/copyright.html b/external/privoxy/doc/webserver/faq/copyright.html deleted file mode 100644 index 39b71a6..0000000 --- a/external/privoxy/doc/webserver/faq/copyright.html +++ /dev/null @@ -1,301 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy Copyright, License and History</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Contacting the developers, Bug Reporting and Feature Requests" -HREF="contact.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Frequently Asked Questions</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="contact.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -> </TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="COPYRIGHT" ->7. Privoxy Copyright, License and History</A -></H1 -><P -> Copyright © 2001-2009 by Privoxy Developers <CODE -CLASS="EMAIL" -><<A -HREF="mailto:ijbswa-developers@lists.sourceforge.net" ->ijbswa-developers@lists.sourceforge.net</A ->></CODE -></P -><P -> Some source code is based on code Copyright © 1997 by Anonymous Coders - and Junkbusters, Inc. and licensed under the <I -CLASS="CITETITLE" ->GNU General Public - License</I ->.</P -><P -> Portions of this document are <SPAN -CLASS="QUOTE" ->"borrowed"</SPAN -> from the original - <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> (tm) FAQ, and modified as - appropriate for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - </P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN1451" ->7.1. License</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is free software; you can - redistribute it and/or modify it under the terms of the - <I -CLASS="CITETITLE" ->GNU General Public License</I ->, version 2, - as published by the Free Software Foundation.</P -><P -> 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 <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" -> <I -CLASS="CITETITLE" ->GNU General Public License</I -></A -> for details.</P -><P -> You should have received a copy of the <I -CLASS="CITETITLE" ->GNU GPL</I -> - along with this program; if not, write to the <P -CLASS="ADDRESS" -> Free Software<br> - Foundation, Inc. <SPAN -CLASS="STREET" ->51 Franklin Street, Fifth Floor</SPAN -><br> - <SPAN -CLASS="CITY" ->Boston</SPAN ->, <SPAN -CLASS="STATE" ->MA</SPAN -> <SPAN -CLASS="POSTCODE" ->02110-1301</SPAN -><br> - <SPAN -CLASS="COUNTRY" ->USA</SPAN -> </P -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN1467" ->7.2. History</A -></H2 -><P -> A long time ago, there was the - <A -HREF="http://www.junkbusters.com/ijb.html" -TARGET="_top" -><SPAN -CLASS="APPLICATION" ->Internet Junkbuster</SPAN -></A ->, - by Anonymous Coders and <A -HREF="http://www.junkbusters.com/" -TARGET="_top" ->Junkbusters - Corporation</A ->. This saved many users a lot of pain in the early days of - web advertising and user tracking.</P -><P -> But the web, its protocols and standards, and with it, the techniques for - forcing ads on users, give up autonomy over their browsing, and - for tracking them, keeps evolving. Unfortunately, the <SPAN -CLASS="APPLICATION" ->Internet - Junkbuster</SPAN -> did not. Version 2.0.2, published in 1998, was - (and is) the last official - <A -HREF="http://www.junkbusters.com/ijbdist.html#release" -TARGET="_top" ->release</A -> - available from <A -HREF="http://www.junkbusters.com" -TARGET="_top" ->Junkbusters Corporation</A ->. - Fortunately, it had been released under the GNU - <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" ->GPL</A ->, - which allowed further development by others.</P -><P -> So Stefan Waldherr started maintaining an improved version of the - software, to which eventually a number of people contributed patches. - It could already replace banners with a transparent image, and had a first - version of pop-up killing, but it was still very closely based on the - original, with all its limitations, such as the lack of HTTP/1.1 support, - flexible per-site configuration, or content modification. The last release - from this effort was version 2.0.2-10, published in 2000.</P -><P -> Then, some - <A -HREF="http://www.privoxy.org/user-manual/copyright.html#AUTHORS" -TARGET="_top" ->developers</A -> - picked up the thread, and started turning the software inside out, upside down, - and then reassembled it, adding many - <A -HREF="http://www.privoxy.org/user-manual/introduction.html#FEATURES" -TARGET="_top" ->new - features</A -> along the way.</P -><P -> The result of this is <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, whose first - stable version, 3.0, was released August, 2002. - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="contact.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -> </TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Contacting the developers, Bug Reporting and Feature Requests</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -> </TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/general.html b/external/privoxy/doc/webserver/faq/general.html deleted file mode 100644 index 7043b18..0000000 --- a/external/privoxy/doc/webserver/faq/general.html +++ /dev/null @@ -1,1076 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->General Information</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="NEXT" -TITLE="Installation" -HREF="installation.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Frequently Asked Questions</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="index.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="installation.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="GENERAL" ->1. General Information</A -></H1 -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="WHO-USES" ->1.1. Who should give <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> a try?</A -></H3 -><P -> Anyone who is interested in security, privacy, or in - finer-grained control over their web and Internet experience. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="BESTCHOICE" ->1.2. Is Privoxy the best choice for -me?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is certainly a good choice, especially for those who want more - control and security. Those with the willingness to read the documentation - and the ability to fine-tune their installation will benefit the most. - </P -><P -> One of <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - strengths is that it is highly configurable giving you the ability to - completely personalize your installation. Being familiar with, or at least - having an interest in learning about <A -HREF="http://en.wikipedia.org/wiki/Http" -TARGET="_top" ->HTTP</A -> and other networking - protocols, <A -HREF="http://en.wikipedia.org/wiki/Html" -TARGET="_top" ->HTML</A ->, and - <A -HREF="http://en.wikipedia.org/wiki/Regular_expressions" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"Regular - Expressions"</SPAN -></A -> - will be a big plus and will help you get the most out of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - A new installation just includes a very basic configuration. The user - should take this as a starting point only, and enhance it as he or she - sees fit. In fact, the user is encouraged, and expected to, fine-tune the - configuration. - </P -><P -> Much of <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> configuration can be done - with a <A -HREF="http://en.wikipedia.org/wiki/Web_browser" -TARGET="_top" ->Web browser</A ->. - But there are areas where configuration is done using a - <A -HREF="http://en.wikipedia.org/wiki/Text_editors" -TARGET="_top" ->text editor</A -> - to edit configuration files. Also note that the web-based action editor - doesn't use authentication and should only be enabled in environments - where all clients with access to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> listening port can be trusted. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="PROXYMORON" ->1.3. What is a <SPAN -CLASS="QUOTE" ->"proxy"</SPAN ->? How does -Privoxy work?</A -></H3 -><P -> A <A -HREF="http://en.wikipedia.org/wiki/Proxy_server" -TARGET="_top" ->web proxy</A -> - is a service, based on a software such as <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, that clients - (i.e. browsers) can use instead of connecting to web servers directly. - The clients then ask the proxy to request objects (web pages, images, movies etc) - on their behalf and to forward the data to the clients. - It is a <SPAN -CLASS="QUOTE" ->"go-between"</SPAN ->. For details, see - <A -HREF="http://en.wikipedia.org/wiki/Proxy_server" -TARGET="_top" ->Wikipedia's proxy definition</A ->. - </P -><P -> There are many reasons to use web proxies, such as security (firewalling), - efficiency (caching) and others, and there are any number of proxies - to accommodate those needs. - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is a proxy that is primarily focused on - privacy enhancement, ad and junk elimination and freeing the user from - restrictions placed on his activities. Sitting between your browser(s) and the Internet, - it is in a perfect position to filter outbound personal information that your - browser is leaking, as well as inbound junk. It uses a variety of techniques to do - this, all of which are under your complete control via the various configuration - files and options. Being a proxy also makes it easier to share - configurations among multiple browsers and/or users. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="OTHERSTUFF" ->1.4. Does Privoxy do anything more than ad blocking?</A -></H3 -><P -> - Yes, ad blocking is but one possible use. There are many, many ways <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - can be used to sanitize and customize web browsing. </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NEWJB" ->1.5. What is this new version of -<SPAN -CLASS="QUOTE" ->"Junkbuster"</SPAN ->?</A -></H3 -><P -> A long time ago, there was the - <A -HREF="http://www.junkbusters.com/ijb.html" -TARGET="_top" -><SPAN -CLASS="APPLICATION" ->Internet Junkbuster</SPAN -></A ->, - by Anonymous Coders and <A -HREF="http://www.junkbusters.com/" -TARGET="_top" ->Junkbusters - Corporation</A ->. This saved many users a lot of pain in the early days of - web advertising and user tracking.</P -><P -> But the web, its protocols and standards, and with it, the techniques for - forcing ads on users, give up autonomy over their browsing, and - for tracking them, keeps evolving. Unfortunately, the <SPAN -CLASS="APPLICATION" ->Internet - Junkbuster</SPAN -> did not. Version 2.0.2, published in 1998, was - (and is) the last official - <A -HREF="http://www.junkbusters.com/ijbdist.html#release" -TARGET="_top" ->release</A -> - available from <A -HREF="http://www.junkbusters.com" -TARGET="_top" ->Junkbusters Corporation</A ->. - Fortunately, it had been released under the GNU - <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" ->GPL</A ->, - which allowed further development by others.</P -><P -> So Stefan Waldherr started maintaining an improved version of the - software, to which eventually a number of people contributed patches. - It could already replace banners with a transparent image, and had a first - version of pop-up killing, but it was still very closely based on the - original, with all its limitations, such as the lack of HTTP/1.1 support, - flexible per-site configuration, or content modification. The last release - from this effort was version 2.0.2-10, published in 2000.</P -><P -> Then, some - <A -HREF="http://www.privoxy.org/user-manual/copyright.html#AUTHORS" -TARGET="_top" ->developers</A -> - picked up the thread, and started turning the software inside out, upside down, - and then reassembled it, adding many - <A -HREF="http://www.privoxy.org/user-manual/introduction.html#FEATURES" -TARGET="_top" ->new - features</A -> along the way.</P -><P -> The result of this is <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, whose first - stable version, 3.0, was released August, 2002. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN78" ->1.6. Why <SPAN -CLASS="QUOTE" ->"Privoxy"</SPAN ->? Why change the name from -Junkbuster at all?</A -></H3 -><P -> Though outdated, <A -HREF="http://junkbusters.com/" -TARGET="_top" ->Junkbusters Corporation</A -> - continues to offer their original version of the <SPAN -CLASS="APPLICATION" ->Internet - Junkbuster</SPAN ->, so publishing our - <SPAN -CLASS="APPLICATION" -> Junkbuster</SPAN ->-derived software under the same name - led to confusion.</P -><P -> There are also potential legal complications from our use of the - <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> name, which is a registered trademark of - <A -HREF="http://junkbusters.com/" -TARGET="_top" ->Junkbusters Corporation</A ->. - There are, however, no objections from Junkbusters Corporation to the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> project itself, and they, in fact, still - share our ideals and goals.</P -><P -> The developers also believed that there are so many improvements over the original - code, that it was time to make a clean break from the past and make - a name in their own right.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is the - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Privacy Enhancing Proxy</I -></SPAN ->"</SPAN ->. Also, its content - modification and junk suppression gives <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->you</I -></SPAN ->, the user, more - control, more freedom, and allows you to browse your personal and - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->private</I -></SPAN -> edition"</SPAN -> of the web.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DIFFERS" ->1.7. How does Privoxy differ -from the old Junkbuster?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> picks up where - <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> left off. - The new <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> still blocks ads and banners, - still manages <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookies</A ->, and still - helps protect your privacy. But, most of these features have been enhanced, - and many new ones have been added, all in the same vein. - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s new features include:</P -><P -> <P -></P -><UL -><LI -><P -> Can keep outgoing connections alive and reuse them later on. - </P -></LI -><LI -><P -> Supports tagging which allows to change the behaviour - based on client and server headers. - </P -></LI -><LI -><P -> Can be run as an "intercepting" proxy, which obviates the need to - configure browsers individually. - </P -></LI -><LI -><P -> Sophisticated actions and filters for manipulating both server and client - headers. - </P -></LI -><LI -><P -> Can be chained with other proxies. - </P -></LI -><LI -><P -> Integrated browser based configuration and control utility at <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> - (shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->). Browser-based - tracing of rule and filter effects. Remote toggling. - </P -></LI -><LI -><P -> Web page filtering (text replacements, removes banners based on size, - invisible <SPAN -CLASS="QUOTE" ->"web-bugs"</SPAN ->, JavaScript and HTML annoyances, - pop-up windows, etc.) - </P -></LI -><LI -><P -> Modularized configuration that allows for standard settings and - user settings to reside in separate files, so that installing updated - actions files won't overwrite individual user settings. - </P -></LI -><LI -><P -> Support for Perl Compatible Regular Expressions in the configuration files, and - a more sophisticated and flexible configuration syntax. - </P -></LI -><LI -><P -> Improved cookie management features (e.g. session based cookies). - </P -></LI -><LI -><P -> GIF de-animation. - </P -></LI -><LI -><P -> Bypass many click-tracking scripts (avoids script redirection). - </P -></LI -><LI -><P -> Multi-threaded (POSIX and native threads). - </P -></LI -><LI -><P -> User-customizable HTML templates for most proxy-generated pages (e.g. "blocked" page). - </P -></LI -><LI -><P -> Auto-detection and re-reading of config file changes. - </P -></LI -><LI -><P -> Improved signal handling, and a true daemon mode (Unix). - </P -></LI -><LI -><P -> Every feature now controllable on a per-site or per-location basis, configuration - more powerful and versatile over-all. - </P -></LI -><LI -><P -> Many smaller new features added, limitations and bugs removed. - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="WHATSANAD" ->1.8. How does Privoxy know what is -an ad, and what is not?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s approach to blocking ads is twofold:</P -><P -> First, there are certain patterns in the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->locations</I -></SPAN -> (URLs) - of banner images. This applies to both the path (you wouldn't guess how many - web sites serve their banners from a directory called <SPAN -CLASS="QUOTE" ->"banners"</SPAN ->!) - and the host (blocking the big banner hosting services like doublecklick.net - already helps a lot). <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> takes advantage of this - fact by using <A -HREF="../user-manual/actions-file.html#AF-PATTERNS" -TARGET="_top" ->URL - patterns</A -> to sort out and block the requests for things that sound - like they would be ads or banners.</P -><P -> Second, banners tend to come in certain <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->sizes</I -></SPAN ->. But you - can't tell the size of an image by its URL without downloading it, and if you - do, it's too late to save bandwidth. Therefore, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - also inspects the HTML sources of web pages while they are loaded, and replaces - references to images with standard banner sizes by dummy references, so that - your browser doesn't request them anymore in the first place.</P -><P -> Both of this involves a certain amount of guesswork and is, of course, freely - and readily configurable.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN160" ->1.9. Can Privoxy make mistakes? -This does not sound very scientific.</A -></H3 -><P -> Actually, it's a black art ;-) And yes, it is always possible to have a broad - rule accidentally block or change something by mistake. You will almost surely - run into such situations at some point. It is tricky writing rules to - cover every conceivable possibility, and not occasionally get false positives.</P -><P -> But this should not be a big concern since the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> configuration is very flexible, and - includes tools to help identify these types of situations so they can be - addressed as needed, allowing you to customize your installation. - (<A -HREF="trouble.html#BADSITE" ->See the Troubleshooting section below</A ->.)</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN166" ->1.10. Will I have to configure Privoxy - before I can use it?</A -></H3 -><P -> That depends on your expectations. - The default installation should give you a good starting - point, and block <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->most</I -></SPAN -> ads and unwanted content, - but many of the more advanced features are off by default, and require - you to activate them. </P -><P -> You do have to set up your browser to use - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> (see the <A -HREF="installation.html#FIRSTSTEP" ->Installation section below</A ->). </P -><P -> And you will certainly run into situations where there are false positives, - or ads not being blocked that you may not want to see. In these cases, you - would certainly benefit by customizing <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - configuration to more closely match your individual situation. And we - encourage you to do this. This is where the real power of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> lies!</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="LAN" ->1.11. Can Privoxy run as a server on a network?</A -></H3 -><P -> - Yes, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> runs as a server already, and can easily be configured to - <SPAN -CLASS="QUOTE" ->"serve"</SPAN -> more than one client. See <A -HREF="configuration.html#LANCONFIG" -> How can I set up Privoxy to act as a proxy for my LAN</A -> below.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="BROWSERS2" ->1.12. My browser does the same things as -Privoxy. Why should I use Privoxy at all?</A -></H3 -><P -> Modern browsers do indeed have <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->some</I -></SPAN -> of the same - functionality as <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. Maybe this is - adequate for you. But <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is very - versatile and powerful, and can probably do a number of things - your browser just can't. - </P -><P -> In addition, a proxy is good choice if you use multiple browsers, or - have a LAN with multiple computers since <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can run as a server - application. This way all the configuration is in one place, and you don't - have to maintain a similar configuration for possibly many browsers or - users. - </P -><P -> Note, however, that it's recommended to leverage both your browser's - and <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> privacy enhancing features - at the same time. While your browser probably lacks some features - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> offers, it should also be able to do some things more - reliable, for example restricting and suppressing JavaScript. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="WHYTRUST" ->1.13. Why should I trust Privoxy?</A -></H3 -><P -> The most important reason is because you have access to - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->everything</I -></SPAN ->, and you can control everything. You can - check every line of every configuration file yourself. You can check every - last bit of source code should you desire. And even if you can't read code, - there should be some comfort in knowing that other people can, - and do read it. You can build the software from scratch, if you want, - so that you know the executable is clean, and that it is - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->yours</I -></SPAN ->. In fact, we encourage this level of scrutiny. It - is one reason we use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> ourselves. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="LICENSE" ->1.14. Is there is a license or fee? What about a -warranty? Registration?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is free software and licensed under the <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" ->GNU General Public License (GPL) version 2</A ->. - It is free to use, copy, modify or distribute as you wish under the terms of this - license. Please see the <A -HREF="copyright.html" ->Copyright</A -> section for more - information on the license and copyright. Or the <TT -CLASS="FILENAME" ->LICENSE</TT -> file - that should be included. - </P -><P -> There is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->no warranty</I -></SPAN -> of any kind, expressed, implied or otherwise. - That is something that would cost real money ;-) There is no registration either. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="SPYWARE" ->1.15. Can Privoxy remove spyware? Adware? Viruses?</A -></H3 -><P -> No, at least not reliably enough to trust it. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is not designed to be - a malware removal tool and the default configuration doesn't even try to - filter out any malware.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> could help prevent contact from (known) sites that use such - tactics with appropriate configuration rules, and thus could conceivably - prevent contamination from such sites. However, keeping such a configuration - up to date would require a lot of time and effort that would be better spend - on keeping your software itself up to date so it doesn't have known - vulnerabilities.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="OTHERADS" ->1.16. Can I use Privoxy with other ad-blocking software?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> should work fine with other proxies and other software in general.</P -><P -> But it is probably not necessary to use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in conjunction with other - ad-blocking products, and this could conceivably cause undesirable results. - It might be better to choose one software or the other and work a little to - tweak its configuration to your liking.</P -><P -> Note that this is an advice specific to ad blocking.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="JOINTEAM" ->1.17. I would like to help you, what can I do?</A -></H3 -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="JOINTEAM-WORK" ->1.17.1. Would you like to participate?</A -></H4 -><P -> Well, we <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->always</I -></SPAN -> need help. There is something for - everybody who wants to help us. We welcome new developers, packagers, - testers, documentation writers or really anyone with a desire to help in - any way. You <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->DO NOT</I -></SPAN -> need to be a - <SPAN -CLASS="QUOTE" ->"programmer"</SPAN ->. There are many other tasks available. In fact, - the programmers often can't spend as much time programming because of some - of the other, more mundane things that need to be done, like checking the - Tracker feedback sections. - </P -><P -> So first thing, <A -HREF="https://sourceforge.net/account/register.php" -TARGET="_top" ->get an account on SourceForge.net</A -> - and mail your id to the <A -HREF="mailto:ijbswa-developers@lists.sourceforge.net" -TARGET="_top" ->developers - mailing list</A ->. Then, please read the <A -HREF="../developer-manual/index.html" -TARGET="_top" ->Developer's Manual</A ->, at least - the pertinent sections.</P -><P -> You can also start helping out without SourceForge.net account, - simply by showing up on the mailing list, helping out other users, - providing general feedback or reporting problems you noticed. - </P -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="DONATE" ->1.17.2. Would you like to donate?</A -></H4 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is developed by unpaid volunteers - and thus our current running costs are pretty low. Nevertheless, we - have plans that will cost money in the future. We would like to get - this money through donations made by our users.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has therefore become an associated - project of <A -HREF="http://www.spi-inc.org/about-spi/about-spi" -TARGET="_top" ->Software - in the Public Interest (SPI)</A ->, which allows us to receive tax-deductible - donations in most western countries.</P -><P -> We intend to use the donations to pay for our domain after transfering - it to SPI. Our goal is to make sure there's no single point of failure - and the bill gets paid and the site keeps running even if a some of - the currently active developers were to suddenly disappear for a while.</P -><P -> We would also like to spend some money on more reliable hosting, - on hardware to help make sure <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - keeps running on platforms the developers currently can't test on, - and on technical books to educate our developers about said platforms - or to improve their knowledge in general.</P -><P -> If you enjoy our software and feel like helping out with a donation, - please have a look at - <A -HREF="http://www.spi-inc.org/donations" -TARGET="_top" ->SPI's donation page</A -> - to see what the options are.</P -><P -></P -></DIV -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="installation.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Privoxy Frequently Asked Questions</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Installation</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/index.html b/external/privoxy/doc/webserver/faq/index.html deleted file mode 100644 index cec0d7c..0000000 --- a/external/privoxy/doc/webserver/faq/index.html +++ /dev/null @@ -1,999 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy Frequently Asked Questions</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="NEXT" -TITLE="General Information" -HREF="general.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="ARTICLE" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="ARTICLE" -><DIV -CLASS="TITLEPAGE" -><H1 -CLASS="TITLE" -><A -NAME="AEN2" ->Privoxy Frequently Asked Questions</A -></H1 -><P -CLASS="PUBDATE" -> <SUB -> <A -HREF="copyright.html" ->Copyright</A -> © 2001-2009 by - <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->Privoxy Developers</A -> - </SUB -><BR></P -><P -CLASS="PUBDATE" ->$Id: index.html,v 1.51 2009/03/21 12:59:04 fabiankeil Exp $<BR></P -><DIV -><DIV -CLASS="ABSTRACT" -><P -></P -><A -NAME="AEN9" -></A -><P -> This FAQ gives quick answers to frequently asked questions about - <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->Privoxy</A ->. - It is not a substitute for the - <A -HREF="../user-manual/index.html" -TARGET="_top" -><I -CLASS="CITETITLE" ->Privoxy User Manual</I -></A ->. - - </P -><P ->What is Privoxy?</P -><P -> Privoxy is a non-caching web proxy with advanced filtering capabilities - for enhancing privacy, modifying web page data and HTTP headers, controlling - access, and removing ads and other obnoxious Internet junk. Privoxy has a - flexible configuration and can be customized to suit individual needs and tastes. - It has application for both stand-alone systems and multi-user networks.</P -><P -> Privoxy is Free Software and licensed under the GPL2.</P -><P -> Privoxy is an associated project of Software in the Public Interest (SPI). - <A -HREF="http://www.privoxy.org/faq/general.html#DONATE" -TARGET="_top" ->Donations are welcome</A ->.</P -><P -> Please note that this document is a work in progress. This copy represents - the state at the release of version 3.0.12. - You can find the latest version of the document at <A -HREF="http://www.privoxy.org/faq/" -TARGET="_top" ->http://www.privoxy.org/faq/</A ->. - Please see the <A -HREF="contact.html" ->Contact section</A -> if you want to - contact the developers. - </P -><P -></P -></DIV -></DIV -><HR></DIV -><DIV -CLASS="TOC" -><DL -><DT -><B ->Table of Contents</B -></DT -><DT ->1. <A -HREF="general.html" ->General Information</A -></DT -><DD -><DL -><DT ->1.1. <A -HREF="general.html#WHO-USES" ->Who should give <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> a try?</A -></DT -><DT ->1.2. <A -HREF="general.html#BESTCHOICE" ->Is Privoxy the best choice for -me?</A -></DT -><DT ->1.3. <A -HREF="general.html#PROXYMORON" ->What is a <SPAN -CLASS="QUOTE" ->"proxy"</SPAN ->? How does -Privoxy work?</A -></DT -><DT ->1.4. <A -HREF="general.html#OTHERSTUFF" ->Does Privoxy do anything more than ad blocking?</A -></DT -><DT ->1.5. <A -HREF="general.html#NEWJB" ->What is this new version of -<SPAN -CLASS="QUOTE" ->"Junkbuster"</SPAN ->?</A -></DT -><DT ->1.6. <A -HREF="general.html#AEN78" ->Why <SPAN -CLASS="QUOTE" ->"Privoxy"</SPAN ->? Why change the name from -Junkbuster at all?</A -></DT -><DT ->1.7. <A -HREF="general.html#DIFFERS" ->How does Privoxy differ -from the old Junkbuster?</A -></DT -><DT ->1.8. <A -HREF="general.html#WHATSANAD" ->How does Privoxy know what is -an ad, and what is not?</A -></DT -><DT ->1.9. <A -HREF="general.html#AEN160" ->Can Privoxy make mistakes? -This does not sound very scientific.</A -></DT -><DT ->1.10. <A -HREF="general.html#AEN166" ->Will I have to configure Privoxy - before I can use it?</A -></DT -><DT ->1.11. <A -HREF="general.html#LAN" ->Can Privoxy run as a server on a network?</A -></DT -><DT ->1.12. <A -HREF="general.html#BROWSERS2" ->My browser does the same things as -Privoxy. Why should I use Privoxy at all?</A -></DT -><DT ->1.13. <A -HREF="general.html#WHYTRUST" ->Why should I trust Privoxy?</A -></DT -><DT ->1.14. <A -HREF="general.html#LICENSE" ->Is there is a license or fee? What about a -warranty? Registration?</A -></DT -><DT ->1.15. <A -HREF="general.html#SPYWARE" ->Can Privoxy remove spyware? Adware? Viruses?</A -></DT -><DT ->1.16. <A -HREF="general.html#OTHERADS" ->Can I use Privoxy with other ad-blocking software?</A -></DT -><DT ->1.17. <A -HREF="general.html#JOINTEAM" ->I would like to help you, what can I do?</A -></DT -><DD -><DL -><DT ->1.17.1. <A -HREF="general.html#JOINTEAM-WORK" ->Would you like to participate?</A -></DT -><DT ->1.17.2. <A -HREF="general.html#DONATE" ->Would you like to donate?</A -></DT -></DL -></DD -></DL -></DD -><DT ->2. <A -HREF="installation.html" ->Installation</A -></DT -><DD -><DL -><DT ->2.1. <A -HREF="installation.html#WHICHBROWSERS" ->Which browsers are supported by Privoxy?</A -></DT -><DT ->2.2. <A -HREF="installation.html#WHICHOS" ->Which operating systems are supported?</A -></DT -><DT ->2.3. <A -HREF="installation.html#EMAIL-CLIENT" ->Can I use Privoxy with my email client?</A -></DT -><DT ->2.4. <A -HREF="installation.html#FIRSTSTEP" ->I just installed Privoxy. Is there anything -special I have to do now?</A -></DT -><DT ->2.5. <A -HREF="installation.html#LOCALHOST" ->What is the proxy address of Privoxy?</A -></DT -><DT ->2.6. <A -HREF="installation.html#NOTHING" ->I just installed Privoxy, and nothing is happening. -All the ads are there. What's wrong?</A -></DT -><DT ->2.7. <A -HREF="installation.html#NOTUSED" ->I get a <SPAN -CLASS="QUOTE" ->"Privoxy is not being used"</SPAN -> dummy page although -Privoxy is running and being used.</A -></DT -></DL -></DD -><DT ->3. <A -HREF="configuration.html" ->Configuration</A -></DT -><DD -><DL -><DT ->3.1. <A -HREF="configuration.html#AEN354" ->What exactly is an <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> file?</A -></DT -><DT ->3.2. <A -HREF="configuration.html#ACTIONSS" ->The <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> concept confuses me. Please list -some of these <SPAN -CLASS="QUOTE" ->"actions"</SPAN ->.</A -></DT -><DT ->3.3. <A -HREF="configuration.html#AEN377" ->How are actions files configured? What is the easiest -way to do this?</A -></DT -><DT ->3.4. <A -HREF="configuration.html#AEN386" ->There are several different <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> files. What are -the differences?</A -></DT -><DT ->3.5. <A -HREF="configuration.html#GETUPDATES" ->Where can I get updated Actions Files?</A -></DT -><DT ->3.6. <A -HREF="configuration.html#NEWCONFIG" ->Can I use my old config files?</A -></DT -><DT ->3.7. <A -HREF="configuration.html#DIFFICULT" ->Why is the configuration so complicated?</A -></DT -><DT ->3.8. <A -HREF="configuration.html#YAHOO" ->How can I make my Yahoo/Hotmail/Gmail account work?</A -></DT -><DT ->3.9. <A -HREF="configuration.html#CONFIGFILES" ->What's the difference between the -<SPAN -CLASS="QUOTE" ->"Cautious"</SPAN ->, <SPAN -CLASS="QUOTE" ->"Medium"</SPAN -> and <SPAN -CLASS="QUOTE" ->"Advanced"</SPAN -> defaults?</A -></DT -><DT ->3.10. <A -HREF="configuration.html#BROWSECONFIG" ->Why can I change the configuration -with a browser? Does that not raise security issues?</A -></DT -><DT ->3.11. <A -HREF="configuration.html#AEN481" ->What is the <TT -CLASS="FILENAME" ->default.filter</TT -> file? What is a <SPAN -CLASS="QUOTE" ->"filter"</SPAN ->?</A -></DT -><DT ->3.12. <A -HREF="configuration.html#LANCONFIG" ->How can I set up Privoxy to act as a proxy for my - LAN?</A -></DT -><DT ->3.13. <A -HREF="configuration.html#AEN532" ->Instead of ads, now I get a checkerboard pattern. I don't want to see anything.</A -></DT -><DT ->3.14. <A -HREF="configuration.html#AEN549" ->Why would anybody want to see a checkerboard pattern?</A -></DT -><DT ->3.15. <A -HREF="configuration.html#AEN555" ->I see some images being replaced with text -instead of the checkerboard image. Why and how do I get rid of this?</A -></DT -><DT ->3.16. <A -HREF="configuration.html#SRVANY" ->Can Privoxy run as a service -on Win2K/NT/XP?</A -></DT -><DT ->3.17. <A -HREF="configuration.html#OTHERPROXY" ->How can I make Privoxy work with other -proxies like Squid or Tor?</A -></DT -><DT ->3.18. <A -HREF="configuration.html#PORT-80" ->Can I just set Privoxy to use port 80 -and thus avoid individual browser configuration?</A -></DT -><DT ->3.19. <A -HREF="configuration.html#TRANSPARENT" ->Can Privoxy run as a <SPAN -CLASS="QUOTE" ->"transparent"</SPAN -> proxy?</A -></DT -><DT ->3.20. <A -HREF="configuration.html#INTERCEPTING" ->Can Privoxy run as a <SPAN -CLASS="QUOTE" ->"intercepting"</SPAN -> proxy?</A -></DT -><DT ->3.21. <A -HREF="configuration.html#OUTLOOK" ->How can I configure Privoxy for use with Outlook?</A -></DT -><DT ->3.22. <A -HREF="configuration.html#OUTLOOK-MORE" ->How can I have separate rules just for HTML mail?</A -></DT -><DT ->3.23. <A -HREF="configuration.html#SNEAKY-COOKIES" ->I sometimes notice cookies sneaking through. How?</A -></DT -><DT ->3.24. <A -HREF="configuration.html#EVIL-COOKIES" ->Are all cookies bad? Why?</A -></DT -><DT ->3.25. <A -HREF="configuration.html#ALLOW-COOKIES" ->How can I allow permanent cookies for my trusted sites?</A -></DT -><DT ->3.26. <A -HREF="configuration.html#MULTIPLES" ->Can I have separate configurations for different users?</A -></DT -><DT ->3.27. <A -HREF="configuration.html#WHITELISTS" ->Can I set-up Privoxy as a whitelist of -<SPAN -CLASS="QUOTE" ->"good"</SPAN -> sites?</A -></DT -><DT ->3.28. <A -HREF="configuration.html#NO-ADBLOCK" ->How can I turn off ad-blocking?</A -></DT -><DT ->3.29. <A -HREF="configuration.html#TEMPLATES" ->How can I have custom template pages, like the -<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->BLOCKED</I -></SPAN -> page?</A -></DT -><DT ->3.30. <A -HREF="configuration.html#BLOCKALL" ->How can I remove the <SPAN -CLASS="QUOTE" ->"Go There Anyway"</SPAN -> link from -the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->BLOCKED</I -></SPAN -> page?</A -></DT -></DL -></DD -><DT ->4. <A -HREF="misc.html" ->Miscellaneous</A -></DT -><DD -><DL -><DT ->4.1. <A -HREF="misc.html#AEN729" ->How much does Privoxy slow my browsing down? This -has to add extra time to browsing.</A -></DT -><DT ->4.2. <A -HREF="misc.html#LOADINGTIMES" ->I notice considerable -delays in page requests. What's wrong?</A -></DT -><DT ->4.3. <A -HREF="misc.html#CONFIGURL" ->What are "http://config.privoxy.org/" and -"http://p.p/%22?</A -></DT -><DT ->4.4. <A -HREF="misc.html#NEWADS" ->How can I submit new ads, or report -problems?</A -></DT -><DT ->4.5. <A -HREF="misc.html#NEWADS2" ->If I do submit missed ads, will -they be included in future updates?</A -></DT -><DT ->4.6. <A -HREF="misc.html#NOONECARES" ->Why doesn't anyone answer my support -request?</A -></DT -><DT ->4.7. <A -HREF="misc.html#IP" ->How can I hide my IP address?</A -></DT -><DT ->4.8. <A -HREF="misc.html#AEN794" ->Can Privoxy guarantee I am anonymous?</A -></DT -><DT ->4.9. <A -HREF="misc.html#AEN812" ->A test site says I am not using a Proxy.</A -></DT -><DT ->4.10. <A -HREF="misc.html#TOR" ->How do I use Privoxy - together with Tor?</A -></DT -><DT ->4.11. <A -HREF="misc.html#AEN868" ->Might some things break because header information or -content is being altered?</A -></DT -><DT ->4.12. <A -HREF="misc.html#AEN882" ->Can Privoxy act as a <SPAN -CLASS="QUOTE" ->"caching"</SPAN -> proxy to -speed up web browsing?</A -></DT -><DT ->4.13. <A -HREF="misc.html#AEN892" ->What about as a firewall? Can Privoxy protect me?</A -></DT -><DT ->4.14. <A -HREF="misc.html#AEN897" ->I have large empty spaces / a checkerboard pattern now where -ads used to be. Why?</A -></DT -><DT ->4.15. <A -HREF="misc.html#AEN905" ->How can Privoxy filter Secure (HTTPS) URLs?</A -></DT -><DT ->4.16. <A -HREF="misc.html#AEN919" ->Privoxy runs as a <SPAN -CLASS="QUOTE" ->"server"</SPAN ->. How -secure is it? Do I need to take any special precautions?</A -></DT -><DT ->4.17. <A -HREF="misc.html#TURNOFF" ->Can I temporarily disable Privoxy?</A -></DT -><DT ->4.18. <A -HREF="misc.html#REALLYOFF" ->When <SPAN -CLASS="QUOTE" ->"disabled"</SPAN -> is Privoxy totally -out of the picture?</A -></DT -><DT ->4.19. <A -HREF="misc.html#TURNOFF2" ->How can I tell Privoxy to totally ignore certain sites?</A -></DT -><DT ->4.20. <A -HREF="misc.html#CRUNCH" ->My logs show Privoxy <SPAN -CLASS="QUOTE" ->"crunches"</SPAN -> -ads, but also its own internal CGI pages. What is a <SPAN -CLASS="QUOTE" ->"crunch"</SPAN ->?</A -></DT -><DT ->4.21. <A -HREF="misc.html#DOWNLOADS" ->Can Privoxy effect files that I download -from a webserver? FTP server?</A -></DT -><DT ->4.22. <A -HREF="misc.html#DOWNLOADS2" ->I just downloaded a Perl script, and Privoxy -altered it! Yikes, what is wrong!</A -></DT -><DT ->4.23. <A -HREF="misc.html#HOSTSFILE" ->Should I continue to use a <SPAN -CLASS="QUOTE" ->"HOSTS"</SPAN -> file for ad-blocking?</A -></DT -><DT ->4.24. <A -HREF="misc.html#SEEALSO" ->Where can I find more information about Privoxy -and related issues?</A -></DT -><DT ->4.25. <A -HREF="misc.html#MICROSUCK" ->I've noticed that Privoxy changes <SPAN -CLASS="QUOTE" ->"Microsoft"</SPAN -> to -<SPAN -CLASS="QUOTE" ->"MicroSuck"</SPAN ->! Why are you manipulating my browsing?</A -></DT -><DT ->4.26. <A -HREF="misc.html#VALID" ->Does Privoxy produce <SPAN -CLASS="QUOTE" ->"valid"</SPAN -> HTML (or XHTML)?</A -></DT -></DL -></DD -><DT ->5. <A -HREF="trouble.html" ->Troubleshooting</A -></DT -><DD -><DL -><DT ->5.1. <A -HREF="trouble.html#AEN1084" ->I cannot connect to any websites. Or, I am getting -<SPAN -CLASS="QUOTE" ->"connection refused"</SPAN -> message with every web page. Why?</A -></DT -><DT ->5.2. <A -HREF="trouble.html#ERROR503" ->Why am I getting a 503 Error (WSAECONNREFUSED) on every page?</A -></DT -><DT ->5.3. <A -HREF="trouble.html#AEN1107" ->I just added a new rule, but the steenkin ad is -still getting through. How?</A -></DT -><DT ->5.4. <A -HREF="trouble.html#BADSITE" ->One of my favorite sites does not work with Privoxy. -What can I do?</A -></DT -><DT ->5.5. <A -HREF="trouble.html#DUN" ->After installing Privoxy, I have to log in -every time I start IE. What gives?</A -></DT -><DT ->5.6. <A -HREF="trouble.html#FTP" ->I cannot connect to any FTP sites. Privoxy - is blocking me.</A -></DT -><DT ->5.7. <A -HREF="trouble.html#MACOSXIE" ->In Mac OS X, I can't configure Microsoft Internet Explorer to use - Privoxy as the HTTP proxy.</A -></DT -><DT ->5.8. <A -HREF="trouble.html#MACOSXUNINSTALL" ->In Mac OS X, I dragged the Privoxy folder to the trash in order to - uninstall it. Now the finder tells me I don't have sufficient privileges to - empty the trash.</A -></DT -><DT ->5.9. <A -HREF="trouble.html#MACOSXIMAGES" ->In Mac OS X Panther (10.3), images often fail to load and/or I - experience random delays in page loading. I'm using - <TT -CLASS="LITERAL" ->localhost</TT -> as my browser's proxy setting.</A -></DT -><DT ->5.10. <A -HREF="trouble.html#BLANKPAGE" ->I get a completely blank page at one site. <SPAN -CLASS="QUOTE" ->"View Source"</SPAN -> - shows only: <SPAN -CLASS="MARKUP" -><html><body></body></html></SPAN ->. Without - Privoxy the page loads fine.</A -></DT -><DT ->5.11. <A -HREF="trouble.html#NOHOSTNAME" ->My logs show many <SPAN -CLASS="QUOTE" ->"Unable to get my own hostname"</SPAN -> lines. -Why?</A -></DT -><DT ->5.12. <A -HREF="trouble.html#INUSE" ->When I try to launch Privoxy, I get an -error message <SPAN -CLASS="QUOTE" ->"port 8118 is already in use"</SPAN -> (or similar wording). -Why?</A -></DT -><DT ->5.13. <A -HREF="trouble.html#DEMORONIZER" ->Pages with UTF-8 fonts are garbled.</A -></DT -><DT ->5.14. <A -HREF="trouble.html#DEMORONIZER2" ->Why are binary files (such as images) corrupted when Privoxy - is used?</A -></DT -><DT ->5.15. <A -HREF="trouble.html#DEMORONIZER3" ->What is the <SPAN -CLASS="QUOTE" ->"demoronizer"</SPAN -> and why is it there?</A -></DT -><DT ->5.16. <A -HREF="trouble.html#WINDOWOPEN" ->Why do I keep seeing <SPAN -CLASS="QUOTE" ->"PrivoxyWindowOpen()"</SPAN -> in raw source code?</A -></DT -><DT ->5.17. <A -HREF="trouble.html#DNSERRORS" ->I am getting too many DNS errors like <SPAN -CLASS="QUOTE" ->"404 No Such Domain"</SPAN ->. Why - can't Privoxy do this better?</A -></DT -><DT ->5.18. <A -HREF="trouble.html#ALLCPU" ->At one site Privoxy just hangs, and starts taking - all CPU. Why is this?</A -></DT -><DT ->5.19. <A -HREF="trouble.html#SLOWCRAWL" ->I just installed Privoxy, and all my -browsing has slowed to a crawl. What gives?</A -></DT -><DT ->5.20. <A -HREF="trouble.html#PREVENTCOMP" ->Why do my filters work on some sites but not on others?</A -></DT -><DT ->5.21. <A -HREF="trouble.html#SSL-WARNINGS" ->On some HTTPS sites my browser warns me about unauthenticated content, - the URL bar doesn't get highlighted and the lock symbol appears to be broken. - What's going on?</A -></DT -><DT ->5.22. <A -HREF="trouble.html#SE-LINUX" ->I get selinux error messages. How can I fix this?</A -></DT -><DT ->5.23. <A -HREF="trouble.html#GENTOO-RICERS" ->I compiled <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with Gentoo's portage and it appears to be very slow. Why?</A -></DT -></DL -></DD -><DT ->6. <A -HREF="contact.html" ->Contacting the developers, Bug Reporting and Feature Requests</A -></DT -><DD -><DL -><DT ->6.1. <A -HREF="contact.html#CONTACT-SUPPORT" ->Get Support</A -></DT -><DT ->6.2. <A -HREF="contact.html#REPORTING" ->Reporting Problems</A -></DT -><DD -><DL -><DT ->6.2.1. <A -HREF="contact.html#CONTACT-ADS" ->Reporting Ads or Other Configuration Problems</A -></DT -><DT ->6.2.2. <A -HREF="contact.html#CONTACT-BUGS" ->Reporting Bugs</A -></DT -></DL -></DD -><DT ->6.3. <A -HREF="contact.html#CONTACT-FEATURE" ->Request New Features</A -></DT -><DT ->6.4. <A -HREF="contact.html#CONTACT-OTHER" ->Other</A -></DT -></DL -></DD -><DT ->7. <A -HREF="copyright.html" ->Privoxy Copyright, License and History</A -></DT -><DD -><DL -><DT ->7.1. <A -HREF="copyright.html#AEN1451" ->License</A -></DT -><DT ->7.2. <A -HREF="copyright.html#AEN1467" ->History</A -></DT -></DL -></DD -></DL -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -> </TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="general.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -> </TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->General Information</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/installation.html b/external/privoxy/doc/webserver/faq/installation.html deleted file mode 100644 index 1e99b30..0000000 --- a/external/privoxy/doc/webserver/faq/installation.html +++ /dev/null @@ -1,569 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Installation</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="General Information" -HREF="general.html"><LINK -REL="NEXT" -TITLE="Configuration" -HREF="configuration.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Frequently Asked Questions</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="general.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="configuration.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="INSTALLATION" ->2. Installation</A -></H1 -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="WHICHBROWSERS" ->2.1. Which browsers are supported by Privoxy?</A -></H3 -><P -> Any browser that can be configured to use a proxy, which - should be virtually all browsers, including - <SPAN -CLASS="APPLICATION" ->Firefox</SPAN ->, <SPAN -CLASS="APPLICATION" ->Internet - Explorer</SPAN ->, <SPAN -CLASS="APPLICATION" ->Opera</SPAN ->, and - <SPAN -CLASS="APPLICATION" ->Safari</SPAN -> among others. - Direct browser support is not an absolute requirement since - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> runs as a separate application and talks - to the browser in the standardized HTTP protocol, just like a web server - does.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="WHICHOS" ->2.2. Which operating systems are supported?</A -></H3 -><P -> At present, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is known to run on - Windows(95, 98, ME, 2000, XP, Vista), GNU/Linux (RedHat, SuSE, Debian, - Fedora, Gentoo, Slackware and others), Mac OSX, OS/2, AmigaOS, FreeBSD, - NetBSD, OpenBSD, Solaris, and various other flavors of Unix.</P -><P -> But any operating system that runs TCP/IP, can conceivably take advantage of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in a networked situation where - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> would run as a server on a LAN gateway. - Then only the <SPAN -CLASS="QUOTE" ->"gateway"</SPAN -> needs to be running one of the above - operating systems.</P -><P -> Source code is freely available, so porting to other operating systems - is always a possibility.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="EMAIL-CLIENT" ->2.3. Can I use Privoxy with my email client?</A -></H3 -><P -> As long as there is some way to set a HTTP proxy for the client, then yes, - any application can be used, whether it is strictly speaking a - <SPAN -CLASS="QUOTE" ->"browser"</SPAN -> or not. Though this may not be the best approach for - dealing with some of the common abuses of HTML in email. See <A -HREF="configuration.html#OUTLOOK" ->How can I configure <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - with <SPAN -CLASS="APPLICATION" ->Outlook</SPAN ->?</A -> below for more on - this. </P -><P -> Be aware that HTML email presents a number of unique security and privacy - related issues, that can require advanced skills to overcome. The developers - recommend using email clients that can be configured to convert HTML to plain - text for these reasons.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="FIRSTSTEP" ->2.4. I just installed Privoxy. Is there anything -special I have to do now?</A -></H3 -><P -> All browsers should be told to use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - as a proxy by specifying the correct proxy address and port number - in the appropriate configuration area for the browser. It's possible - to combine <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with a packet filter to intercept HTTP requests - even if the client isn't explicitly configured to use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, - but where possible, configuring the client is recommended. See - <A -HREF="../user-manual/startup.html" -TARGET="_top" ->the User Manual for more - details</A ->. You should also flush your browser's memory and disk - cache to get rid of any cached junk items, and remove any stored - <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookies</A ->. </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="LOCALHOST" ->2.5. What is the proxy address of Privoxy?</A -></H3 -><P -> If you set up the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 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 <TT -CLASS="LITERAL" ->127.0.0.1</TT -> - (sometimes referred to as <SPAN -CLASS="QUOTE" ->"localhost"</SPAN ->, - which is the special name used by every computer on the Internet to refer - to itself) and the port will be 8118 (unless you used the <A -HREF="../user-manual/config.html#LISTEN-ADDRESS" -TARGET="_top" ->listen-address</A -> - config option to tell <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to run on - a different port). - </P -><P -> When configuring your browser's proxy settings you typically enter - the word <SPAN -CLASS="QUOTE" ->"localhost"</SPAN -> or the IP address <SPAN -CLASS="QUOTE" ->"127.0.0.1"</SPAN -> - in the boxes next to <SPAN -CLASS="QUOTE" ->"HTTP"</SPAN -> and <SPAN -CLASS="QUOTE" ->"Secure"</SPAN -> (HTTPS) and - then the number <SPAN -CLASS="QUOTE" ->"8118"</SPAN -> for <SPAN -CLASS="QUOTE" ->"port"</SPAN ->. - This tells your browser to send all web requests to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - instead of directly to the Internet. - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 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 <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is running, or the equivalent hostname, e.g. <TT -CLASS="LITERAL" ->192.168.1.1</TT ->. - Port assignment would be same as above. Note that - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> doesn't listen on any LAN interfaces by - default. - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> does not currently handle - any other protocols such as FTP, SMTP, IM, IRC, ICQ, etc. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NOTHING" ->2.6. I just installed Privoxy, and nothing is happening. -All the ads are there. What's wrong?</A -></H3 -><P -> Did you configure your browser to use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - 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 <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is running, and your browser - is correctly configured by entering the special URL: - <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->. - - This should take you to a page titled <SPAN -CLASS="QUOTE" ->"This is Privoxy.."</SPAN -> with - access to <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> internal configuration. - If you see this, then you are good to go. If you receive a page saying - <SPAN -CLASS="QUOTE" ->"Privoxy is not running"</SPAN ->, then the browser is not set up to use - your <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> installation. - If you receive anything else (probably nothing at all), it could either - be that the browser is not set up correctly, or that - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is not running at all. Check the <A -HREF="../user-manual/config.html#LOGFILE" -TARGET="_top" ->log file</A ->. For instructions - on starting <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and browser configuration, - see the <A -HREF="http://www.privoxy.org/user-manual/startup.html" -TARGET="_top" ->chapter - on starting <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -></A -> in the - <A -HREF="http://www.privoxy.org/user-manual/" -TARGET="_top" ->User Manual</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NOTUSED" ->2.7. I get a <SPAN -CLASS="QUOTE" ->"Privoxy is not being used"</SPAN -> dummy page although -Privoxy is running and being used.</A -></H3 -><P -> First, make sure that Privoxy is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->really</I -></SPAN -> running and - being used by visiting <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->. You - should see the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> main page. If not, see - the <A -HREF="http://www.privoxy.org/user-manual/startup.html" -TARGET="_top" ->chapter - on starting <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -></A -> in the - <A -HREF="http://www.privoxy.org/user-manual/" -TARGET="_top" ->User Manual</A ->.</P -><P -> Now if <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A -> works for you, but - other parts of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s web interface show - the dummy page, your browser has cached a redirection it encountered before - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> was being used. You need to clear your - browser's cache. Note that shift-reloading the dummy page won't help, since - that'll only refresh the dummy page, not the redirection that lead you there.</P -><P -> The procedure for clearing the cache varies from browser to browser. For - example, <SPAN -CLASS="APPLICATION" ->Mozilla/Netscape</SPAN -> users would click - <SPAN -CLASS="GUIBUTTON" ->Edit</SPAN -> --> <SPAN -CLASS="GUIBUTTON" ->Preferences</SPAN -> --> - <SPAN -CLASS="GUIBUTTON" ->Advanced</SPAN -> --> <SPAN -CLASS="GUIBUTTON" ->Cache</SPAN -> and - then click both <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Clear Memory Cache</SPAN ->"</SPAN -> - and <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Clear Disk Cache</SPAN ->"</SPAN ->. - In some <SPAN -CLASS="APPLICATION" ->Firefox</SPAN -> versions it's - <SPAN -CLASS="GUIBUTTON" ->Tools</SPAN -> --> <SPAN -CLASS="GUIBUTTON" ->Options</SPAN -> --> - <SPAN -CLASS="GUIBUTTON" ->Privacy</SPAN -> --> <SPAN -CLASS="GUIBUTTON" ->Cache</SPAN -> and - then click <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Clear Cache Now</SPAN ->"</SPAN ->. - </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="general.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="configuration.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->General Information</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Configuration</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/misc.html b/external/privoxy/doc/webserver/faq/misc.html deleted file mode 100644 index 174722e..0000000 --- a/external/privoxy/doc/webserver/faq/misc.html +++ /dev/null @@ -1,1745 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Miscellaneous</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Configuration" -HREF="configuration.html"><LINK -REL="NEXT" -TITLE="Troubleshooting" -HREF="trouble.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Frequently Asked Questions</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="configuration.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="trouble.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="MISC" ->4. Miscellaneous</A -></H1 -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN729" ->4.1. How much does Privoxy slow my browsing down? This -has to add extra time to browsing.</A -></H3 -><P -> How much of an impact depends on many things, including the CPU of the host - system, how aggressive the configuration is, which specific actions are being triggered, - the size of the page, the bandwidth of the connection, etc.</P -><P -> Overall, 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 typically being - retrieved and displayed. The actual processing time required by - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 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 and - other junk content (if ad blocking is being used).</P -><P -> <SPAN -CLASS="QUOTE" ->"Filtering"</SPAN -> content via the <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#FILTER" -TARGET="_top" ->filter</A -></TT -> or - <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#DEANIMATE-GIFS" -TARGET="_top" ->deanimate-gifs</A -></TT -> - actions may cause a perceived slowdown, since the entire document - needs to be buffered before displaying. And on very large documents, - filtering may have some measurable impact. How much depends on the page size, - the actual definition of the filter(s), etc. See below. Most other actions - have little to no impact on speed.</P -><P -> Also, when filtering is enabled but zlib support isn't available, compression - is often disabled (see <A -HREF="../user-manual/actions-file.html#PREVENT-COMPRESSION" -TARGET="_top" ->prevent-compression</A ->). - This can have an impact on speed as well, although it's probably smaller than - you might think. Again, the page size, etc. will determine how much of an impact.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="LOADINGTIMES" ->4.2. I notice considerable -delays in page requests. What's wrong?</A -></H3 -><P -> If you use any <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#FILTER" -TARGET="_top" ->filter</A -></TT -> action, - such as filtering banners by size, web-bugs etc, or the <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#DEANIMATE-GIFS" -TARGET="_top" ->deanimate-gifs</A -></TT -> - action, the entire document must be loaded into memory in order for the filtering - mechanism to work, and nothing is sent to the browser during this time.</P -><P -> The loading time typically does not really change much 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". This effect is - more noticeable on slower dialup connections. Extremely large documents - may have some impact on the time to load the page where there is filtering - being done. But overall, the difference should be very minimal. If there is a - big impact, then probably some other situation is contributing (like - anti-virus software). - </P -><P -> Filtering is automatically disabled for inappropriate MIME types. But note - that if the web server mis-reports the MIME type, then content that should - not be filtered, could be. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> only knows how - to differentiate filterable content because of the MIME type as reported by - the server, or because of some configuration setting that enables/disables - filtering.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="CONFIGURL" ->4.3. What are "http://config.privoxy.org/" and -"http://p.p/%22?</A -></H3 -><P -> <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> is the - address of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s built-in user interface, and - <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A -> is a shortcut for it.</P -><P -> Since <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> sits between your web browser and the Internet, - it can simply intercept requests for these addresses and answer them with its built-in - <SPAN -CLASS="QUOTE" ->"web server"</SPAN ->.</P -><P -> This also makes for a good test for your browser configuration: If entering the - URL <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> - takes you to a page saying <SPAN -CLASS="QUOTE" ->"This is Privoxy ..."</SPAN ->, everything is OK. - If you get a page saying <SPAN -CLASS="QUOTE" ->"Privoxy is not working"</SPAN -> instead, then - your browser didn't use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> for the request, - hence it could not be intercepted, and you have accessed the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->real</I -></SPAN -> - web site at config.privoxy.org.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NEWADS" ->4.4. How can I submit new ads, or report -problems?</A -></H3 -><P ->Please see the <A -HREF="contact.html" ->Contact section</A -> for -various ways to interact with the developers.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NEWADS2" ->4.5. If I do submit missed ads, will -they be included in future updates?</A -></H3 -><P -> Whether such submissions are eventually included in the - <TT -CLASS="FILENAME" ->default.action</TT -> configuration file depends on how - significant the issue is. We of course want to address any potential - problem with major, high-profile sites such as <I -CLASS="CITETITLE" ->Google</I ->, - <I -CLASS="CITETITLE" ->Yahoo</I ->, etc. Any site with global or regional reach, - has a good chance of being a candidate. But at the other end of the spectrum - are any number of smaller, low-profile sites such as for local clubs or - schools. Since their reach and impact are much less, they are best handled by - inclusion in the user's <TT -CLASS="FILENAME" ->user.action</TT ->, and thus would be - unlikely to be included. </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NOONECARES" ->4.6. Why doesn't anyone answer my support -request?</A -></H3 -><P ->Rest assured that it has been read and considered. Why it is not answered, -could be for various reasons, including no one has a good answer for it, no -one has had time to yet investigate it thoroughly, it has been reported -numerous times already, or because not enough information was provided to help -us help you. Your efforts are not wasted, and we do appreciate them.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="IP" ->4.7. How can I hide my IP address?</A -></H3 -><P -> If you run both the browser and <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> locally, you cannot hide your IP - address with <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> or ultimately any other - software alone. The server needs to know your IP address so that it knows - where to send the responses back. </P -><P -> There are many publicly usable "anonymous" proxies out there, which - provide a further level of indirection between you and the web server.</P -><P -> However, these proxies are called "anonymous" because you don't need - to authenticate, not because they would offer any real anonymity. - Most of them will log your IP address and make it available to the - authorities in case you violate the law of the country they run in. 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.</P -><P -> If you want to hide your IP address from most adversaries, - you should consider chaining <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - with <A -HREF="https://www.torproject.org/" -TARGET="_top" ->Tor</A ->. - The configuration details can be found in - <A -HREF="#TOR" -TARGET="_top" ->How do I use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> together - with <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> section</A -> - just below.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN794" ->4.8. Can Privoxy guarantee I am anonymous?</A -></H3 -><P -> No. Your chances of remaining anonymous are improved, but unless you - <A -HREF="#TOR" -TARGET="_top" ->chain <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with <SPAN -CLASS="APPLICATION" ->Tor</SPAN -></A -> - or a similar proxy and know what you're doing when it comes to configuring - the rest of your system, you should assume that everything you do - on the Web can be traced back to you.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can remove various information about you, - and allows <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->you</I -></SPAN -> more freedom to decide which sites - you can trust, and what details you want to reveal. But it neither - hides your IP address, nor can it guarantee that the rest of the system - behaves correctly. There are several possibilities how a web sites can find - out who you are, even if you are using a strict <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - configuration and chained it with <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->.</P -><P -> Most of <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> privacy-enhancing features can be easily subverted - by an insecure browser configuration, therefore you should use a browser that can - be configured to only execute code from trusted sites, and be careful which sites you trust. - For example there is no point in having <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - modify the User-Agent header, if websites can get all the information they want - through JavaScript, ActiveX, Flash, Java etc.</P -><P -> A few browsers disclose the user's email address in certain situations, such - as when transferring a file by FTP. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - 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 <SPAN -CLASS="APPLICATION" ->NSClean</SPAN ->.</P -><P -> 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!</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN812" ->4.9. A test site says I am not using a Proxy.</A -></H3 -><P -> Good! Actually, they are probably testing for some other kinds of proxies. - Hiding yourself completely would require additional steps.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="TOR" ->4.10. How do I use Privoxy - together with Tor?</A -></H3 -><P -> Before you configure <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to use - <A -HREF="https://www.torproject.org/" -TARGET="_top" ->Tor</A ->, - please follow the <I -CLASS="CITETITLE" ->User Manual</I -> chapters - <A -HREF="../user-manual/installation.html" -TARGET="_top" ->2. Installation</A -> and - <A -HREF="../user-manual/startup.html" -TARGET="_top" ->5. Startup</A -> to make sure - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> itself is setup correctly.</P -><P -> - If it is, refer to <A -HREF="https://www.torproject.org/documentation.html" -TARGET="_top" ->Tor's - extensive documentation</A -> to learn how to install <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->, - and make sure <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->'s logfile says that - <SPAN -CLASS="QUOTE" ->"Tor has successfully opened a circuit"</SPAN -> and it - <SPAN -CLASS="QUOTE" ->"looks like client functionality is working"</SPAN ->.</P -><P -> If either <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> or <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - isn't working, their combination most likely will neither. Testing them on their - own will also help you to direct problem reports to the right audience. - If <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> isn't working, don't bother the - <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> developers. If <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> - isn't working, don't send bug reports to the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Team.</P -><P -> If you verified that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> - are working, it is time to connect them. As far as <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is concerned, <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> is just another proxy that can be reached - by socks4 or socks4a. Most likely you are interested in <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> - to increase your anonymity level, therefore you should use socks4a, to make sure DNS requests are - done through <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> and thus invisible to your local network.</P -><P -> Since <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.5, its - <A -HREF="../user-manual/config.html" -TARGET="_top" ->main configuration file</A -> - is already prepared for <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->, if you are using a - default <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> configuration and run it on the same - system as <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, you just have to edit the - <A -HREF="../user-manual/config.html#FORWARDING" -TARGET="_top" ->forwarding section</A -> - and uncomment the line:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># forward-socks4a / 127.0.0.1:9050 . - </PRE -></TD -></TR -></TABLE -></P -><P -> This is enough to reach the Internet, but additionally you might want to - uncomment the following forward rules, to make sure your local network is still - reachable through Privoxy:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># forward 192.168.*.*/ . -# forward 10.*.*.*/ . -# forward 127.*.*.*/ . - </PRE -></TD -></TR -></TABLE -></P -><P -> Unencrypted connections to systems in these address ranges will - be as (un)secure as the local network is, but the alternative is - that your browser can't reach the network at all. Then again, - that may actually be desired and if you don't know for sure - that your browser has to be able to reach the local network, - there's no reason to allow it.</P -><P -> If you want your browser to be able to reach servers in your local - network by using their names, you will need additional exceptions - that look like this:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># forward localhost/ . - </PRE -></TD -></TR -></TABLE -></P -><P -> Save the modified configuration file and open - <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status/</A -> - in your browser, confirm that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has reloaded its configuration - and that there are no other forward lines, unless you know that you need them. If everything looks good, - refer to - <A -HREF="https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ#IsMyConnectionPriv..." -TARGET="_top" ->Tor - Faq 4.2</A -> to learn how to verify that you are really using <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->.</P -><P -> Afterward, please take the time to at least skim through the rest - of <SPAN -CLASS="APPLICATION" ->Tor's</SPAN -> documentation. Make sure you understand - what <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> does, why it is no replacement for - application level security, and why you probably don't want to - use it for unencrypted logins.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN868" ->4.11. Might some things break because header information or -content is being altered?</A -></H3 -><P -> Definitely. It is common for sites to use browser type, browser version, - HTTP header content, and various other techniques in order to dynamically - decide what to display and how to display it. What you see, and what I see, - might be very different. There are many, many ways that this can be handled, - so having hard and fast rules, is tricky.</P -><P -> The <SPAN -CLASS="QUOTE" ->"User-Agent"</SPAN -> is sometimes used in this way to identify - the browser, and adjust content accordingly.</P -><P -> Also, different browsers use different encodings of non-English - characters, certain web servers convert pages on-the-fly according to the - User Agent header. Giving a <SPAN -CLASS="QUOTE" ->"User Agent"</SPAN -> 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 - <SPAN -CLASS="QUOTE" ->"Referer"</SPAN -> header; they may fail or break if unavailable. The - weather maps of Intellicast have been blocked by their server when no - <SPAN -CLASS="QUOTE" ->"Referer"</SPAN -> or cookie is provided, is another example. (But you - can forge both headers without giving information away). There are - many other ways things can go wrong when trying to fool a web server. The - results of which could inadvertently cause pages to load incorrectly, - partially, or even not at all. And there may be no obvious clues as to just - what went wrong, or why. Nowhere will there be a message that says - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Turn off <TT -CLASS="LITERAL" ->fast-redirects</TT -> or else!</I -></SPAN -> - "</SPAN -></P -><P -> Similar thoughts apply to modifying JavaScript, and, to a lesser degree, - HTML elements.</P -><P -> 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.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN882" ->4.12. Can Privoxy act as a <SPAN -CLASS="QUOTE" ->"caching"</SPAN -> proxy to -speed up web browsing?</A -></H3 -><P -> No, it does not have this ability at all. You want something like - <A -HREF="http://www.squid-cache.org/" -TARGET="_top" ->Squid</A -> or - <A -HREF="http://www.pps.jussieu.fr/~jch/software/polipo/" -TARGET="_top" ->Polipo</A -> for this. - And, yes, before you ask, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can co-exist - with other kinds of proxies like <SPAN -CLASS="APPLICATION" ->Squid</SPAN ->. - See the <A -HREF="../user-manual/config.html#FORWARDING" -TARGET="_top" ->forwarding - chapter</A -> in the <A -HREF="../user-manual/index.html" -TARGET="_top" ->user - manual</A -> for details.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN892" ->4.13. What about as a firewall? Can Privoxy protect me?</A -></H3 -><P -> Not in the way you mean, or in the way some firewall vendors claim they can. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can help protect your privacy, but can't - protect your system from intrusion attempts. It is, of course, perfectly possible - to use <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN897" ->4.14. I have large empty spaces / a checkerboard pattern now where -ads used to be. Why?</A -></H3 -><P -> It is technically possible to eliminate banners and ads in a way that frees - their allocated page space. This could easily be done by blocking with - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> filters, - and eliminating the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->entire</I -></SPAN -> image references from the - HTML page source. </P -><P -> But, this would consume considerably more CPU resources (IOW, slow things - down), would likely destroy the layout of some web pages which rely on the - banners utilizing a certain amount of page space, and might fail in other - cases, where the screen space is reserved (e.g. by HTML tables for instance). - Also, making ads and banners disappear without any trace complicates - troubleshooting, and would sooner or later be problematic.</P -><P -> The better alternative is to instead let them stay, and block the resulting - requests for the banners themselves as is now the case. This leaves either - empty space, or the familiar checkerboard pattern.</P -><P -> So the developers won't support this in the default configuration, but you - can of course define appropriate filters yourself to achieve this.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN905" ->4.15. How can Privoxy filter Secure (HTTPS) URLs?</A -></H3 -><P -> Since secure HTTP connections are encrypted SSL sessions between your browser - and the secure site, and are meant to be reliably <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->secure</I -></SPAN ->, - there is little that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can do but hand the raw - gibberish data though from one end to the other unprocessed.</P -><P -> The only exception to this is blocking by host patterns, as the client needs - to tell <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> the name of the remote server, - so that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can establish the connection. - If that name matches a host-only pattern, the connection will be blocked.</P -><P -> As far as ad blocking is concerned, this is less of a restriction than it may - seem, since ad sources are often identifiable by the host name, and often - the banners to be placed in an encrypted page come unencrypted nonetheless - for efficiency reasons, which exposes them to the full power of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s ad blocking.</P -><P -> <SPAN -CLASS="QUOTE" ->"Content cookies"</SPAN -> (those that are embedded in the actual HTML or - JS page content, see <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#FILTER-CONTENT-COOKIES" -TARGET="_top" ->filter{content-cookies}</A -></TT ->), - in an SSL transaction will be impossible to block under these conditions. - Fortunately, this does not seem to be a very common scenario since most - cookies come by traditional means.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN919" ->4.16. Privoxy runs as a <SPAN -CLASS="QUOTE" ->"server"</SPAN ->. How -secure is it? Do I need to take any special precautions?</A -></H3 -><P -> On Unix-like systems, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can run as a non-privileged - user, which is how we recommend it be run. Also, by default - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> listens to requests from <SPAN -CLASS="QUOTE" ->"localhost"</SPAN -> - only.</P -><P -> The server aspect of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is not itself directly - exposed to the Internet in this configuration. If you want to have - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 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 - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> configuration file and check all <A -HREF="../user-manual/config.html#ACCESS-CONTROL" -TARGET="_top" ->access control and security - options</A ->. All LAN hosts can then use this as their proxy address - in the browser proxy configuration, but <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - will not listen on any external interfaces. ACLs can be defined in addition, - and using a firewall is always good too. Better safe than sorry.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="TURNOFF" ->4.17. Can I temporarily disable Privoxy?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> doesn't have a transparent proxy mode, - but you can toggle off blocking and content filtering.</P -><P -> The easiest way to do that is to point your browser - to the remote toggle URL: <A -HREF="http://config.privoxy.org/toggle" -TARGET="_top" ->http://config.privoxy.org/toggle</A ->.</P -><P -> See the <A -HREF="../user-manual/appendix.html#BOOKMARKLETS" -TARGET="_top" ->Bookmarklets section</A -> - of the <I -CLASS="CITETITLE" ->User Manual</I -> for an easy way to access this - feature. Note that this is a feature that may need to be enabled in the main - <TT -CLASS="FILENAME" ->config</TT -> file.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="REALLYOFF" ->4.18. When <SPAN -CLASS="QUOTE" ->"disabled"</SPAN -> is Privoxy totally -out of the picture?</A -></H3 -><P -> No, this just means all optional filtering and actions are disabled. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is still acting as a proxy, but just - doing less of the things that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> would - normally be expected to do. It is still a <SPAN -CLASS="QUOTE" ->"middle-man"</SPAN -> in - the interaction between your browser and web sites. See below to bypass - the proxy.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="TURNOFF2" ->4.19. How can I tell Privoxy to totally ignore certain sites?</A -></H3 -><P -> Bypassing a proxy, or proxying based on arbitrary criteria, is purely a browser - configuration issue, not a <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> issue. Modern browsers typically do have - settings for not proxying certain sites. Check your browser's help files.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="CRUNCH" ->4.20. My logs show Privoxy <SPAN -CLASS="QUOTE" ->"crunches"</SPAN -> -ads, but also its own internal CGI pages. What is a <SPAN -CLASS="QUOTE" ->"crunch"</SPAN ->?</A -></H3 -><P -> A <SPAN -CLASS="QUOTE" ->"crunch"</SPAN -> simply means <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> intercepted - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->something</I -></SPAN ->, nothing more. Often this is indeed ads or - banners, but <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> uses the same mechanism for - trapping requests for its own internal pages. For instance, a request for - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> configuration page at: <A -HREF="http://config.privoxy.org" -TARGET="_top" ->http://config.privoxy.org</A ->, is - intercepted (i.e. it does not go out to the 'net), and the familiar CGI - configuration is returned to the browser, and the log consequently will show - a <SPAN -CLASS="QUOTE" ->"crunch"</SPAN ->.</P -><P -> Since version 3.0.7, Privoxy will also log the crunch reason. - If you are using an older version you might want to upgrade.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DOWNLOADS" ->4.21. Can Privoxy effect files that I download -from a webserver? FTP server?</A -></H3 -><P -> From the webserver's perspective, there is no difference between - viewing a document (i.e. a page), and downloading a file. The same is true of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. If there is a match for a <TT -CLASS="LITERAL" -><A -HREF="../user-manual/actions-file.html#BLOCK" -TARGET="_top" ->block</A -></TT -> pattern, - it will still be blocked, and of course this is obvious. - </P -><P -> Filtering is potentially more of a concern since the results are not always - so obvious, and the effects of filtering are there whether the file is simply - viewed, or downloaded. And potentially whether the content is some obnoxious - advertisement, or Mr. Jimmy's latest/greatest source code jewel. Of course, - one of these presumably is <SPAN -CLASS="QUOTE" ->"bad"</SPAN -> content that we don't want, and - the other is <SPAN -CLASS="QUOTE" ->"good"</SPAN -> content that we do want. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is blind to the differences, and can only - distinguish <SPAN -CLASS="QUOTE" ->"good from bad"</SPAN -> by the configuration parameters - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->we</I -></SPAN -> give it.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> knows the differences in files according - to the <SPAN -CLASS="QUOTE" ->"Content Type"</SPAN -> as reported by the webserver. If this is - reported accurately (e.g. <SPAN -CLASS="QUOTE" ->"application/zip"</SPAN -> for a zip archive), - then <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> knows to ignore these where - appropriate. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> potentially can filter HTML - as well as plain text documents, subject to configuration parameters of - course. Also, documents that are of an unknown type (generally assumed to be - <SPAN -CLASS="QUOTE" ->"text/plain"</SPAN ->) can be filtered, as will those that might be - incorrectly reported by the webserver. If such a file is a downloaded file - that is intended to be saved to disk, then any content that might have been - altered by filtering, will be saved too, for these (probably rare) cases.</P -><P -> Note that versions later than 3.0.2 do NOT filter document types reported as - <SPAN -CLASS="QUOTE" ->"text/plain"</SPAN ->. Prior to this, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - did filter this document type.</P -><P -> In short, filtering is <SPAN -CLASS="QUOTE" ->"ON"</SPAN -> if a) the content type as reported - by the webserver is appropriate <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and</I -></SPAN -> b) the configuration - allows it (or at least does not disallow it). That's it. There is no magic - cookie anywhere to say this is <SPAN -CLASS="QUOTE" ->"good"</SPAN -> and this is - <SPAN -CLASS="QUOTE" ->"bad"</SPAN ->. It's the configuration that lets it all happen or not.</P -><P -> If you download text files, you probably do not want these to be filtered, - particularly if the content is source code, or other critical content. Source - code sometimes might be mistaken for Javascript (i.e. the kind that might - open a pop-up window). It is recommended to turn off filtering for download - sites (particularly if the content may be plain text files and you are using - version 3.0.2 or earlier) in your <TT -CLASS="FILENAME" ->user.action</TT -> file. And - also, for any site or page where making <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->any</I -></SPAN -> changes at - all to the content is to be avoided.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> does not do FTP at all, only HTTP - and HTTPS (SSL) protocols.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DOWNLOADS2" ->4.22. I just downloaded a Perl script, and Privoxy -altered it! Yikes, what is wrong!</A -></H3 -><P -> Please read above.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="HOSTSFILE" ->4.23. Should I continue to use a <SPAN -CLASS="QUOTE" ->"HOSTS"</SPAN -> file for ad-blocking?</A -></H3 -><P -> One time-tested technique to defeat common ads is to trick the local DNS - system by giving a phony IP address for the ad generator in the local - <TT -CLASS="FILENAME" ->HOSTS</TT -> file, typically using <TT -CLASS="LITERAL" ->127.0.0.1</TT ->, aka - <TT -CLASS="LITERAL" ->localhost</TT ->. This effectively blocks the ad.</P -><P -> There is no reason to use this technique in conjunction with - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - does essentially the same thing, much more elegantly and with much more - flexibility. A large <TT -CLASS="FILENAME" ->HOSTS</TT -> file, in fact, not only - duplicates effort, but may get in the way and seriously slow down your system. - It is recommended to remove such entries from your <TT -CLASS="FILENAME" ->HOSTS</TT -> file. If you think - your hosts list is neglected by <SPAN -CLASS="APPLICATION" ->Privoxy's </SPAN -> - configuration, consider adding your list to your <TT -CLASS="FILENAME" ->user.action</TT -> file:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { +block } - www.ad.example1.com - ad.example2.com - ads.galore.example.com - etc.example.com</PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="SEEALSO" ->4.24. Where can I find more information about Privoxy -and related issues?</A -></H3 -><P -> Other references and sites of interest to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - users:</P -><P -> <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->http://www.privoxy.org/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Home page. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/faq/" -TARGET="_top" ->http://www.privoxy.org/faq/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> FAQ. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/developer-manual/" -TARGET="_top" ->http://www.privoxy.org/developer-manual/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developer manual. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://sourceforge.net/projects/ijbswa/" -TARGET="_top" ->https://sourceforge.net/projects/ijbswa/</A ->, - the Project Page for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on - <A -HREF="http://sourceforge.net" -TARGET="_top" ->SourceForge</A ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A ->, - the web-based user interface. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> must be - running for this to work. Shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A -> - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://sourceforge.net/tracker/?group_id=11118&atid=460288" -TARGET="_top" ->https://sourceforge.net/tracker/?group_id=11118&atid=460288</A ->, to submit <SPAN -CLASS="QUOTE" ->"misses"</SPAN -> and other - configuration related suggestions to the developers. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - - - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.junkbusters.com/ht/en/cookies.html" -TARGET="_top" ->http://www.junkbusters.com/ht/en/cookies.html</A ->, - an explanation how cookies are used to track web users. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.junkbusters.com/ijb.html" -TARGET="_top" ->http://www.junkbusters.com/ijb.html</A ->, - the original Internet Junkbuster. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.squid-cache.org/" -TARGET="_top" ->http://www.squid-cache.org/</A ->, a popular - caching proxy, which is often used together with <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.pps.jussieu.fr/~jch/software/polipo/" -TARGET="_top" ->http://www.pps.jussieu.fr/~jch/software/polipo/</A ->, - <SPAN -CLASS="APPLICATION" ->Polipo</SPAN -> is a caching proxy with advanced features - like pipelining, multiplexing and caching of partial instances. In many setups - it can be used as <SPAN -CLASS="APPLICATION" ->Squid</SPAN -> replacement. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://www.torproject.org/" -TARGET="_top" ->https://www.torproject.org/</A ->, - <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> can help anonymize web browsing, - web publishing, instant messaging, IRC, SSH, and other applications. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="MICROSUCK" ->4.25. I've noticed that Privoxy changes <SPAN -CLASS="QUOTE" ->"Microsoft"</SPAN -> to -<SPAN -CLASS="QUOTE" ->"MicroSuck"</SPAN ->! Why are you manipulating my browsing?</A -></H3 -><P -> We're not. The text substitutions that you are seeing are disabled - in the default configuration as shipped. You have either manually - activated the <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->fun</TT ->"</SPAN -> filter which - is clearly labeled <SPAN -CLASS="QUOTE" ->"Text replacements for subversive browsing - fun!"</SPAN -> or you are using an older Privoxy version and have implicitly - activated it by choosing the <SPAN -CLASS="QUOTE" ->"Advanced"</SPAN -> profile in the - web-based editor. Please upgrade.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="VALID" ->4.26. Does Privoxy produce <SPAN -CLASS="QUOTE" ->"valid"</SPAN -> HTML (or XHTML)?</A -></H3 -><P -> Privoxy generates HTML in both its own <SPAN -CLASS="QUOTE" ->"templates"</SPAN ->, and possibly - whenever there are text substitutions via a <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> filter. While this - should always conform to the HTML 4.01 specifications, it has not been - validated against this or any other standard. </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="configuration.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="trouble.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Configuration</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Troubleshooting</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/faq/trouble.html b/external/privoxy/doc/webserver/faq/trouble.html deleted file mode 100644 index 8bc5b70..0000000 --- a/external/privoxy/doc/webserver/faq/trouble.html +++ /dev/null @@ -1,1276 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Troubleshooting</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy Frequently Asked Questions" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Miscellaneous" -HREF="misc.html"><LINK -REL="NEXT" -TITLE="Contacting the developers, Bug Reporting and Feature Requests" -HREF="contact.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy Frequently Asked Questions</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="misc.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="contact.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="TROUBLE" ->5. Troubleshooting</A -></H1 -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN1084" ->5.1. I cannot connect to any websites. Or, I am getting -<SPAN -CLASS="QUOTE" ->"connection refused"</SPAN -> message with every web page. Why?</A -></H3 -><P -> There are several possibilities:</P -><P -><P -></P -><UL -><LI -><P -><SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is not running. Solution: verify - that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is installed correctly, has not crashed, and is indeed running. - Turn on <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> logging, and look at the logs to see what they say.</P -></LI -><LI -><P ->Or your browser is configured for a different port than what - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is using. Solution: verify that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - and your browser are set to the same port (<TT -CLASS="LITERAL" ->listen-address</TT ->).</P -></LI -><LI -><P ->Or if using a forwarding rule, you have a configuration problem or a - problem with a host in the forwarding chain. Solution: temporarily alter your - configuration and take the forwarders out of the equation.</P -></LI -><LI -><P -> Or you have a firewall that is interfering and blocking you. Solution: - try disabling or removing the firewall as a simple test. - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="ERROR503" ->5.2. Why am I getting a 503 Error (WSAECONNREFUSED) on every page?</A -></H3 -><P -> More than likely this is a problem with your TCP/IP networking. ZoneAlarm has - been reported to cause this symptom -- even if not running! The solution is - to either fight the ZA configuration, or uninstall ZoneAlarm, and then find - something better behaved in its place. Other personal firewall type products - may cause similar type problems if not configured correctly. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="AEN1107" ->5.3. I just added a new rule, but the steenkin ad is -still getting through. How?</A -></H3 -><P -> 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 <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - will not be involved. Flush the browser's caches, and then try again.</P -><P -> 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 <A -HREF="http://config.privoxy.org/show-url-info" -TARGET="_top" ->http://config.privoxy.org/show-url-info</A -> - and see if it really matches your new rule. Blocking ads is like blocking - spam: a lot of tinkering is required to stay ahead of the game. And - remember you need to block the URL of the ad in question, which may be - entirely different from the site URL itself. Most ads are hosted on different - servers than the main site itself. If you right-click on the ad, you should - be able to get all the relevant information you need. Alternately, you can - find the correct URL by looking at <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> logs - (you may need to enable logging in the main config file if its disabled).</P -><P -> Below is a slightly modified real-life log snippet that originates with one - requested URL: <TT -CLASS="LITERAL" ->www.example.com</TT -> (name of site was changed - for this example, the number of requests is real). You can see in this the - complexity of what goes into making up this one <SPAN -CLASS="QUOTE" ->"page"</SPAN ->. There - are eight different domains involved here, with thirty two separate URLs - requested in all, making up all manner of images, Shockwave Flash, - JavaScript, CSS stylesheets, scripts, and other related content. Some of this - content is obviously <SPAN -CLASS="QUOTE" ->"good"</SPAN -> or <SPAN -CLASS="QUOTE" ->"bad"</SPAN ->, but not all. - Many of the more questionable looking requests, are going to outside domains - that seem to be identifying themselves with suspicious looking names, making - our job a little easier. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has <SPAN -CLASS="QUOTE" ->"crunched"</SPAN -> (meaning caught - and BLOCKED) quite a few items in this example, but perhaps missed a few as well. </P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->Request: www.example.com/ -Request: www.example.com/favicon.ico -Request: img.example.com/main.css -Request: img.example.com/sr.js -Request: example.betamarker.com/example.html -Request: www.lik-sang.com/Banners/bestsellers/skyscraper.php?likref=BSellers -Request: img.example.com/pb.png -Request: www.google-analytics.com/urchin.js crunch! (Blocked) -Request: www.advertising-department.com/ats/switch.ps.php?26856 crunch! (Blocked) -Request: img.example.com/p.gif -Request: www.popuptraffic.com/assign.php?l=example&mode=behind crunch! (Blocked) -Request: www.popuptraffic.com/scripts/popup.php?hid=5c3cf&tmpl=PBa.tmpl crunch! (Blocked) -Request: www.popuptraffic.com/assign.php?l=example crunch! (Blocked) -Request: www.lik-sang.com/Banners/best_sellers/best_sellers.css -Request: www.adtrak.net/adx.js crunch! (Blocked) -Request: img.example.com/hbg.gif -Request: img.example.com/example.jpg -Request: img.example.com/mt.png -Request: img.example.com/mm.png -Request: img.example.com/mb.png -Request: www.popuptraffic.com/scripts/popup.php?hid=a71b91fa5&tmpl=Ua.tmp crunch! (Blocked) -Request: www.example.com/tracker.js -Request: www.lik-sang.com/Banners/best_sellers/lsi_head.gif -Request: www.adtrak.net/adjs.php?n=020548130&what=zone:61 crunch! (Blocked) -Request: www.adtrak.net/adjs.php?n=463594413&what=zone:58&source=Ua crunch! (Blocked) -Request: www.lik-sang.com/Banners/best_sellers/bottomani.swf -Request: mmm.elitemediagroup.net/install.php?allowpop=no&popupmincook=0&allowsp2=1 crunch! (Blocked) -Request: www.example.com/tracker.js?screen=1400x1050&win=962x693 -Request: www.adtrak.net/adlog.php?bannerid=1309&clientid=439&zoneid=61 crunch! (Blocked) -Request: 66.70.21.80/scripts/click.php?hid=5c3cf599a9efd0320d26&si -Request: 66.70.21.80/img/pixel.gif -Request: www.adtrak.net/adlog.php?bannerid=1309&clientid=439&zoneid=58&source=Ua&block=86400 crunch! (Blocked) -Request: 66.70.21.80/scripts/click.php?hid=a71b9f6504b0c5681fa5&si=Ua</PRE -></TD -></TR -></TABLE -></P -><P -> Despite 12 out of 32 requests being blocked, the page looked, and seemed to - behave perfectly <SPAN -CLASS="QUOTE" ->"normal"</SPAN -> (minus some ads, of course).</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="BADSITE" ->5.4. One of my favorite sites does not work with Privoxy. -What can I do?</A -></H3 -><P -> First verify that it is indeed a <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> problem, - by toggling off <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> through <A -HREF="http://config.privoxy.org/toggle" -TARGET="_top" ->http://config.privoxy.org/toggle</A -> - (the toggle feature may need to be enabled in the main - <TT -CLASS="FILENAME" ->config</TT ->), - and then shift-reloading the problem page (i.e. holding down the shift key - while clicking reload. Alternatively, flush your browser's disk and memory - caches).</P -><P -> If the problem went away, we know we have a configuration related problem. - Now go to <A -HREF="http://config.privoxy.org/show-url-info" -TARGET="_top" ->http://config.privoxy.org/show-url-info</A -> - and paste the full URL of the page in question into the prompt. See which - actions are being applied to the URL, and which matches in which actions - files are responsible for that. It might be helpful also to look at your logs - for this site too, to see what else might be happening (note: logging may need - to be enabled in the main config file). Many sites are - complex and require a number of related pages to help present their content. - Look at what else might be used by the page in question, and what of that - might be <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->required</I -></SPAN ->. - Now, armed with this information, go to - <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A -> - and select the appropriate actions files for editing. </P -><P -> You can now either look for a section which disables the actions that - you suspect to cause the problem and add a pattern for your site there, - or make up a completely new section for your site. In any case, the recommended - way is to disable only the prime suspect, reload the problem page, and only - if the problem persists, disable more and more actions until you have - identified the culprit. You may or may not want to turn the other actions - on again. Remember to flush your browser's caches in between any such changes!</P -><P -> Alternately, if you are comfortable with a text editor, you can accomplish - the same thing by editing the appropriate actions file. Probably the easiest - way to deal with such problems when editing by hand is to add your - site to a <TT -CLASS="LITERAL" ->{ fragile }</TT -> section in <TT -CLASS="FILENAME" ->user.action</TT ->, - which is an alias that turns off most <SPAN -CLASS="QUOTE" ->"dangerous"</SPAN -> - actions, but is also likely to turn off more actions then needed, and thus lower - your privacy and protection more than necessary, </P -><P -> Troubleshooting actions is discussed in more detail in the <A -HREF="../user-manual/appendix.html#ACTIONSANAT" -TARGET="_top" ->User Manual appendix, - Troubleshooting: the Anatomy of an Action</A ->. - There is also an <A -HREF="../user-manual/actions-file.html#ACT-EXAMPLES" -TARGET="_top" ->actions tutorial</A -> - with general configuration information and examples.</P -><P -> As a last resort, you can always see if your browser has a setting that will - bypass the proxy setting for selective sites. Modern browsers can do this.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DUN" ->5.5. After installing Privoxy, I have to log in -every time I start IE. What gives?</A -></H3 -><P -> This is a quirk that effects the installation of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, in conjunction with Internet Explorer and - Internet Connection Sharing on Windows 2000 and Windows XP. The symptoms may - appear to be corrupted or invalid DUN settings, or passwords.</P -><P -> When setting up an NT based Windows system with - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> you may find that things do not seem to be - doing what you expect. When you set your system up you will probably have set - up Internet Connection Sharing (ICS) with Dial up Networking (DUN) when - logged in with administrator privileges. You will probably have made this DUN - connection available to other accounts that you may have set-up on your - system. E.g. Mum or Dad sets up the system and makes accounts suitably - configured for the kids.</P -><P -> When setting up <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in this environment you - will have to alter the proxy set-up of Internet Explorer (IE) for the - specific DUN connection on which you wish to use - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. When you do this the ICS DUN set-up - becomes user specific. In this instance you will see no difference if you - change the DUN connection under the account used to set-up the connection. - However when you do this from another user you will notice that the DUN - connection changes to make available to "Me only". You will also find that - you have to store the password under each different user!</P -><P -> The reason for this is that each user's set-up for IE is user specific. Each - set-up DUN connection and each LAN connection in IE store the settings for - each user individually. As such this enforces individual configurations - rather than common ones. Hence the first time you use a DUN connection after - re-booting your system it may not perform as you expect, and prompt you for - the password. Just set and save the password again and all should be OK.</P -><P ->[Thanks to Ray Griffith for this submission.]</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="FTP" ->5.6. I cannot connect to any FTP sites. Privoxy - is blocking me.</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> cannot act as a proxy for FTP traffic, - so do not configure your browser to use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - as an FTP proxy. The same is true for <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->any protocol other than HTTP - or HTTPS (SSL)</I -></SPAN ->. - </P -><P -> Most browsers understand FTP as well as HTTP. If you connect to a site, with - a URL like <TT -CLASS="LITERAL" ->ftp://ftp.example.com</TT ->, your browser is making - an FTP connection, and not a HTTP connection. So while your browser may - speak FTP, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> does not, and cannot proxy - such traffic. - </P -><P -> To complicate matters, some systems may have a generic <SPAN -CLASS="QUOTE" ->"proxy"</SPAN -> - setting, which will enable various protocols, including - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN -> HTTP and FTP proxying! So it is possible to - accidentally enable FTP proxying in these cases. And of course, if this - happens, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will indeed cause problems since - it does not know FTP. Newer version will give a sane error - message if a FTP connection is attempted. Just disable the FTP setting - and all will be well again. - </P -><P -> Will <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> ever proxy FTP traffic? Unlikely. - There just is not much reason, and the work to make this happen is more than - it may seem. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="MACOSXIE" ->5.7. In Mac OS X, I can't configure Microsoft Internet Explorer to use - Privoxy as the HTTP proxy.</A -></H3 -><P -> Microsoft Internet Explorer (in versions like 5.1) respects system-wide - network settings. In order to change the HTTP proxy, open System - Preferences, and click on the Network icon. In the settings pane that - comes up, click on the Proxies tab. Ensure the "Web Proxy (HTTP)" checkbox - is checked and enter <TT -CLASS="LITERAL" ->127.0.0.1</TT -> in the entry field. - Enter <TT -CLASS="LITERAL" ->8118</TT -> in the Port field. The next time you start - IE, it should reflect these values. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="MACOSXUNINSTALL" ->5.8. In Mac OS X, I dragged the Privoxy folder to the trash in order to - uninstall it. Now the finder tells me I don't have sufficient privileges to - empty the trash.</A -></H3 -><P -> Note: This ONLY applies to privoxy 3.0.6 and earlier. - </P -><P -> Just dragging the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> folder to the trash is - not enough to delete it. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> supplies an - <SPAN -CLASS="APPLICATION" ->uninstall.command</SPAN -> file that takes care of - these details. Open the trash, drag the <SPAN -CLASS="APPLICATION" ->uninstall.command</SPAN -> - file out of the trash and double-click on it. You will be prompted for - confirmation and the administration password. - </P -><P -> The trash may still appear full after this command; emptying the trash - from the desktop should make it appear empty again. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="MACOSXIMAGES" ->5.9. In Mac OS X Panther (10.3), images often fail to load and/or I - experience random delays in page loading. I'm using - <TT -CLASS="LITERAL" ->localhost</TT -> as my browser's proxy setting.</A -></H3 -><P -> We believe this is due to an IPv6-related bug in Mac OS X, but don't fully - understand the issue yet. In any case, changing the proxy setting to - <TT -CLASS="LITERAL" ->127.0.0.1</TT -> instead of <TT -CLASS="LITERAL" ->localhost</TT -> - works around the problem. - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="BLANKPAGE" ->5.10. I get a completely blank page at one site. <SPAN -CLASS="QUOTE" ->"View Source"</SPAN -> - shows only: <SPAN -CLASS="MARKUP" -><html><body></body></html></SPAN ->. Without - Privoxy the page loads fine.</A -></H3 -><P -> Chances are that the site suffers from a bug in - <A -HREF="http://www.php.net/" -TARGET="_top" -><SPAN -CLASS="APPLICATION" ->PHP</SPAN -></A ->, - which results in empty pages being sent if the client explicitly requests - an uncompressed page, like <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> does. - This bug has been fixed in PHP 4.2.3. - </P -><P -> To find out if this is in fact the source of the problem, try adding - the site to a <TT -CLASS="LITERAL" ->-prevent-compression</TT -> section in - <TT -CLASS="FILENAME" ->user.action</TT ->: - </P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # Make exceptions for ill-behaved sites: - # - {-prevent-compression} - .example.com</PRE -></TD -></TR -></TABLE -><P -> If that works, you may also want to report the problem to the - site's webmasters, telling them to use zlib.output_compression - instead of ob_gzhandler in their PHP applications (workaround) - or upgrade to PHP 4.2.3 or later (fix). - </P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="NOHOSTNAME" ->5.11. My logs show many <SPAN -CLASS="QUOTE" ->"Unable to get my own hostname"</SPAN -> lines. -Why?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> tries to get the hostname of the system - its running on from the IP address of the system interface it is bound to - (from the <TT -CLASS="FILENAME" ->config</TT -> file - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->listen-address</I -></SPAN -> setting). If the system cannot supply - this information, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> logs this condition. </P -><P -> Typically, this would be considered a minor system configuration error. It is - not a fatal error to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> however, but may - result in a much slower response from <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on - some platforms due to DNS timeouts.</P -><P -> This can be caused by a problem with the local <TT -CLASS="FILENAME" ->hosts</TT -> - file. If this file has been changed from the original, try reverting it to - see if that helps. Make sure whatever name(s) are used for the local system, - that they resolve both ways.</P -><P -> You should also be able to work around the problem with the - <A -HREF="../user-manual/config.html#HOSTNAME" -TARGET="_top" ->hostname option</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="INUSE" ->5.12. When I try to launch Privoxy, I get an -error message <SPAN -CLASS="QUOTE" ->"port 8118 is already in use"</SPAN -> (or similar wording). -Why?</A -></H3 -><P -> Port 8118 is <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> default TCP - <SPAN -CLASS="QUOTE" ->"listening"</SPAN -> port. Typically this message would mean that there - is already one instance of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> running, and - your system is actually trying to start a second - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on the same port, which will not work. - (You can have multiple instances but they must be assigned different ports.) - How and why this might happen varies from platform to platform, but you need - to check your installation and start-up procedures.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DEMORONIZER" ->5.13. Pages with UTF-8 fonts are garbled.</A -></H3 -><P -> This is caused by the <SPAN -CLASS="QUOTE" ->"demoronizer"</SPAN -> filter. You should either - upgrade <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, or at least upgrade to the most - recent <TT -CLASS="FILENAME" ->default.action</TT -> file available from <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->SourceForge</A ->. - Or you can simply disable the demoronizer filter.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DEMORONIZER2" ->5.14. Why are binary files (such as images) corrupted when Privoxy - is used?</A -></H3 -><P -> This may also be caused by the <SPAN -CLASS="QUOTE" ->"demoronizer"</SPAN -> filter, - in conjunction with a web server that is misreporting the content type. Binary - files are exempted from <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> filtering - (unless the web server by mistake says the file is something else). Either - upgrade <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, or go to the most recent - <TT -CLASS="FILENAME" ->default.action</TT -> file available from <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->SourceForge</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DEMORONIZER3" ->5.15. What is the <SPAN -CLASS="QUOTE" ->"demoronizer"</SPAN -> and why is it there?</A -></H3 -><P -> The original demoronizer was a Perl script that cleaned up HTML pages which - were created with certain Microsoft products. MS has used proprietary extensions - to standardized font encodings (ISO 8859-1), which has caused problems for pages - that are viewed with non-Microsoft products (and are expecting to see a - standard set of fonts). The demoronizer corrected these errors so the pages - displayed correctly. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> borrowed from this - script, introducing a filter based on the original demoronizer, which in turn could - correct these errors on the fly. </P -><P -> But this is only needed in some situations, and will cause serious problems in some - other situations.</P -><P -> If you are using Microsoft products, you do not need it. If you need to view - pages with UTF-8 characters (such as Cyrillic or Chinese), then it will - cause corruption of the fonts, and thus <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->should not be on</I -></SPAN ->.</P -><P -> On the other hand, if you use non-Microsoft products, and you occasionally - notice weird characters on pages, you might want to try it.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="WINDOWOPEN" ->5.16. Why do I keep seeing <SPAN -CLASS="QUOTE" ->"PrivoxyWindowOpen()"</SPAN -> in raw source code?</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is attempting to disable malicious - <A -HREF="http://en.wikipedia.org/wiki/Javascript" -TARGET="_top" ->Javascript</A -> - in this case, with the <TT -CLASS="LITERAL" ->unsolicited-popups</TT -> - filter. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> cannot tell very well - <SPAN -CLASS="QUOTE" ->"good"</SPAN -> code snippets from <SPAN -CLASS="QUOTE" ->"bad"</SPAN -> code snippets.</P -><P -> If you see this in HTML source, and the page displays without problems, then - this is good, and likely some pop-up window was disabled. If you see this - where it is causing a problem, such as a downloaded program source code file, - then you should set an exception for this site or page such that the - integrity of the page stays in tact by disabling all filtering.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="DNSERRORS" ->5.17. I am getting too many DNS errors like <SPAN -CLASS="QUOTE" ->"404 No Such Domain"</SPAN ->. Why - can't Privoxy do this better?</A -></H3 -><P -> There are potentially several factors here. First of all, the DNS resolution - is done by the underlying operating system -- not - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> itself. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - merely initiates the process and hands it off, and then later reports - whatever the outcome was and tries to give a coherent message if there seems - to be a problem. In some cases, this might otherwise be mitigated by the - browser itself which might try some work-arounds and alternate approaches (e.g - adding <SPAN -CLASS="QUOTE" ->"www."</SPAN -> to the URL).</P -><P -> In other cases, if <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is being chained - with another proxy, this could complicate the issue, and cause undue - delays and timeouts. In the case of a <SPAN -CLASS="QUOTE" ->"socks4a"</SPAN -> proxy, the socks - server handles all the DNS. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> would just be - the <SPAN -CLASS="QUOTE" ->"messenger"</SPAN -> which is reporting whatever problem occurred - downstream, and not the root cause of the error.</P -><P -> In any case, versions newer than 3.0.3 include various improvements to help - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> better handle these cases.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="ALLCPU" ->5.18. At one site Privoxy just hangs, and starts taking - all CPU. Why is this?</A -></H3 -><P -> This is probably a manifestation of the <SPAN -CLASS="QUOTE" ->"100% cpu"</SPAN -> problem that - occurs on pages containing many (thousands upon thousands) of blank lines. The blank lines - are in the raw HTML source of the page, and the browser just ignores them. But the - pattern matching in <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> page filtering - mechanism is trying to match against absurdly long strings and this becomes - very CPU-intensive, taking a long, long time to complete.</P -><P -> Until a better solution comes along, disable filtering on these pages, - particularly the <TT -CLASS="LITERAL" ->js-annoyances</TT -> and - <TT -CLASS="LITERAL" ->unsolicited-popups</TT -> filters. If you run into this problem - with a recent <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version, please send a problem report.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="SLOWCRAWL" ->5.19. I just installed Privoxy, and all my -browsing has slowed to a crawl. What gives?</A -></H3 -><P -> This should not happen, and for the overwhelming number of users world-wide, - it does not happen. I would suspect some inadvertent interaction of software - components such as anti-virus software, spyware protectors, personal - firewalls or similar components. Try disabling (or uninstalling) these one - at a time and see if that helps. Either way, if you are using a - recent <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version, please report the problem.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="PREVENTCOMP" ->5.20. Why do my filters work on some sites but not on others?</A -></H3 -><P -> It's probably due to compression. It is a common practice for web servers to - send their content <SPAN -CLASS="QUOTE" ->"compressed"</SPAN -> in order to speed things up, and - then let the browser <SPAN -CLASS="QUOTE" ->"uncompress"</SPAN -> them. When compiled with zlib support - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can decompress content before filtering, otherwise you may want to enable -<A -HREF="../user-manual/actions-file.html#PREVENT-COMPRESSION" -TARGET="_top" ->prevent-compression</A ->.</P -><P -> As of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.9, zlib support is enabled in the default builds.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="SSL-WARNINGS" ->5.21. On some HTTPS sites my browser warns me about unauthenticated content, - the URL bar doesn't get highlighted and the lock symbol appears to be broken. - What's going on?</A -></H3 -><P -> Probably the browser is requesting ads through HTTPS and <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is blocking the requests. Privoxy's error messages are delivered - unencrypted and while it's obvious for the browser that the HTTPS - request is already blocked by the proxy, some warn about unauthenticated - content anyway.</P -><P -> To work around the problem you can redirect those requests to an invalid - local address instead of blocking them. While the redirects aren't - encrypted either, many browsers don't care. They simply follow the - redirect, fail to reach a server and display an error message instead - of the ad.</P -><P -> To do that, enable logging to figure out which requests get blocked by - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and add the hosts (no path patterns) to a section like this:</P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{+redirect{http://127.0.0.1:0/%7D -block -limit-connect} -.ivwbox.de:443/</PRE -></TD -></TR -></TABLE -></P -><P -> Additionally you have to configure your browser to contact - <SPAN -CLASS="QUOTE" ->"127.0.0.1:0"</SPAN -> directly (instead of through <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->).</P -><P -> To add a proxy exception in <SPAN -CLASS="APPLICATION" ->Mozilla Firefox</SPAN -> - open the <SPAN -CLASS="QUOTE" ->"Preferences"</SPAN ->, click the <SPAN -CLASS="QUOTE" ->"Settings"</SPAN -> - button located on the <SPAN -CLASS="QUOTE" ->"Network"</SPAN -> tab in the <SPAN -CLASS="QUOTE" ->"Advanced"</SPAN -> - section, and add <SPAN -CLASS="QUOTE" ->"127.0.0.1:0"</SPAN -> in the <SPAN -CLASS="QUOTE" ->"No Proxy for:"</SPAN -> - field.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="SE-LINUX" ->5.22. I get selinux error messages. How can I fix this?</A -></H3 -><P -> Please report the problem to the creator of your selinux policies.</P -><P -> The problem is that some selinux policy writers aren't familiar - with the application they are trying to <SPAN -CLASS="QUOTE" ->"secure"</SPAN -> and - thus create policies that make no sense.</P -><P -> In <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> case the problem usually - is that the policy only allows outgoing connections for certain - destination ports (e.g. 80 and 443). While this may cover the - standard ports, websites occasionally use other ports as well. - This isn't a security problem and therefore <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - default configuration doesn't block these requests.</P -><P -> If you really want to block these ports (and don't be able - to load websites that don't use standard ports), you should - configure Privoxy to block these ports as well, so it doesn't - trigger the selinux warnings.</P -></DIV -><DIV -CLASS="SECT2" -><H3 -CLASS="SECT2" -><A -NAME="GENTOO-RICERS" ->5.23. I compiled <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with Gentoo's portage and it appears to be very slow. Why?</A -></H3 -><P -> Probably you unintentionally compiled <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> without threading support - in which case requests have to be serialized and only one can be served - at the same time.</P -><P -> Check your <SPAN -CLASS="QUOTE" ->"USE"</SPAN -> flags and make sure they include - <SPAN -CLASS="QUOTE" ->"threads"</SPAN ->. If they don't, add the flag and rebuild <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->.</P -><P -> If you compiled <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with threading support (on POSIX-based systems), - the <SPAN -CLASS="QUOTE" ->"Conditional #defines"</SPAN -> section on <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A -> - will list <SPAN -CLASS="QUOTE" ->"FEATURE_PTHREAD"</SPAN -> as <SPAN -CLASS="QUOTE" ->"enabled"</SPAN ->. </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="misc.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="contact.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Miscellaneous</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Contacting the developers, Bug Reporting and Feature Requests</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/images/files-in-use.jpg b/external/privoxy/doc/webserver/images/files-in-use.jpg deleted file mode 100644 index 207b6f7..0000000 Binary files a/external/privoxy/doc/webserver/images/files-in-use.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/images/proxy_setup.jpg b/external/privoxy/doc/webserver/images/proxy_setup.jpg deleted file mode 100644 index 9e80f97..0000000 Binary files a/external/privoxy/doc/webserver/images/proxy_setup.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/index.html b/external/privoxy/doc/webserver/index.html deleted file mode 100644 index 3afc2d9..0000000 --- a/external/privoxy/doc/webserver/index.html +++ /dev/null @@ -1,328 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy - Home Page</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><META -NAME="KEYWORD" -CONTENT="privoxy"><META -NAME="KEYWORD" -CONTENT="HTTP"><META -NAME="KEYWORD" -CONTENT="proxy"><META -NAME="KEYWORD" -CONTENT="privacy"><META -NAME="KEYWORD" -CONTENT="popups"><META -NAME="KEYWORD" -CONTENT="po-ups"><META -NAME="KEYWORD" -CONTENT="HTML"><META -NAME="KEYWORD" -CONTENT="JavaScript"><META -NAME="KEYWORD" -CONTENT="cleaning"><META -NAME="KEYWORD" -CONTENT="blocking"><META -NAME="KEYWORD" -CONTENT="cleaner"><META -NAME="KEYWORD" -CONTENT="blocker"><META -NAME="KEYWORD" -CONTENT="filter"><META -NAME="KEYWORD" -CONTENT="proxy"><META -NAME="KEYWORD" -CONTENT="junk"><META -NAME="KEYWORD" -CONTENT="ad"><META -NAME="KEYWORD" -CONTENT="advertisement"><META -NAME="KEYWORD" -CONTENT="banner"><META -NAME="KEYWORD" -CONTENT="webbugs"><META -NAME="KEYWORD" -CONTENT="web-bugs"><META -NAME="KEYWORD" -CONTENT="werbung"><META -NAME="KEYWORD" -CONTENT="junkbusters"><META -NAME="KEYWORD" -CONTENT="junkbuster"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<meta name="description" content="Privoxy helps users to protect their privacy."> -<meta name="MSSmartTagsPreventParsing" content="TRUE"></HEAD -><BODY -CLASS="ARTICLE" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="ARTICLE" -><DIV -CLASS="TITLEPAGE" -><H1 -CLASS="TITLE" -><A -NAME="AEN2" ->Privoxy - Home Page</A -></H1 -><DIV -><DIV -CLASS="ABSTRACT" -><P -></P -><A -NAME="AEN28" -></A -><P -> Privoxy is a non-caching web proxy with advanced filtering capabilities - for enhancing privacy, modifying web page data and HTTP headers, controlling - access, and removing ads and other obnoxious Internet junk. Privoxy has a - flexible configuration and can be customized to suit individual needs and tastes. - It has application for both stand-alone systems and multi-user networks.</P -><P -> Privoxy is Free Software and licensed under the GPL2.</P -><P -> Privoxy is an associated project of Software in the Public Interest (SPI). - <A -HREF="http://www.privoxy.org/faq/general.html#DONATE" -TARGET="_top" ->Donations are welcome</A ->.</P -><P -> The most recent release is <A -HREF="announce.txt" -TARGET="_top" ->3.0.12 (stable)</A ->. - </P -><P -></P -></DIV -></DIV -><HR></DIV -><DIV -CLASS="SECT1" -><H3 -CLASS="SECT1" -><A -NAME="DOWNLOAD" ->Download</A -></H3 -><P -> <P -></P -><UL -><LI -><P -> <A -HREF="https://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->Download recent releases</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/quickstart.html" -TARGET="_top" ->Quickstart after installation</A -> - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT1" -><HR><H3 -CLASS="SECT1" -><A -NAME="DOCS" ->Documentation</A -></H3 -><P -> <P -></P -><UL -><LI -><P -> <A -HREF="user-manual/index.html" -TARGET="_top" ->User manual</A -> - </P -></LI -><LI -><P -> <A -HREF="faq/index.html" -TARGET="_top" ->Frequently Asked Questions</A -> - </P -></LI -><LI -><P -> <A -HREF="developer-manual/index.html" -TARGET="_top" ->Developer Manual</A -> - </P -></LI -><LI -><P -> <A -HREF="man-page/privoxy-man-page.html" -TARGET="_top" ->Classic Man Page</A -> - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT1" -><HR><H3 -CLASS="SECT1" -><A -NAME="MOREINFO" ->More information</A -></H3 -><P -> <P -></P -><UL -><LI -><P -> <A -HREF="user-manual/contact.html" -TARGET="_top" ->Support & Service</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/copyright.html" -TARGET="_top" ->Copyright, License, History & Authors</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/introduction.html#FEATURES" -TARGET="_top" ->List of (new) Features</A -> - </P -></LI -><LI -><P -> <A -HREF="https://sourceforge.net/projects/ijbswa/" -TARGET="_top" ->The project page</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/seealso.html" -TARGET="_top" ->Related links</A -> - </P -></LI -><LI -><P -> - - <A -HREF="http://privoxy.org/team/index.html" -TARGET="_top" ->Pictures of the Privoxy Team</A -> - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT1" -><HR><H2 -CLASS="SECT1" -><A -NAME="AEN83" -></A -></H2 -><P -><DIV -CLASS="INFORMALTABLE" -><P -></P -><A -NAME="AEN86" -></A -><TABLE -BORDER="0" -FRAME="void" -RULES="all" -WIDTH="100%" -CLASS="CALSTABLE" -><COL -WIDTH="100%" -ALIGN="CENTER" -TITLE="C1"><TBODY -><TR -><TD -ALIGN="CENTER" ->Privoxy is developed on:</TD -></TR -><TR -><TD -ALIGN="CENTER" -> <A -HREF="http://sourceforge.net/" -TARGET="_top" -> <IMG -SRC="http://sourceforge.net/sflogo.php?group_id=11118&type=1&dummy=.gif%2... - </A -> - </TD -></TR -></TBODY -></TABLE -><P -></P -></DIV -></P -><P -> <SUB -> Copyright © 2001-2009 by Privoxy Developers - </SUB -></P -></DIV -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/man-page/privoxy-man-page.html b/external/privoxy/doc/webserver/man-page/privoxy-man-page.html deleted file mode 100644 index 91f045d..0000000 --- a/external/privoxy/doc/webserver/man-page/privoxy-man-page.html +++ /dev/null @@ -1,294 +0,0 @@ - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<HTML><HEAD><TITLE>Man page of PRIVOXY</TITLE> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="../p_doc.css"></HEAD><BODY> -<H1>PRIVOXY</H1> -Section: (1)<BR>Updated: 21 March 2009<BR><A HREF="#index">Index</A> -<HR> - -<A NAME="lbAB"> </A> -<H2>NAME</H2> - -privoxy - Privacy Enhancing Proxy -<A NAME="lbAC"> </A> -<H2>SYNOPSIS</H2> - -<P> -<B>privoxy</B> [<B>--help</B> ] [<B>--version</B> ] [<B>--no-daemon</B> ] [<B>--pidfile </B><I>pidfile</I><B></B> ] [<B>--user </B><I>user[.group]</I><B></B> ] [<B>--chroot</B> ] [<B>--pre-chroot-nslookup </B><I>hostname</I><B></B> ] [<B></B><I>configfile</I><B></B> ] -<P> -<A NAME="lbAD"> </A> -<H2>OPTIONS</H2> - -<P> - -<B>Privoxy</B> may be invoked with the following command line -options: -<DL COMPACT> -<DT><B>--help</B><DD> -Print brief usage info and exit. -<DT><B>--version</B><DD> -Print version info and exit. -<DT><B>--no-daemon</B><DD> -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. -<DT><B>--pidfile </B><I>pidfile</I><B></B><DD> -On startup, write the process ID to <I>pidfile</I>. -Delete the <I>pidfile</I> on exit. -Failure to create or delete the <I>pidfile</I> -is non-fatal. If no <B>--pidfile</B> option is given, no PID file will be used. -<DT><B>--user </B><I>user[.group]</I><B></B><DD> -After (optionally) writing the PID file, assume the user ID of -<I>user</I> and the GID of -<I>group</I>, or, if the optional -<I>group</I> was not given, the default group of -<I>user</I>. Exit if the privileges are not -sufficient to do so. -<DT><B>--chroot</B><DD> -Before changing to the user ID given in the --user option, chroot to -that user's home directory, i.e. make the kernel pretend to the -<B>Privoxy</B> process that the directory tree starts -there. If set up carefully, this can limit the impact of possible -vulnerabilities in <B>Privoxy</B> to the files contained in -that hierarchy. -<DT><B>--pre-chroot-nslookup </B><I>hostname</I><B></B><DD> -Initialize the resolver library using <I>hostname</I> -before chroot'ing. On some systems this reduces the number of files -that must be copied into the chroot tree. -</DL> -<P> - -If the <I>configfile</I> is not specified on the command line, -<B>Privoxy</B> will look for a file named -<I>config</I> in the current directory. If no -<I>configfile</I> is found, <B>Privoxy</B> will -fail to start. -<A NAME="lbAE"> </A> -<H2>DESCRIPTION</H2> - -<P> - -Privoxy is a non-caching web proxy with advanced filtering capabilities -for enhancing privacy, modifying web page data and HTTP headers, controlling -access, and removing ads and other obnoxious Internet junk. Privoxy has a -flexible configuration and can be customized to suit individual needs and tastes. -It has application for both stand-alone systems and multi-user networks. -<P> - -Privoxy is Free Software and licensed under the GPL2. -<A NAME="lbAF"> </A> -<H2>INSTALLATION AND USAGE</H2> - -<P> - -Browsers can either be individually configured to use -<B>Privoxy</B> as a HTTP proxy (recommended), -or <B>Privoxy</B> can be combined with a packet -filter to build an intercepting proxy -(see <I>config</I>). The default setting is for -localhost, on port 8118 (configurable in the main config file). To set the -HTTP proxy in Firefox, go through: <B>Tools</B>; -<B>Options</B>; <B>General</B>; -<B>Connection Settings</B>; -<B>Manual Proxy Configuration</B>. -<P> - -For Internet Explorer, go through: <B>Tools</B>; -<B>Internet Properties</B>; <B>Connections</B>; -<B>LAN Settings</B>. -<P> - -The Secure (SSL) Proxy should also be set to the same values, otherwise -https: URLs will not be proxied. Note: <B>Privoxy</B> can only -proxy HTTP and HTTPS traffic. Do not try it with FTP or other protocols. -HTTPS presents some limitations, and not all features will work with HTTPS -connections. -<P> - -For other browsers, check the documentation. -<A NAME="lbAG"> </A> -<H2>CONFIGURATION</H2> - -<P> - -<B>Privoxy</B> can be configured with the various configuration -files. The default configuration files are: <I>config</I>, -<I>default.filter</I>, <I>default.action</I> and -<I>default.action</I>. <I>user.action</I> should -be used for locally defined exceptions to the default rules in -<I>match-all.action</I> and <I>default.action</I>, -and <I>user.filter</I> for locally defined filters. These are -well commented. On Unix and Unix-like systems, these are located in -<I>/etc/privoxy/</I> by default. -<P> - -<B>Privoxy</B> uses the concept of <B>actions</B> -in order to manipulate the data stream between the browser and remote sites. -There are various actions available with specific functions for such things -as blocking web sites, managing cookies, etc. These actions can be invoked -individually or combined, and used against individual URLs, or groups of URLs -that can be defined using wildcards and regular expressions. The result is -that the user has greatly enhanced control and freedom. -<P> - -The actions list (ad blocks, etc) can also be configured with your -web browser at <A HREF="http://config.privoxy.org/">http://config.privoxy.org/</A> -(assuming the configuration allows it). -<B>Privoxy's</B> configuration parameters can also be viewed at -the same page. In addition, <B>Privoxy</B> can be toggled on/off. -This is an internal page, and does not require Internet access. -<P> - -See the <I>User Manual</I> for a detailed -explanation of installation, general usage, all configuration options, new -features and notes on upgrading. -<A NAME="lbAH"> </A> -<H2>FILES</H2> - -<P> -<PRE> - - <I>/usr/sbin/privoxy</I> - <I>/etc/privoxy/config</I> - <I>/etc/privoxy/match-all.action</I> - <I>/etc/privoxy/default.action</I> - <I>/etc/privoxy/user.action</I> - <I>/etc/privoxy/default.filter</I> - <I>/etc/privoxy/user.filter</I> - <I>/etc/privoxy/trust</I> - <I>/etc/privoxy/templates/*</I> - <I>/var/log/privoxy/logfile</I> -</PRE> - -<P> - -Various other files should be included, but may vary depending on platform -and build configuration. Additional documentation should be included in the local -documentation directory. -<A NAME="lbAI"> </A> -<H2>SIGNALS</H2> - -<P> - -<B>Privoxy</B> terminates on the <B>SIGINT</B>, -<B>SIGTERM</B> and <B>SIGABRT</B> signals. Log -rotation scripts may cause a re-opening of the logfile by sending a -<B>SIGHUP</B> to <B>Privoxy</B>. Note that unlike -other daemons, <B>Privoxy</B> does not need to be made aware of -config file changes by <B>SIGHUP</B> -- it will detect them -automatically. -<A NAME="lbAJ"> </A> -<H2>NOTES</H2> - -<P> - -Please see the <I>User Manual</I> on how to contact the -developers, for feature requests, reporting problems, and other questions. -<A NAME="lbAK"> </A> -<H2>SEE ALSO</H2> - -<P> - -Other references and sites of interest to <B>Privoxy</B> -users: -<P> - -<P> -<A HREF="http://www.privoxy.org/">http://www.privoxy.org/,</A> -the <B>Privoxy</B> Home page. -<P> -<A HREF="http://www.privoxy.org/faq/">http://www.privoxy.org/faq/,</A> -the <B>Privoxy</B> FAQ. -<P> -<A HREF="http://www.privoxy.org/developer-manual/">http://www.privoxy.org/developer-manual/,</A> -the <B>Privoxy</B> developer manual. -<P> -<A HREF="https://sourceforge.net/projects/ijbswa/">https://sourceforge.net/projects/ijbswa/,</A> -the Project Page for <B>Privoxy</B> on -SourceForge. -<P> -<A HREF="http://config.privoxy.org/">http://config.privoxy.org/,</A> -the web-based user interface. <B>Privoxy</B> must be -running for this to work. Shortcut: <A HREF="http://p.p/">http://p.p/</A> -<P> -<A HREF="https://sourceforge.net/tracker/?group_id=11118">https://sourceforge.net/tracker/?group_id=11118</A>&atid=460288, to submit ``misses'' and other -configuration related suggestions to the developers. -<A NAME="lbAL"> </A> -<H2>DEVELOPMENT TEAM</H2> - -<P> -<PRE> - Fabian Keil, lead developer - David Schmidt, developer - - Hal Burgiss - Mark Miller - Gerry Murphy - Lee Rian - Roland Rosenfeld - Jörg Strohmayer -</PRE> - -<A NAME="lbAM"> </A> -<H2>COPYRIGHT AND LICENSE</H2> - -<A NAME="lbAN"> </A> -<H3>COPYRIGHT</H3> - -<P> - -Copyright (C) 2001-2009 by Privoxy Developers <<A HREF="mailto:ijbswa-developers@lists.sourceforge.net">ijbswa-developers@lists.sourceforge.net</A>> -<P> - -Some source code is based on code Copyright (C) 1997 by Anonymous Coders -and Junkbusters, Inc. and licensed under the <I>GNU General Public -License</I>. -<A NAME="lbAO"> </A> -<H3>LICENSE</H3> - -<P> - -<B>Privoxy</B> is free software; you can -redistribute it and/or modify it under the terms of the -<I>GNU General Public License</I>, version 2, -as published by the Free Software Foundation. -<P> - -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 <I>GNU General Public License</I> for details. -<P> - -You should have received a copy of the <I>GNU GPL</I> -along with this program; if not, write to the Free Software -Foundation, Inc. 51 Franklin Street, Fifth Floor -Boston, MA 02110-1301 -USA -<P> - -<HR> -<A NAME="index"> </A><H2>Index</H2> -<DL> -<DT><A HREF="#lbAB">NAME</A><DD> -<DT><A HREF="#lbAC">SYNOPSIS</A><DD> -<DT><A HREF="#lbAD">OPTIONS</A><DD> -<DT><A HREF="#lbAE">DESCRIPTION</A><DD> -<DT><A HREF="#lbAF">INSTALLATION AND USAGE</A><DD> -<DT><A HREF="#lbAG">CONFIGURATION</A><DD> -<DT><A HREF="#lbAH">FILES</A><DD> -<DT><A HREF="#lbAI">SIGNALS</A><DD> -<DT><A HREF="#lbAJ">NOTES</A><DD> -<DT><A HREF="#lbAK">SEE ALSO</A><DD> -<DT><A HREF="#lbAL">DEVELOPMENT TEAM</A><DD> -<DT><A HREF="#lbAM">COPYRIGHT AND LICENSE</A><DD> -<DL> -<DT><A HREF="#lbAN">COPYRIGHT</A><DD> -<DT><A HREF="#lbAO">LICENSE</A><DD> -</DL> -</DL> -<HR> -This document was created by -man2html, -using the manual pages.<BR> -Time: 11:32:52 GMT, March 21, 2009 -</BODY> -</HTML> diff --git a/external/privoxy/doc/webserver/p_doc.css b/external/privoxy/doc/webserver/p_doc.css deleted file mode 100644 index 212610d..0000000 --- a/external/privoxy/doc/webserver/p_doc.css +++ /dev/null @@ -1,66 +0,0 @@ -/* - * CSS for Privoxy documentation - * - * $Id: p_doc.css,v 1.5 2006/09/09 19:13:42 hal9 Exp $ - */ - -/* - * Global fonts, colors, margins: - */ -body,td,th { font-family: arial, helvetica, sans-serif; } -body { margin: 4%; color: #000000; background-color: #eeeeee; } - -/* - * Headings hierarchy in terms of size and color: - */ -h1 { color: #4c000f; font-size: 160%; } -h2 { color: #660014; font-size: 140%; } -h3 { color: #820019; font-size: 120%; } -h4 { color: #99001d; font-size: 110%; } - -/* - * Make headings stand out: - * Indent all content in chapters, by additional 2%, - * and then pull the headings back left. - */ -div.sect1 { margin-left: 2%; } -h1,h2,h3,h4 {margin-left: -2%; } -h1.title { margin-left: 0; } -h2.subtitle { margin-left: 0; } - -/* - * Underlined links disturb the examples; - * Let them get darker instead of purple after visited. - */ -a { text-decoration: none; } -a:link { color: #0c29ff; } -a:visited { color: #071899; } - -/* - * Special highlighting: - * Code examples in embedded in the text flow become half-bold, - * Emphasis gets h4-red. - * Warnings get the same bg as in privoxy.css - */ -tt.literal { font-weight: 600; } -i.emphasis { color: #99001d; } -table.warning { border: 0; background-color: #ffdddd;} -span.guibutton { - white-space: nowrap; - width: auto; - padding: 2px; - background-color: #dddddd; - color: #000000; - text-decoration: none; - border-top: 1px solid #ffffff; - border-left: 1px solid #ffffff; - border-bottom: 1px solid #000000; - border-right: 1px solid #000000; -} - -/* - * Misc: - */ -ul { list-style-type: square; } -/* Privoxy, of course */ -.application {font-weight: bold; font-size:105%; color: #99001d;} diff --git a/external/privoxy/doc/webserver/p_feedback.css b/external/privoxy/doc/webserver/p_feedback.css deleted file mode 100644 index e0b70a7..0000000 --- a/external/privoxy/doc/webserver/p_feedback.css +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Vary the gereneral Privoxy Stlyesheet to - * meet the needs of small popups: - * - * $Id: p_feedback.css,v 1.4 2002/04/09 13:03:42 oes Exp $ - */ -body,td,th { font-size:10px; } -div.info { width: 60%; } -div.warning { width: 60%; text-align: left; } diff --git a/external/privoxy/doc/webserver/privoxy-index.html b/external/privoxy/doc/webserver/privoxy-index.html deleted file mode 100644 index 22cec35..0000000 --- a/external/privoxy/doc/webserver/privoxy-index.html +++ /dev/null @@ -1,283 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy - The Privacy Enhancing Proxy</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><META -NAME="KEYWORD" -CONTENT="privoxy"><META -NAME="KEYWORD" -CONTENT="HTTP"><META -NAME="KEYWORD" -CONTENT="proxy"><META -NAME="KEYWORD" -CONTENT="privacy"><META -NAME="KEYWORD" -CONTENT="popups"><META -NAME="KEYWORD" -CONTENT="po-ups"><META -NAME="KEYWORD" -CONTENT="HTML"><META -NAME="KEYWORD" -CONTENT="JavaScript"><META -NAME="KEYWORD" -CONTENT="cleaning"><META -NAME="KEYWORD" -CONTENT="blocking"><META -NAME="KEYWORD" -CONTENT="cleaner"><META -NAME="KEYWORD" -CONTENT="blocker"><META -NAME="KEYWORD" -CONTENT="filter"><META -NAME="KEYWORD" -CONTENT="proxy"><META -NAME="KEYWORD" -CONTENT="junk"><META -NAME="KEYWORD" -CONTENT="ad"><META -NAME="KEYWORD" -CONTENT="advertisement"><META -NAME="KEYWORD" -CONTENT="banner"><META -NAME="KEYWORD" -CONTENT="webbugs"><META -NAME="KEYWORD" -CONTENT="web-bugs"><META -NAME="KEYWORD" -CONTENT="werbung"><META -NAME="KEYWORD" -CONTENT="junkbusters"><META -NAME="KEYWORD" -CONTENT="junkbuster"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<meta name="description" content="Privoxy helps users to protect their privacy."> -<meta name="MSSmartTagsPreventParsing" content="TRUE"></HEAD -><BODY -CLASS="ARTICLE" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="ARTICLE" -><DIV -CLASS="TITLEPAGE" -><H1 -CLASS="TITLE" -><A -NAME="AEN2" ->Privoxy - The Privacy Enhancing Proxy</A -></H1 -><H2 -CLASS="SUBTITLE" ->Project Index Page v3.0.12</H2 -><DIV -><DIV -CLASS="ABSTRACT" -><P -></P -><A -NAME="AEN29" -></A -><P -> Privoxy is a non-caching web proxy with advanced filtering capabilities - for enhancing privacy, modifying web page data and HTTP headers, controlling - access, and removing ads and other obnoxious Internet junk. Privoxy has a - flexible configuration and can be customized to suit individual needs and tastes. - It has application for both stand-alone systems and multi-user networks.</P -><P -> Privoxy is Free Software and licensed under the GPL2.</P -><P -> Privoxy is an associated project of Software in the Public Interest (SPI). - <A -HREF="http://www.privoxy.org/faq/general.html#DONATE" -TARGET="_top" ->Donations are welcome</A ->.</P -><P -></P -></DIV -></DIV -><HR></DIV -><DIV -CLASS="SECT1" -><H3 -CLASS="SECT1" -><A -NAME="DOWNLOAD" ->Download</A -></H3 -><P -> <P -></P -><UL -><LI -><P -> <A -HREF="https://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->Download recent releases</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/quickstart.html" -TARGET="_top" ->Quickstart after installation</A -> - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT1" -><HR><H3 -CLASS="SECT1" -><A -NAME="DOCS" ->Documentation</A -></H3 -><P -> <P -></P -><UL -><LI -><P -> <A -HREF="user-manual/index.html" -TARGET="_top" ->User manual</A -> - </P -></LI -><LI -><P -> <A -HREF="faq/index.html" -TARGET="_top" ->Frequently Asked Questions</A -> - </P -></LI -><LI -><P -> <A -HREF="developer-manual/index.html" -TARGET="_top" ->Developer Manual</A -> - </P -></LI -><LI -><P -> <A -HREF="man-page/privoxy-man-page.html" -TARGET="_top" ->Classic Man Page</A -> - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT1" -><HR><H3 -CLASS="SECT1" -><A -NAME="MOREINFO" ->More information</A -></H3 -><P -> <P -></P -><UL -><LI -><P -> <A -HREF="user-manual/contact.html" -TARGET="_top" ->Support & Service</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/copyright.html" -TARGET="_top" ->Copyright, License, History & Authors</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/introduction.html#FEATURES" -TARGET="_top" ->List of (new) Features</A -> - </P -></LI -><LI -><P -> <A -HREF="https://sourceforge.net/projects/ijbswa/" -TARGET="_top" ->The project page</A -> - </P -></LI -><LI -><P -> <A -HREF="user-manual/seealso.html" -TARGET="_top" ->Related links</A -> - </P -></LI -><LI -><P -> - - <A -HREF="http://privoxy.org/team/index.html" -TARGET="_top" ->Pictures of the Privoxy Team</A -> - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="SECT1" -><HR><H2 -CLASS="SECT1" -><A -NAME="AEN82" -></A -></H2 -><P -> <SUB -> Copyright © 2001-2009 by Privoxy Developers - </SUB -></P -></DIV -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/privoxy.css b/external/privoxy/doc/webserver/privoxy.css deleted file mode 100644 index b08cc4d..0000000 --- a/external/privoxy/doc/webserver/privoxy.css +++ /dev/null @@ -1,69 +0,0 @@ -/* - * CSS for Privoxy CGI and script output - * - * $Id: privoxy.css,v 1.2 2002/04/09 11:55:20 oes Exp $ - */ - -/* - * General rules: Font, Color, Headings, Margins, Links - */ -body,td,th { font-family: arial, helvetica, helv, sans-serif; } -body { background-color: #ffffff; color: #000000; } - -h1 { font-size: 140%; margin: 0px; } -h2 { font-size: 120%; margin: 0px; } -h3 { font-size: 110%; margin: 0px; } - -p,pre { margin-left: 15px; } -li { margin: 2px 15px; } -dl { margin: 2px 15px; } - -a:link { color: #0000dd; text-decoration: none; } -a:visited { color: #330099; text-decoration: none; } -a:active { color: #3333ff; text-decoration: none; } - -/* - * Boxen as Table elements: - */ -td.title { border: solid black 1px; background-color: #dddddd; } -td.box { border: solid black 1px; background-color: #eeeeee; } -td.info { border: solid black 1px; background-color: #ccccff; } -td.warning { border: solid black 1px; background-color: #ffdddd; } - -/* - * Special Table Boxen: for nesting, naked container and for - * the Status field in CGI Output: - */ -td.wrapbox { border: solid black 1px; padding: 5px; } -td.container { padding: 0px; } -td.status { border: solid black 1px; background-color: #ff0000; color: #ffffff; font-size: 300%; font-weight: bolder; } - -/* - * Same Boxen as <div>s: - */ -div.title { border: solid black 1px; background-color: #dddddd; margin: 20px; padding: 20px; } -div.box { border: solid black 1px; background-color: #eeeeee; margin: 20px; padding: 20px; } -div.info { border: solid black 1px; background-color: #ccccff; margin: 20px; padding: 20px; } -div.warning { border: solid black 1px; background-color: #ffdddd; margin: 20px; padding: 20px; } -div.wrapbox { border: solid black 1px; margin: 20px; padding: 5px; } - - -/* - * Bold definitions in <dl>s, Grey BG for Table headings - */ -dt { font-weight: bold; } -th { background-color: #dddddd; } - -/* - * Special purpose paragraphs: Small for page footers, - * Important for quoting wrong or dangerous examples, - * Whiteframed for the toggle?mini=y CGI - */ -p.small { font-size: 10px; margin: 0px; } -p.important { border: solid black 1px; background-color: #ffdddd; font-weight: bold; padding: 2px; } -p.whiteframed { margin: 5px; padding: 5px; border: solid black 1px; text-align: center; background-color: #eeeeee; } - -/* - * Special red emphasis: - */ -em.warning { color: #ff0000 } diff --git a/external/privoxy/doc/webserver/robots.txt b/external/privoxy/doc/webserver/robots.txt deleted file mode 100644 index a9941db..0000000 --- a/external/privoxy/doc/webserver/robots.txt +++ /dev/null @@ -1,17 +0,0 @@ -# This is the Privoxy web site. -# -# If the robot is connecting through Privoxy, 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 Privoxy, the -# one "Privoxy is not working" page there is not very -# interesting. - -User-agent: * -Disallow: /config/ -Disallow: /actions/ -Disallow: /submit/ - - - diff --git a/external/privoxy/doc/webserver/team/01stefanw.jpg b/external/privoxy/doc/webserver/team/01stefanw.jpg deleted file mode 100644 index 920dece..0000000 Binary files a/external/privoxy/doc/webserver/team/01stefanw.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/01stefanw_t.jpg b/external/privoxy/doc/webserver/team/01stefanw_t.jpg deleted file mode 100644 index 5a90642..0000000 Binary files a/external/privoxy/doc/webserver/team/01stefanw_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/02jon.jpg b/external/privoxy/doc/webserver/team/02jon.jpg deleted file mode 100644 index 136b2dd..0000000 Binary files a/external/privoxy/doc/webserver/team/02jon.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/02jon_t.jpg b/external/privoxy/doc/webserver/team/02jon_t.jpg deleted file mode 100644 index 32e470b..0000000 Binary files a/external/privoxy/doc/webserver/team/02jon_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/03andreas.jpg b/external/privoxy/doc/webserver/team/03andreas.jpg deleted file mode 100644 index 78dc102..0000000 Binary files a/external/privoxy/doc/webserver/team/03andreas.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/03andreas_t.jpg b/external/privoxy/doc/webserver/team/03andreas_t.jpg deleted file mode 100644 index e23f580..0000000 Binary files a/external/privoxy/doc/webserver/team/03andreas_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/04rodney.jpg b/external/privoxy/doc/webserver/team/04rodney.jpg deleted file mode 100644 index bb4e02d..0000000 Binary files a/external/privoxy/doc/webserver/team/04rodney.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/04rodney_t.jpg b/external/privoxy/doc/webserver/team/04rodney_t.jpg deleted file mode 100644 index bba4f15..0000000 Binary files a/external/privoxy/doc/webserver/team/04rodney_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/05david.jpg b/external/privoxy/doc/webserver/team/05david.jpg deleted file mode 100644 index 429723f..0000000 Binary files a/external/privoxy/doc/webserver/team/05david.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/05david_t.jpg b/external/privoxy/doc/webserver/team/05david_t.jpg deleted file mode 100644 index c04aa55..0000000 Binary files a/external/privoxy/doc/webserver/team/05david_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/05member.jpg b/external/privoxy/doc/webserver/team/05member.jpg deleted file mode 100644 index 97042aa..0000000 Binary files a/external/privoxy/doc/webserver/team/05member.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/05member_t.jpg b/external/privoxy/doc/webserver/team/05member_t.jpg deleted file mode 100644 index c9ffd9b..0000000 Binary files a/external/privoxy/doc/webserver/team/05member_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/06member.jpg b/external/privoxy/doc/webserver/team/06member.jpg deleted file mode 100644 index 97042aa..0000000 Binary files a/external/privoxy/doc/webserver/team/06member.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/06member_t.jpg b/external/privoxy/doc/webserver/team/06member_t.jpg deleted file mode 100644 index c9ffd9b..0000000 Binary files a/external/privoxy/doc/webserver/team/06member_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/07member.jpg b/external/privoxy/doc/webserver/team/07member.jpg deleted file mode 100644 index 97042aa..0000000 Binary files a/external/privoxy/doc/webserver/team/07member.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/07member_t.jpg b/external/privoxy/doc/webserver/team/07member_t.jpg deleted file mode 100644 index c9ffd9b..0000000 Binary files a/external/privoxy/doc/webserver/team/07member_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/08member.jpg b/external/privoxy/doc/webserver/team/08member.jpg deleted file mode 100644 index 97042aa..0000000 Binary files a/external/privoxy/doc/webserver/team/08member.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/08member_t.jpg b/external/privoxy/doc/webserver/team/08member_t.jpg deleted file mode 100644 index c9ffd9b..0000000 Binary files a/external/privoxy/doc/webserver/team/08member_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/20member.jpg b/external/privoxy/doc/webserver/team/20member.jpg deleted file mode 100644 index 97042aa..0000000 Binary files a/external/privoxy/doc/webserver/team/20member.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/20member_t.jpg b/external/privoxy/doc/webserver/team/20member_t.jpg deleted file mode 100644 index c9ffd9b..0000000 Binary files a/external/privoxy/doc/webserver/team/20member_t.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/team/index.html b/external/privoxy/doc/webserver/team/index.html deleted file mode 100644 index 2903bcf..0000000 --- a/external/privoxy/doc/webserver/team/index.html +++ /dev/null @@ -1,26 +0,0 @@ -<html> - <head> - <meta http-equiv="Content-Type"content="text/html; charset=iso-8859-1"> - <title>Privoxy - Team Photos</title> - <link rel="stylesheet" type="text/css" href="../p_doc.css"> - </head> - <body> - <h1 style="margin-left: 0%">Privoxy - Team Photos</h1> - <hr> - <p>In our day jobs, we're all models ;-)</p> - <table align="center"> - <tr> - <td><a href="01stefanw.jpg"><img src="01stefanw_t.jpg" width="80" height="80" border="0" title="Stefan Waldherr"></a></td> - <td><a href="02jon.jpg"><img src="02jon_t.jpg" width="80" height="80" border="0" title="Jon Foster"></a></td> - <td><a href="03andreas.jpg"><img src="03andreas_t.jpg" width="80" height="80" border="0" title="Andreas Oesterhelt"></a></td> - <td><a href="04rodney.jpg"><img src="04rodney_t.jpg" width="80" height="80" border="0" title="Rodney Stromlund"></a></td> - </tr> - <tr> - <td><a href="05david.jpg"><img src="05david_t.jpg" width="80" height="80" border="0" title="David Schmidt"></a></td> - <td><a href="06member.jpg"><img src="06member_t.jpg" width="80" height="80" border="0" title="N/A"></a></td> - <td><a href="07member.jpg"><img src="07member_t.jpg" width="80" height="80" border="0" title="N/A"></a></td> - <td><a href="08member.jpg"><img src="08member_t.jpg" width="80" height="80" border="0" title="N/A"></a></td> - </tr> - </table> - </body> -</html> diff --git a/external/privoxy/doc/webserver/user-manual/actions-file.html b/external/privoxy/doc/webserver/user-manual/actions-file.html deleted file mode 100644 index be87aa7..0000000 --- a/external/privoxy/doc/webserver/user-manual/actions-file.html +++ /dev/null @@ -1,8214 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Actions Files</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="The Main Configuration File" -HREF="config.html"><LINK -REL="NEXT" -TITLE="Filter Files" -HREF="filter-file.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="config.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="filter-file.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="ACTIONS-FILE" ->8. Actions Files</A -></H1 -><P -> The actions files are used to define what <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->actions</I -></SPAN -> - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> takes for which URLs, and thus determines - how ad images, cookies and various other aspects of HTTP content and - transactions are handled, and on which sites (or even parts thereof). - There are a number of such actions, with a wide range of functionality. - Each action does something a little different. - These actions give us a veritable arsenal of tools with which to exert - our control, preferences and independence. Actions can be combined so that - their effects are aggregated when applied against a given set of URLs.</P -><P -> There - are three action files included with <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with - differing purposes:</P -><P -> <P -></P -><UL -><LI -><P -> <TT -CLASS="FILENAME" ->match-all.action</TT -> - is used to define which - <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> relating to banner-blocking, images, pop-ups, - content modification, cookie handling etc should be applied by default. - It should be the first actions file loaded - </P -></LI -><LI -><P -> <TT -CLASS="FILENAME" ->default.action</TT -> - defines many exceptions (both - positive and negative) from the default set of actions that's configured - in <TT -CLASS="FILENAME" ->match-all.action</TT ->. It is a set of rules that should - work reasonably well as-is for most users. This file is only supposed to - be edited by the developers. It should be the second actions file loaded. - </P -></LI -><LI -><P -> <TT -CLASS="FILENAME" ->user.action</TT -> - is intended to be for local site - preferences and exceptions. As an example, if your ISP or your bank - has specific requirements, and need special handling, this kind of - thing should go here. This file will not be upgraded. - </P -></LI -><LI -><P -> <SPAN -CLASS="GUIBUTTON" ->Edit</SPAN -> <SPAN -CLASS="GUIBUTTON" ->Set to Cautious</SPAN -> <SPAN -CLASS="GUIBUTTON" ->Set to Medium</SPAN -> <SPAN -CLASS="GUIBUTTON" ->Set to Advanced</SPAN -> - </P -><P -> These have increasing levels of aggressiveness <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and have no - influence on your browsing unless you select them explicitly in the - editor</I -></SPAN ->. A default installation should be pre-set to - <TT -CLASS="LITERAL" ->Cautious</TT ->. New users should try this for a while before - adjusting the settings to more aggressive levels. The more aggressive - the settings, then the more likelihood there is of problems such as sites - not working as they should. - </P -><P -> The <SPAN -CLASS="GUIBUTTON" ->Edit</SPAN -> button allows you to turn each - action on/off individually for fine-tuning. The <SPAN -CLASS="GUIBUTTON" ->Cautious</SPAN -> - button changes the actions list to low/safe settings which will activate - ad blocking and a minimal set of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s features, and subsequently - there will be less of a chance for accidental problems. The - <SPAN -CLASS="GUIBUTTON" ->Medium</SPAN -> button sets the list to a medium level of - other features and a low level set of privacy features. The - <SPAN -CLASS="GUIBUTTON" ->Advanced</SPAN -> button sets the list to a high level of - ad blocking and medium level of privacy. See the chart below. The latter - three buttons over-ride any changes via with the - <SPAN -CLASS="GUIBUTTON" ->Edit</SPAN -> button. More fine-tuning can be done in the - lower sections of this internal page. - </P -><P -> While the actions file editor allows to enable these settings in all - actions files, they are only supposed to be enabled in the first one - to make sure you don't unintentionally overrule earlier rules. - </P -><P -> The default profiles, and their associated actions, as pre-defined in - <TT -CLASS="FILENAME" ->default.action</TT -> are: - </P -><P -> <DIV -CLASS="TABLE" -><A -NAME="AEN2189" -></A -><P -><B ->Table 1. Default Configurations</B -></P -><TABLE -BORDER="1" -FRAME="border" -RULES="all" -CLASS="CALSTABLE" -><COL -WIDTH="1*" -TITLE="C1"><COL -WIDTH="1*" -TITLE="C2"><COL -WIDTH="1*" -TITLE="C3"><COL -WIDTH="1*" -TITLE="C4"><THEAD -><TR -><TH ->Feature</TH -><TH ->Cautious</TH -><TH ->Medium</TH -><TH ->Advanced</TH -></TR -></THEAD -><TBODY -><TR -><TD ->Ad-blocking Aggressiveness</TD -><TD ->medium</TD -><TD ->high</TD -><TD ->high</TD -></TR -><TR -><TD ->Ad-filtering by size</TD -><TD ->no</TD -><TD ->yes</TD -><TD ->yes</TD -></TR -><TR -><TD ->Ad-filtering by link</TD -><TD ->no</TD -><TD ->no</TD -><TD ->yes</TD -></TR -><TR -><TD ->Pop-up killing</TD -><TD ->blocks only</TD -><TD ->blocks only</TD -><TD ->blocks only</TD -></TR -><TR -><TD ->Privacy Features</TD -><TD ->low</TD -><TD ->medium</TD -><TD ->medium/high</TD -></TR -><TR -><TD ->Cookie handling</TD -><TD ->none</TD -><TD ->session-only</TD -><TD ->kill</TD -></TR -><TR -><TD ->Referer forging</TD -><TD ->no</TD -><TD ->yes</TD -><TD ->yes</TD -></TR -><TR -><TD ->GIF de-animation</TD -><TD ->no</TD -><TD ->yes</TD -><TD ->yes</TD -></TR -><TR -><TD ->Fast redirects</TD -><TD ->no</TD -><TD ->no</TD -><TD ->yes</TD -></TR -><TR -><TD ->HTML taming</TD -><TD ->no</TD -><TD ->no</TD -><TD ->yes</TD -></TR -><TR -><TD ->JavaScript taming</TD -><TD ->no</TD -><TD ->no</TD -><TD ->yes</TD -></TR -><TR -><TD ->Web-bug killing</TD -><TD ->no</TD -><TD ->yes</TD -><TD ->yes</TD -></TR -><TR -><TD ->Image tag reordering</TD -><TD ->no</TD -><TD ->yes</TD -><TD ->yes</TD -></TR -></TBODY -></TABLE -></DIV -> - </P -></LI -></UL -></P -><P -> The list of actions files to be used are defined in the main configuration - file, and are processed in the order they are defined (e.g. - <TT -CLASS="FILENAME" ->default.action</TT -> is typically processed before - <TT -CLASS="FILENAME" ->user.action</TT ->). The content of these can all be viewed and - edited from <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A ->. - The over-riding principle when applying actions, is that the last action that - matches a given URL wins. The broadest, most general rules go first - (defined in <TT -CLASS="FILENAME" ->default.action</TT ->), - followed by any exceptions (typically also in - <TT -CLASS="FILENAME" ->default.action</TT ->), which are then followed lastly by any - local preferences (typically in <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->user</I -></SPAN -><TT -CLASS="FILENAME" ->.action</TT ->). - Generally, <TT -CLASS="FILENAME" ->user.action</TT -> has the last word. - </P -><P -> An actions file typically has multiple sections. If you want to use - <SPAN -CLASS="QUOTE" ->"aliases"</SPAN -> in an actions file, you have to place the (optional) - <A -HREF="actions-file.html#ALIASES" ->alias section</A -> at the top of that file. - Then comes the default set of rules which will apply universally to all - sites and pages (be <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->very careful</I -></SPAN -> with using such a - universal set in <TT -CLASS="FILENAME" ->user.action</TT -> or any other actions file after - <TT -CLASS="FILENAME" ->default.action</TT ->, because it will override the result - from consulting any previous file). And then below that, - exceptions to the defined universal policies. You can regard - <TT -CLASS="FILENAME" ->user.action</TT -> as an appendix to <TT -CLASS="FILENAME" ->default.action</TT ->, - with the advantage that it is a separate file, which makes preserving your - personal settings across <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> upgrades easier.</P -><P -> - Actions can be used to block anything you want, including ads, banners, or - just some obnoxious URL whose content 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), content can be modified, some JavaScripts tamed, user-tracking - fooled, and much more. See below for a <A -HREF="actions-file.html#ACTIONS" ->complete list - of actions</A ->.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN2288" ->8.1. Finding the Right Mix</A -></H2 -><P -> Note that some <A -HREF="actions-file.html#ACTIONS" ->actions</A ->, like cookie suppression - or script disabling, may render some sites unusable that rely on these - techniques to work properly. Finding the right mix of actions is not always easy and - certainly a matter of personal taste. And, things can always change, requiring - refinements in the configuration. In general, it can be said that the more - <SPAN -CLASS="QUOTE" ->"aggressive"</SPAN -> your default settings (in the top section of the - actions file) are, the more exceptions for <SPAN -CLASS="QUOTE" ->"trusted"</SPAN -> sites you - will have to make later. If, for example, you want to crunch all cookies per - default, you'll have to make exceptions from that rule for sites that you - regularly use and that require cookies for actually useful purposes, like maybe - your bank, favorite shop, or newspaper.</P -><P -> We have tried to provide you with reasonable rules to start from in the - distribution actions files. But there is no general rule of thumb on these - things. There just are too many variables, and sites are constantly changing. - Sooner or later you will want to change the rules (and read this chapter again :).</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN2295" ->8.2. How to Edit</A -></H2 -><P -> The easiest way to edit the actions files is with a browser by - using our browser-based editor, which can be reached from <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A ->. - Note: the config file option <A -HREF="config.html#ENABLE-EDIT-ACTIONS" ->enable-edit-actions</A -> must be enabled for - this to work. The editor allows both fine-grained control over every single - feature on a per-URL basis, and easy choosing from wholesale sets of defaults - like <SPAN -CLASS="QUOTE" ->"Cautious"</SPAN ->, <SPAN -CLASS="QUOTE" ->"Medium"</SPAN -> or - <SPAN -CLASS="QUOTE" ->"Advanced"</SPAN ->. Warning: the <SPAN -CLASS="QUOTE" ->"Advanced"</SPAN -> setting is more - aggressive, and will be more likely to cause problems for some sites. - Experienced users only! - </P -><P -> If you prefer plain text editing to GUIs, you can of course also directly edit the - the actions files with your favorite text editor. Look at - <TT -CLASS="FILENAME" ->default.action</TT -> which is richly commented with many - good examples.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="ACTIONS-APPLY" ->8.3. How Actions are Applied to Requests</A -></H2 -><P -> Actions files are divided into sections. There are special sections, - like the <SPAN -CLASS="QUOTE" ->"<A -HREF="actions-file.html#ALIASES" ->alias</A ->"</SPAN -> sections which will - be discussed later. For now let's concentrate on regular sections: They have a - heading line (often split up to multiple lines for readability) which consist - of a list of actions, separated by whitespace and enclosed in curly braces. - Below that, there is a list of URL and tag patterns, each on a separate line.</P -><P -> To determine which actions apply to a request, the URL of the request is - compared to all URL patterns in each <SPAN -CLASS="QUOTE" ->"action file"</SPAN ->. - Every time it matches, the list of applicable actions for the request is - incrementally updated, using the heading of the section in which the - pattern is located. The same is done again for tags and tag patterns later on.</P -><P -> If multiple applying sections set the same action differently, - the last match wins. If not, the effects are aggregated. - E.g. a URL might match a regular section with a heading line of <TT -CLASS="LITERAL" ->{ - +<A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -> }</TT ->, - then later another one with just <TT -CLASS="LITERAL" ->{ - +<A -HREF="actions-file.html#BLOCK" ->block</A -> }</TT ->, resulting - in <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN -> actions to apply. And there may well be - cases where you will want to combine actions together. Such a section then - might look like:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { +<TT -CLASS="LITERAL" ->handle-as-image</TT -> +<TT -CLASS="LITERAL" ->block{Banner ads.}</TT -> } - # Block these as if they were images. Send no block page. - banners.example.com - media.example.com/.*banners - .example.com/images/ads/</PRE -></TD -></TR -></TABLE -> - </P -><P -> You can trace this process for URL patterns and any given URL by visiting <A -HREF="http://config.privoxy.org/show-url-info" -TARGET="_top" ->http://config.privoxy.org/show-url-info</A ->.</P -><P -> Examples and more detail on this is provided in the Appendix, <A -HREF="appendix.html#ACTIONSANAT" -> Troubleshooting: Anatomy of an Action</A -> section.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AF-PATTERNS" ->8.4. Patterns</A -></H2 -><P -> - As mentioned, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> uses <SPAN -CLASS="QUOTE" ->"patterns"</SPAN -> - to determine what <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->actions</I -></SPAN -> might apply to which sites and - pages your browser attempts to access. These <SPAN -CLASS="QUOTE" ->"patterns"</SPAN -> use wild - card type <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->pattern</I -></SPAN -> matching to achieve a high degree of - flexibility. This allows one expression to be expanded and potentially match - against many similar patterns.</P -><P -> Generally, an URL pattern has the form - <TT -CLASS="LITERAL" -><domain>/<path></TT ->, where both the - <TT -CLASS="LITERAL" -><domain></TT -> and <TT -CLASS="LITERAL" -><path></TT -> are - optional. (This is why the special <TT -CLASS="LITERAL" ->/</TT -> pattern matches all - URLs). Note that the protocol portion of the URL pattern (e.g. - <TT -CLASS="LITERAL" ->http://</TT ->) should <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not</I -></SPAN -> be included in - the pattern. This is assumed already!</P -><P -> The pattern matching syntax is different for the domain and path parts of - the URL. The domain part uses a simple globbing type matching technique, - while the path part uses more flexible - <A -HREF="http://en.wikipedia.org/wiki/Regular_expressions" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"Regular - Expressions"</SPAN -></A -> (POSIX 1003.2).</P -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT -><TT -CLASS="LITERAL" ->www.example.com/</TT -></DT -><DD -><P -> is a domain-only pattern and will match any request to <TT -CLASS="LITERAL" ->www.example.com</TT ->, - regardless of which document on that server is requested. So ALL pages in - this domain would be covered by the scope of this action. Note that a - simple <TT -CLASS="LITERAL" ->example.com</TT -> is different and would NOT match. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->www.example.com</TT -></DT -><DD -><P -> means exactly the same. For domain-only patterns, the trailing <TT -CLASS="LITERAL" ->/</TT -> may - be omitted. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->www.example.com/index.html</TT -></DT -><DD -><P -> matches all the documents on <TT -CLASS="LITERAL" ->www.example.com</TT -> - whose name starts with <TT -CLASS="LITERAL" ->/index.html</TT ->. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->www.example.com/index.html$</TT -></DT -><DD -><P -> matches only the single document <TT -CLASS="LITERAL" ->/index.html</TT -> - on <TT -CLASS="LITERAL" ->www.example.com</TT ->. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->/index.html$</TT -></DT -><DD -><P -> matches the document <TT -CLASS="LITERAL" ->/index.html</TT ->, regardless of the domain, - i.e. on <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->any</I -></SPAN -> web server anywhere. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->index.html</TT -></DT -><DD -><P -> matches nothing, since it would be interpreted as a domain name and - there is no top-level domain called <TT -CLASS="LITERAL" ->.html</TT ->. So its - a mistake. - </P -></DD -></DL -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="AEN2386" ->8.4.1. The Domain Pattern</A -></H3 -><P -> 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:</P -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT -><TT -CLASS="LITERAL" ->.example.com</TT -></DT -><DD -><P -> matches any domain with first-level domain <TT -CLASS="LITERAL" ->com</TT -> - and second-level domain <TT -CLASS="LITERAL" ->example</TT ->. - For example <TT -CLASS="LITERAL" ->www.example.com</TT ->, - <TT -CLASS="LITERAL" ->example.com</TT -> and <TT -CLASS="LITERAL" ->foo.bar.baz.example.com</TT ->. - Note that it wouldn't match if the second-level domain was <TT -CLASS="LITERAL" ->another-example</TT ->. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->www.</TT -></DT -><DD -><P -> matches any domain that <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->STARTS</I -></SPAN -> with - <TT -CLASS="LITERAL" ->www.</TT -> (It also matches the domain - <TT -CLASS="LITERAL" ->www</TT -> but most of the time that doesn't matter.) - </P -></DD -><DT -><TT -CLASS="LITERAL" ->.example.</TT -></DT -><DD -><P -> matches any domain that <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->CONTAINS</I -></SPAN -> <TT -CLASS="LITERAL" ->.example.</TT ->. - And, by the way, also included would be any files or documents that exist - within that domain since no path limitations are specified. (Correctly - speaking: It matches any FQDN that contains <TT -CLASS="LITERAL" ->example</TT -> as - a domain.) This might be <TT -CLASS="LITERAL" ->www.example.com</TT ->, - <TT -CLASS="LITERAL" ->news.example.de</TT ->, or - <TT -CLASS="LITERAL" ->www.example.net/cgi/testing.pl</TT -> for instance. All these - cases are matched. - </P -></DD -></DL -></DIV -><P -> Additionally, there are wild-cards that you can use in the domain names - themselves. These work similarly to shell globbing type wild-cards: - <SPAN -CLASS="QUOTE" ->"*"</SPAN -> represents zero or more arbitrary characters (this is - equivalent to the - <A -HREF="http://en.wikipedia.org/wiki/Regular_expressions" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"Regular - Expression"</SPAN -></A -> based syntax of <SPAN -CLASS="QUOTE" ->".*"</SPAN ->), - <SPAN -CLASS="QUOTE" ->"?"</SPAN -> represents any single character (this is equivalent to the - regular expression syntax of a simple <SPAN -CLASS="QUOTE" ->"."</SPAN ->), and you can define - <SPAN -CLASS="QUOTE" ->"character classes"</SPAN -> in square brackets which is similar to - the same regular expression technique. All of this can be freely mixed:</P -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT -><TT -CLASS="LITERAL" ->ad*.example.com</TT -></DT -><DD -><P -> matches <SPAN -CLASS="QUOTE" ->"adserver.example.com"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"ads.example.com"</SPAN ->, etc but not <SPAN -CLASS="QUOTE" ->"sfads.example.com"</SPAN -> - </P -></DD -><DT -><TT -CLASS="LITERAL" ->*ad*.example.com</TT -></DT -><DD -><P -> matches all of the above, and then some. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->.?pix.com</TT -></DT -><DD -><P -> matches <TT -CLASS="LITERAL" ->www.ipix.com</TT ->, - <TT -CLASS="LITERAL" ->pictures.epix.com</TT ->, <TT -CLASS="LITERAL" ->a.b.c.d.e.upix.com</TT -> etc. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->www[1-9a-ez].example.c*</TT -></DT -><DD -><P -> matches <TT -CLASS="LITERAL" ->www1.example.com</TT ->, - <TT -CLASS="LITERAL" ->www4.example.cc</TT ->, <TT -CLASS="LITERAL" ->wwwd.example.cy</TT ->, - <TT -CLASS="LITERAL" ->wwwz.example.com</TT -> etc., but <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not</I -></SPAN -> - <TT -CLASS="LITERAL" ->wwww.example.com</TT ->. - </P -></DD -></DL -></DIV -><P -> While flexible, this is not the sophistication of full regular expression based syntax.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="AEN2462" ->8.4.2. The Path Pattern</A -></H3 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> uses <SPAN -CLASS="QUOTE" ->"modern"</SPAN -> POSIX 1003.2 - <A -HREF="http://en.wikipedia.org/wiki/Regular_expressions" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"Regular - Expressions"</SPAN -></A -> for matching the path portion (after the slash), - and is thus more flexible.</P -><P -> There is an <A -HREF="appendix.html#REGEX" ->Appendix</A -> with a brief quick-start into regular - expressions, you also might want to have a look at your operating system's documentation - on regular expressions (try <TT -CLASS="LITERAL" ->man re_format</TT ->).</P -><P -> Note that the path pattern is automatically left-anchored at the <SPAN -CLASS="QUOTE" ->"/"</SPAN ->, - i.e. it matches as if it would start with a <SPAN -CLASS="QUOTE" ->"^"</SPAN -> (regular expression speak - for the beginning of a line).</P -><P -> Please also note that matching in the path is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->CASE INSENSITIVE</I -></SPAN -> - by default, but you can switch to case sensitive at any point in the pattern by using the - <SPAN -CLASS="QUOTE" ->"(?-i)"</SPAN -> switch: <TT -CLASS="LITERAL" ->www.example.com/(?-i)PaTtErN.*</TT -> will match - only documents whose path starts with <TT -CLASS="LITERAL" ->PaTtErN</TT -> in - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->exactly</I -></SPAN -> this capitalization.</P -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT -><TT -CLASS="LITERAL" ->.example.com/.*</TT -></DT -><DD -><P -> Is equivalent to just <SPAN -CLASS="QUOTE" ->".example.com"</SPAN ->, since any documents - within that domain are matched with or without the <SPAN -CLASS="QUOTE" ->".*"</SPAN -> - regular expression. This is redundant - </P -></DD -><DT -><TT -CLASS="LITERAL" ->.example.com/.*/index.html$</TT -></DT -><DD -><P -> Will match any page in the domain of <SPAN -CLASS="QUOTE" ->"example.com"</SPAN -> that is - named <SPAN -CLASS="QUOTE" ->"index.html"</SPAN ->, and that is part of some path. For - example, it matches <SPAN -CLASS="QUOTE" ->"www.example.com/testing/index.html"</SPAN -> but - NOT <SPAN -CLASS="QUOTE" ->"www.example.com/index.html"</SPAN -> because the regular - expression called for at least two <SPAN -CLASS="QUOTE" ->"/'s"</SPAN ->, thus the path - requirement. It also would match - <SPAN -CLASS="QUOTE" ->"www.example.com/testing/index_html"</SPAN ->, because of the - special meta-character <SPAN -CLASS="QUOTE" ->"."</SPAN ->. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->.example.com/(.*/)?index.html$</TT -></DT -><DD -><P -> This regular expression is conditional so it will match any page - named <SPAN -CLASS="QUOTE" ->"index.html"</SPAN -> regardless of path which in this case can - have one or more <SPAN -CLASS="QUOTE" ->"/'s"</SPAN ->. And this one must contain exactly - <SPAN -CLASS="QUOTE" ->".html"</SPAN -> (but does not have to end with that!). - </P -></DD -><DT -><TT -CLASS="LITERAL" ->.example.com/(.*/)(ads|banners?|junk)</TT -></DT -><DD -><P -> This regular expression will match any path of <SPAN -CLASS="QUOTE" ->"example.com"</SPAN -> - that contains any of the words <SPAN -CLASS="QUOTE" ->"ads"</SPAN ->, <SPAN -CLASS="QUOTE" ->"banner"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"banners"</SPAN -> (because of the <SPAN -CLASS="QUOTE" ->"?"</SPAN ->) or <SPAN -CLASS="QUOTE" ->"junk"</SPAN ->. - The path does not have to end in these words, just contain them. - </P -></DD -><DT -><TT -CLASS="LITERAL" ->.example.com/(.*/)(ads|banners?|junk)/.*.(jpe?g|gif|png)$</TT -></DT -><DD -><P -> This is very much the same as above, except now it must end in either - <SPAN -CLASS="QUOTE" ->".jpg"</SPAN ->, <SPAN -CLASS="QUOTE" ->".jpeg"</SPAN ->, <SPAN -CLASS="QUOTE" ->".gif"</SPAN -> or <SPAN -CLASS="QUOTE" ->".png"</SPAN ->. So this - one is limited to common image formats. - </P -></DD -></DL -></DIV -><P -> There are many, many good examples to be found in <TT -CLASS="FILENAME" ->default.action</TT ->, - and more tutorials below in <A -HREF="appendix.html#REGEX" ->Appendix on regular expressions</A ->.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="TAG-PATTERN" ->8.4.3. The Tag Pattern</A -></H3 -><P -> Tag patterns are used to change the applying actions based on the - request's tags. Tags can be created with either the - <A -HREF="actions-file.html#CLIENT-HEADER-TAGGER" ->client-header-tagger</A -> - or the <A -HREF="actions-file.html#SERVER-HEADER-TAGGER" ->server-header-tagger</A -> action.</P -><P -> Tag patterns have to start with <SPAN -CLASS="QUOTE" ->"TAG:"</SPAN ->, so <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - can tell them apart from URL patterns. Everything after the colon - including white space, is interpreted as a regular expression with - path pattern syntax, except that tag patterns aren't left-anchored - automatically (<SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> doesn't silently add a <SPAN -CLASS="QUOTE" ->"^"</SPAN ->, - you have to do it yourself if you need it).</P -><P -> To match all requests that are tagged with <SPAN -CLASS="QUOTE" ->"foo"</SPAN -> - your pattern line should be <SPAN -CLASS="QUOTE" ->"TAG:^foo$"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"TAG:foo"</SPAN -> would work as well, but it would also - match requests whose tags contain <SPAN -CLASS="QUOTE" ->"foo"</SPAN -> somewhere. - <SPAN -CLASS="QUOTE" ->"TAG: foo"</SPAN -> wouldn't work as it requires white space.</P -><P -> Sections can contain URL and tag patterns at the same time, - but tag patterns are checked after the URL patterns and thus - always overrule them, even if they are located before the URL patterns.</P -><P -> Once a new tag is added, Privoxy checks right away if it's matched by one - of the tag patterns and updates the action settings accordingly. As a result - tags can be used to activate other tagger actions, as long as these other - taggers look for headers that haven't already be parsed.</P -><P -> For example you could tag client requests which use the - <TT -CLASS="LITERAL" ->POST</TT -> method, - then use this tag to activate another tagger that adds a tag if cookies - are sent, and then use a block action based on the cookie tag. This allows - the outcome of one action, to be input into a subsequent action. However if - you'd reverse the position of the described taggers, and activated the - method tagger based on the cookie tagger, no method tags would be created. - The method tagger would look for the request line, but at the time - the cookie tag is created, the request line has already been parsed.</P -><P -> While this is a limitation you should be aware of, this kind of - indirection is seldom needed anyway and even the example doesn't - make too much sense.</P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="ACTIONS" ->8.5. Actions</A -></H2 -><P -> All actions are disabled by default, until they are explicitly enabled - somewhere in an actions file. Actions are turned on if preceded with a - <SPAN -CLASS="QUOTE" ->"+"</SPAN ->, and turned off if preceded with a <SPAN -CLASS="QUOTE" ->"-"</SPAN ->. So a - <TT -CLASS="LITERAL" ->+action</TT -> means <SPAN -CLASS="QUOTE" ->"do that action"</SPAN ->, e.g. - <TT -CLASS="LITERAL" ->+block</TT -> means <SPAN -CLASS="QUOTE" ->"please block URLs that match the - following patterns"</SPAN ->, and <TT -CLASS="LITERAL" ->-block</TT -> means <SPAN -CLASS="QUOTE" ->"don't - block URLs that match the following patterns, even if <TT -CLASS="LITERAL" ->+block</TT -> - previously applied."</SPAN -> </P -><P -> - Again, actions are invoked by placing them on a line, enclosed in curly braces and - separated by whitespace, like in - <TT -CLASS="LITERAL" ->{+some-action -some-other-action{some-parameter}}</TT ->, - followed by a list of URL patterns, one per line, to which they apply. - Together, the actions line and the following pattern lines make up a section - of the actions file. </P -><P -> - Actions fall into three categories:</P -><P -> <P -></P -><UL -><LI -><P -> - Boolean, i.e the action can only be <SPAN -CLASS="QUOTE" ->"enabled"</SPAN -> or - <SPAN -CLASS="QUOTE" ->"disabled"</SPAN ->. Syntax: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> +<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT -> # enable action <TT -CLASS="REPLACEABLE" -><I ->name</I -></TT -> - -<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT -> # disable action <TT -CLASS="REPLACEABLE" -><I ->name</I -></TT -></PRE -></TD -></TR -></TABLE -> - </P -><P -> - Example: <TT -CLASS="LITERAL" ->+handle-as-image</TT -> - </P -></LI -><LI -><P -> - Parameterized, where some value is required in order to enable this type of action. - Syntax: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> +<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT ->{<TT -CLASS="REPLACEABLE" -><I ->param</I -></TT ->} # enable action and set parameter to <TT -CLASS="REPLACEABLE" -><I ->param</I -></TT ->, - # overwriting parameter from previous match if necessary - -<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT -> # disable action. The parameter can be omitted</PRE -></TD -></TR -></TABLE -> - </P -><P -> Note that if the URL matches multiple positive forms of a parameterized action, - the last match wins, i.e. the params from earlier matches are simply ignored. - </P -><P -> - Example: <TT -CLASS="LITERAL" ->+hide-user-agent{Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.4) Gecko/20070602 Firefox/2.0.0.4}</TT -> - </P -></LI -><LI -><P -> - Multi-value. These look exactly like parameterized actions, - but they behave differently: If the action applies multiple times to the - same URL, but with different parameters, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> the parameters - from <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> matches are remembered. This is used for actions - that can be executed for the same request repeatedly, like adding multiple - headers, or filtering through multiple filters. Syntax: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> +<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT ->{<TT -CLASS="REPLACEABLE" -><I ->param</I -></TT ->} # enable action and add <TT -CLASS="REPLACEABLE" -><I ->param</I -></TT -> to the list of parameters - -<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT ->{<TT -CLASS="REPLACEABLE" -><I ->param</I -></TT ->} # remove the parameter <TT -CLASS="REPLACEABLE" -><I ->param</I -></TT -> from the list of parameters - # If it was the last one left, disable the action. - <TT -CLASS="REPLACEABLE" -><I ->-name</I -></TT -> # disable this action completely and remove all parameters from the list</PRE -></TD -></TR -></TABLE -> - </P -><P -> - Examples: <TT -CLASS="LITERAL" ->+add-header{X-Fun-Header: Some text}</TT -> and - <TT -CLASS="LITERAL" ->+filter{html-annoyances}</TT -> - </P -></LI -></UL -></P -><P -> If nothing is specified in any actions file, no <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> are - taken. So in this case <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> would just be a - normal, non-blocking, non-filtering proxy. You must specifically enable the - privacy and blocking features you need (although the provided default actions - files will give a good starting point).</P -><P -> Later defined action sections always over-ride earlier ones of the same type. - So exceptions to any rules you make, should come in the latter part of the file (or - in a file that is processed later when using multiple actions files such - as <TT -CLASS="FILENAME" ->user.action</TT ->). For multi-valued actions, the actions - are applied in the order they are specified. Actions files are processed in - the order they are defined in <TT -CLASS="FILENAME" ->config</TT -> (the default - installation has three actions files). It also quite possible for any given - URL to match more than one <SPAN -CLASS="QUOTE" ->"pattern"</SPAN -> (because of wildcards and - regular expressions), and thus to trigger more than one set of actions! Last - match wins.</P -><P -> The list of valid <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> actions are:</P -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ADD-HEADER" ->8.5.1. add-header</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Confuse log analysis, custom applications</P -></DD -><DT ->Effect:</DT -><DD -><P -> Sends a user defined HTTP header to the web server. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Multi-value.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Any string value is possible. Validity of the defined HTTP headers is not checked. - It is recommended that you use the <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->X-</TT ->"</SPAN -> prefix - for custom headers. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This action may be specified multiple times, in order to define multiple - headers. This is rarely needed for the typical user. If you don't know what - <SPAN -CLASS="QUOTE" ->"HTTP headers"</SPAN -> are, you definitely don't need to worry about this - one. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+add-header{X-User-Tracking: sucks}</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="BLOCK" ->8.5.2. block</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Block ads or other unwanted content</P -></DD -><DT ->Effect:</DT -><DD -><P -> Requests for URLs to which this action applies are blocked, i.e. the - requests are trapped by <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and the requested URL is never retrieved, - but is answered locally with a substitute page or image, as determined by - the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT ->, - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A -></TT ->, and - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-EMPTY-DOCUMENT" ->handle-as-empty-document</A -></TT -> actions. - - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P ->A block reason that should be given to the user.</P -></DD -><DT ->Notes:</DT -><DD -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> sends a special <SPAN -CLASS="QUOTE" ->"BLOCKED"</SPAN -> page - for requests to blocked pages. This page contains the block reason given as - parameter, a link to find out why the block action applies, and a click-through - to the blocked content (the latter only if the force feature is available and - enabled). - </P -><P -> - A very important exception occurs if <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN -> - <TT -CLASS="LITERAL" ->block</TT -> and <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT ->, - apply to the same request: it will then be replaced by an image. If - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A -></TT -> - (see below) also applies, the type of image will be determined by its parameter, - if not, the standard checkerboard pattern is sent. - </P -><P -> It is important to understand this process, in order - to understand how <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> deals with - ads and other unwanted content. Blocking is a core feature, and one - upon which various other features depend. - </P -><P -> The <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filter</A -></TT -> - action can perform a very similar task, by <SPAN -CLASS="QUOTE" ->"blocking"</SPAN -> - banner images and other content through rewriting the relevant URLs in the - document's HTML source, so they don't get requested in the first place. - Note that this is a totally different technique, and it's easy to confuse the two. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{+block{No nasty stuff for you.}} -# Block and replace with "blocked" page - .nasty-stuff.example.com - -{+block{Doubleclick banners.} +handle-as-image} -# Block and replace with image - .ad.doubleclick.net - .ads.r.us/banners/ - -{+block{Layered ads.} +handle-as-empty-document} -# Block and then ignore - adserver.example.net/.*.js$</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CHANGE-X-FORWARDED-FOR" ->8.5.3. change-x-forwarded-for</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Improve privacy by not forwarding the source of the request in the HTTP headers.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes the <SPAN -CLASS="QUOTE" ->"X-Forwarded-For:"</SPAN -> HTTP header from the client request, - or adds a new one. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -></P -><UL -><LI -><P -><SPAN -CLASS="QUOTE" ->"block"</SPAN -> to delete the header.</P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"add"</SPAN -> to create the header (or append - the client's IP address to an already existing one). - </P -></LI -></UL -></DD -><DT ->Notes:</DT -><DD -><P -> It is safe and recommended to use <TT -CLASS="LITERAL" ->block</TT ->. - </P -><P -> Forwarding the source address of the request may make - sense in some multi-user setups but is also a privacy risk. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+change-x-forwarded-for{block}</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CLIENT-HEADER-FILTER" ->8.5.4. client-header-filter</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Rewrite or remove single client headers. - </P -></DD -><DT ->Effect:</DT -><DD -><P -> All client headers to which this action applies are filtered on-the-fly through - the specified regular expression based substitutions. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> The name of a client-header filter, as defined in one of the - <A -HREF="filter-file.html" ->filter files</A ->. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Client-header filters are applied to each header on its own, not to - all at once. This makes it easier to diagnose problems, but on the downside - you can't write filters that only change header x if header y's value is z. - You can do that by using tags though. - </P -><P -> Client-header filters are executed after the other header actions have finished - and use their output as input. - </P -><P -> If the request URL gets changed, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will detect that and use the new - one. This can be used to rewrite the request destination behind the client's - back, for example to specify a Tor exit relay for certain requests. - </P -><P -> Please refer to the <A -HREF="filter-file.html" ->filter file chapter</A -> - to learn which client-header filters are available by default, and how to - create your own. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Hide Tor exit notation in Host and Referer Headers -{+client-header-filter{hide-tor-exit-notation}} -/ - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CLIENT-HEADER-TAGGER" ->8.5.5. client-header-tagger</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Block requests based on their headers. - </P -></DD -><DT ->Effect:</DT -><DD -><P -> Client headers to which this action applies are filtered on-the-fly through - the specified regular expression based substitutions, the result is used as - tag. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> The name of a client-header tagger, as defined in one of the - <A -HREF="filter-file.html" ->filter files</A ->. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Client-header taggers are applied to each header on its own, - and as the header isn't modified, each tagger <SPAN -CLASS="QUOTE" ->"sees"</SPAN -> - the original. - </P -><P -> Client-header taggers are the first actions that are executed - and their tags can be used to control every other action. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Tag every request with the User-Agent header -{+client-header-tagger{user-agent}} -/ - -# Tagging itself doesn't change the action -# settings, sections with TAG patterns do: -# -# If it's a download agent, use a different forwarding proxy, -# show the real User-Agent and make sure resume works. -{+forward-override{forward-socks5 10.0.0.2:2222 .} \ - -hide-if-modified-since \ - -overwrite-last-modified \ - -hide-user-agent \ - -filter \ - -deanimate-gifs \ -} -TAG:^User-Agent: NetBSD-ftp/ -TAG:^User-Agent: Novell ZYPP Installer -TAG:^User-Agent: RPM APT-HTTP/ -TAG:^User-Agent: fetch libfetch/ -TAG:^User-Agent: Ubuntu APT-HTTP/ -TAG:^User-Agent: MPlayer/ - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CONTENT-TYPE-OVERWRITE" ->8.5.6. content-type-overwrite</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Stop useless download menus from popping up, or change the browser's rendering mode</P -></DD -><DT ->Effect:</DT -><DD -><P -> Replaces the <SPAN -CLASS="QUOTE" ->"Content-Type:"</SPAN -> HTTP server header. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Any string. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The <SPAN -CLASS="QUOTE" ->"Content-Type:"</SPAN -> HTTP server header is used by the - browser to decide what to do with the document. The value of this - header can cause the browser to open a download menu instead of - displaying the document by itself, even if the document's format is - supported by the browser. - </P -><P -> The declared content type can also affect which rendering mode - the browser chooses. If XHTML is delivered as <SPAN -CLASS="QUOTE" ->"text/html"</SPAN ->, - many browsers treat it as yet another broken HTML document. - If it is send as <SPAN -CLASS="QUOTE" ->"application/xml"</SPAN ->, browsers with - XHTML support will only display it, if the syntax is correct. - </P -><P -> If you see a web site that proudly uses XHTML buttons, but sets - <SPAN -CLASS="QUOTE" ->"Content-Type: text/html"</SPAN ->, you can use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - to overwrite it with <SPAN -CLASS="QUOTE" ->"application/xml"</SPAN -> and validate - the web master's claim inside your XHTML-supporting browser. - If the syntax is incorrect, the browser will complain loudly. - </P -><P -> You can also go the opposite direction: if your browser prints - error messages instead of rendering a document falsely declared - as XHTML, you can overwrite the content type with - <SPAN -CLASS="QUOTE" ->"text/html"</SPAN -> and have it rendered as broken HTML document. - </P -><P -> By default <TT -CLASS="LITERAL" ->content-type-overwrite</TT -> only replaces - <SPAN -CLASS="QUOTE" ->"Content-Type:"</SPAN -> headers that look like some kind of text. - If you want to overwrite it unconditionally, you have to combine it with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FORCE-TEXT-MODE" ->force-text-mode</A -></TT ->. - This limitation exists for a reason, think twice before circumventing it. - </P -><P -> Most of the time it's easier to replace this action with a custom - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SERVER-HEADER-FILTER" ->server-header filter</A -></TT ->. - It allows you to activate it for every document of a certain site and it will still - only replace the content types you aimed at. - </P -><P -> Of course you can apply <TT -CLASS="LITERAL" ->content-type-overwrite</TT -> - to a whole site and then make URL based exceptions, but it's a lot - more work to get the same precision. - </P -></DD -><DT ->Example usage (sections):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Check if www.example.net/ really uses valid XHTML -{ +content-type-overwrite{application/xml} } -www.example.net/ - -# but leave the content type unmodified if the URL looks like a style sheet -{-content-type-overwrite} -www.example.net/.*.css$ -www.example.net/.*style</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CRUNCH-CLIENT-HEADER" ->8.5.7. crunch-client-header</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Remove a client header <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has no dedicated action for.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes every header sent by the client that contains the string the user supplied as parameter. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Any string. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This action allows you to block client headers for which no dedicated - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> action exists. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will remove every client header that - contains the string you supplied as parameter. - </P -><P -> Regular expressions are <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not supported</I -></SPAN -> and you can't - use this action to block different headers in the same request, unless - they contain the same string. - </P -><P -> <TT -CLASS="LITERAL" ->crunch-client-header</TT -> is only meant for quick tests. - If you have to block several different headers, or only want to modify - parts of them, you should use a - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CLIENT-HEADER-FILTER" ->client-header filter</A -></TT ->. - </P -><DIV -CLASS="WARNING" -><P -></P -><TABLE -CLASS="WARNING" -BORDER="1" -WIDTH="90%" -><TR -><TD -ALIGN="CENTER" -><B ->Warning</B -></TD -></TR -><TR -><TD -ALIGN="LEFT" -><P -> Don't block any header without understanding the consequences. - </P -></TD -></TR -></TABLE -></DIV -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Block the non-existent "Privacy-Violation:" client header -{ +crunch-client-header{Privacy-Violation:} } -/ - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CRUNCH-IF-NONE-MATCH" ->8.5.8. crunch-if-none-match</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Prevent yet another way to track the user's steps between sessions.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes the <SPAN -CLASS="QUOTE" ->"If-None-Match:"</SPAN -> HTTP client header. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Removing the <SPAN -CLASS="QUOTE" ->"If-None-Match:"</SPAN -> HTTP client header - is useful for filter testing, where you want to force a real - reload instead of getting status code <SPAN -CLASS="QUOTE" ->"304"</SPAN -> which - would cause the browser to use a cached copy of the page. - </P -><P -> It is also useful to make sure the header isn't used as a cookie - replacement (unlikely but possible). - </P -><P -> Blocking the <SPAN -CLASS="QUOTE" ->"If-None-Match:"</SPAN -> header shouldn't cause any - caching problems, as long as the <SPAN -CLASS="QUOTE" ->"If-Modified-Since:"</SPAN -> header - isn't blocked or missing as well. - </P -><P -> It is recommended to use this action together with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HIDE-IF-MODIFIED-SINCE" ->hide-if-modified-since</A -></TT -> - and - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#OVERWRITE-LAST-MODIFIED" ->overwrite-last-modified</A -></TT ->. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Let the browser revalidate cached documents but don't -# allow the server to use the revalidation headers for user tracking. -{+hide-if-modified-since{-60} \ - +overwrite-last-modified{randomize} \ - +crunch-if-none-match} -/ </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CRUNCH-INCOMING-COOKIES" ->8.5.9. crunch-incoming-cookies</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Prevent the web server from setting HTTP cookies on your system - </P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes any <SPAN -CLASS="QUOTE" ->"Set-Cookie:"</SPAN -> HTTP headers from server replies. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This action is only concerned with <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->incoming</I -></SPAN -> HTTP cookies. For - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->outgoing</I -></SPAN -> HTTP cookies, use - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -></TT ->. - Use <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN -> to disable HTTP cookies completely. - </P -><P -> It makes <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->no sense at all</I -></SPAN -> to use this action in conjunction - with the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SESSION-COOKIES-ONLY" ->session-cookies-only</A -></TT -> action, - since it would prevent the session cookies from being set. See also - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER-CONTENT-COOKIES" ->filter-content-cookies</A -></TT ->. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+crunch-incoming-cookies</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CRUNCH-SERVER-HEADER" ->8.5.10. crunch-server-header</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Remove a server header <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has no dedicated action for.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes every header sent by the server that contains the string the user supplied as parameter. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Any string. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This action allows you to block server headers for which no dedicated - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> action exists. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - will remove every server header that contains the string you supplied as parameter. - </P -><P -> Regular expressions are <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not supported</I -></SPAN -> and you can't - use this action to block different headers in the same request, unless - they contain the same string. - </P -><P -> <TT -CLASS="LITERAL" ->crunch-server-header</TT -> is only meant for quick tests. - If you have to block several different headers, or only want to modify - parts of them, you should use a custom - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SERVER-HEADER-FILTER" ->server-header filter</A -></TT ->. - </P -><DIV -CLASS="WARNING" -><P -></P -><TABLE -CLASS="WARNING" -BORDER="1" -WIDTH="90%" -><TR -><TD -ALIGN="CENTER" -><B ->Warning</B -></TD -></TR -><TR -><TD -ALIGN="LEFT" -><P -> Don't block any header without understanding the consequences. - </P -></TD -></TR -></TABLE -></DIV -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Crunch server headers that try to prevent caching -{ +crunch-server-header{no-cache} } -/ </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CRUNCH-OUTGOING-COOKIES" ->8.5.11. crunch-outgoing-cookies</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Prevent the web server from reading any HTTP cookies from your system - </P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes any <SPAN -CLASS="QUOTE" ->"Cookie:"</SPAN -> HTTP headers from client requests. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This action is only concerned with <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->outgoing</I -></SPAN -> HTTP cookies. For - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->incoming</I -></SPAN -> HTTP cookies, use - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -></TT ->. - Use <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN -> to disable HTTP cookies completely. - </P -><P -> It makes <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->no sense at all</I -></SPAN -> to use this action in conjunction - with the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SESSION-COOKIES-ONLY" ->session-cookies-only</A -></TT -> action, - since it would prevent the session cookies from being read. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+crunch-outgoing-cookies</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="DEANIMATE-GIFS" ->8.5.12. deanimate-gifs</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Stop those annoying, distracting animated GIF images.</P -></DD -><DT ->Effect:</DT -><DD -><P -> De-animate GIF animations, i.e. reduce them to their first or last image. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> <SPAN -CLASS="QUOTE" ->"last"</SPAN -> or <SPAN -CLASS="QUOTE" ->"first"</SPAN -> - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This will also shrink the images considerably (in bytes, not pixels!). If - the option <SPAN -CLASS="QUOTE" ->"first"</SPAN -> is given, the first frame of the animation - is used as the replacement. If <SPAN -CLASS="QUOTE" ->"last"</SPAN -> 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). - </P -><P -> You can safely use this action with patterns that will also match non-GIF - objects, because no attempt will be made at anything that doesn't look like - a GIF. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+deanimate-gifs{last}</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="DOWNGRADE-HTTP-VERSION" ->8.5.13. downgrade-http-version</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Work around (very rare) problems with HTTP/1.1</P -></DD -><DT ->Effect:</DT -><DD -><P -> Downgrades HTTP/1.1 client requests and server replies to HTTP/1.0. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This is a left-over from the time when <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - didn't support important HTTP/1.1 features well. It is left here for the - unlikely case that you experience HTTP/1.1 related problems with some server - out there. Not all HTTP/1.1 features and requirements are supported yet, - so there is a chance you might need this action. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{+downgrade-http-version} -problem-host.example.com</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="FAST-REDIRECTS" ->8.5.14. fast-redirects</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Fool some click-tracking scripts and speed up indirect links.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Detects redirection URLs and redirects the browser without contacting - the redirection server first. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -></P -><UL -><LI -><P -> <SPAN -CLASS="QUOTE" ->"simple-check"</SPAN -> to just search for the string <SPAN -CLASS="QUOTE" ->"http://"</SPAN -> - to detect redirection URLs. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"check-decoded-url"</SPAN -> to decode URLs (if necessary) before searching - for redirection URLs. - </P -></LI -></UL -></DD -><DT ->Notes:</DT -><DD -><P -> - Many sites, like yahoo.com, don't just link to other sites. Instead, they - will link to some script on their own servers, giving the destination as a - parameter, which will then redirect you to the final target. URLs - resulting from this scheme typically look like: - <SPAN -CLASS="QUOTE" ->"http://www.example.org/click-tracker.cgi?target=http%3a//www.example.net/"</SPAN ->. - </P -><P -> 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 asks the server for one redirect after the other. Plus, it feeds - the advertisers. - </P -><P -> This feature is currently not very smart and is scheduled for improvement. - If it is enabled by default, you will have to create some exceptions to - this action. It can lead to failures in several ways: - </P -><P -> Not every URLs with other URLs as parameters is evil. - Some sites offer a real service that requires this information to work. - For example a validation service needs to know, which document to validate. - <TT -CLASS="LITERAL" ->fast-redirects</TT -> assumes that every URL parameter that - looks like another URL is a redirection target, and will always redirect to - the last one. Most of the time the assumption is correct, but if it isn't, - the user gets redirected anyway. - </P -><P -> Another failure occurs if the URL contains other parameters after the URL parameter. - The URL: - <SPAN -CLASS="QUOTE" ->"http://www.example.org/?redirect=http%3a//www.example.net/&foo=bar"</SPAN ->. - contains the redirection URL <SPAN -CLASS="QUOTE" ->"http://www.example.net/"</SPAN ->, - followed by another parameter. <TT -CLASS="LITERAL" ->fast-redirects</TT -> doesn't know that - and will cause a redirect to <SPAN -CLASS="QUOTE" ->"http://www.example.net/&foo=bar"</SPAN ->. - Depending on the target server configuration, the parameter will be silently ignored - or lead to a <SPAN -CLASS="QUOTE" ->"page not found"</SPAN -> error. You can prevent this problem by - first using the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#REDIRECT" ->redirect</A -></TT -> action - to remove the last part of the URL, but it requires a little effort. - </P -><P -> To detect a redirection URL, <TT -CLASS="LITERAL" ->fast-redirects</TT -> only - looks for the string <SPAN -CLASS="QUOTE" ->"http://"</SPAN ->, either in plain text - (invalid but often used) or encoded as <SPAN -CLASS="QUOTE" ->"http%3a//"</SPAN ->. - Some sites use their own URL encoding scheme, encrypt the address - of the target server or replace it with a database id. In theses cases - <TT -CLASS="LITERAL" ->fast-redirects</TT -> is fooled and the request reaches the - redirection server where it probably gets logged. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { +fast-redirects{simple-check} } - one.example.com - - { +fast-redirects{check-decoded-url} } - another.example.com/testing</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="FILTER" ->8.5.15. filter</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Get rid of HTML and JavaScript annoyances, banner advertisements (by size), - do fun text replacements, add personalized effects, etc.</P -></DD -><DT ->Effect:</DT -><DD -><P -> All instances of text-based type, most notably HTML and JavaScript, to which - this action applies, can be filtered on-the-fly through the specified regular - expression based substitutions. (Note: as of version 3.0.3 plain text documents - are exempted from filtering, because web servers often use the - <TT -CLASS="LITERAL" ->text/plain</TT -> MIME type for all files whose type they don't know.) - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> The name of a content filter, as defined in the <A -HREF="filter-file.html" ->filter file</A ->. - Filters can be defined in one or more files as defined by the - <TT -CLASS="LITERAL" -><A -HREF="config.html#FILTERFILE" ->filterfile</A -></TT -> - option in the <A -HREF="config.html" ->config file</A ->. - <TT -CLASS="FILENAME" ->default.filter</TT -> is the collection of filters - supplied by the developers. Locally defined filters should go - in their own file, such as <TT -CLASS="FILENAME" ->user.filter</TT ->. - </P -><P -> When used in its negative form, - and without parameters, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> filtering is completely disabled. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> For your convenience, there are a number of pre-defined filters available - in the distribution filter file that you can use. See the examples below for - a list. - </P -><P -> 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. - </P -><P -> <SPAN -CLASS="QUOTE" ->"Rolling your own"</SPAN -> - filters requires a knowledge of - <A -HREF="http://en.wikipedia.org/wiki/Regular_expressions" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"Regular - Expressions"</SPAN -></A -> and - <A -HREF="http://en.wikipedia.org/wiki/Html" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"HTML"</SPAN -></A ->. - This is very powerful feature, and potentially very intrusive. - Filters should be used with caution, and where an equivalent - <SPAN -CLASS="QUOTE" ->"action"</SPAN -> is not available. - </P -><P -> The amount of data that can be filtered is limited to the - <TT -CLASS="LITERAL" -><A -HREF="config.html#BUFFER-LIMIT" ->buffer-limit</A -></TT -> - option in the main <A -HREF="config.html" ->config file</A ->. The - default is 4096 KB (4 Megs). Once this limit is exceeded, the buffered - data, and all pending data, is passed through unfiltered. - </P -><P -> Inappropriate MIME types, such as zipped files, are not filtered at all. - (Again, only text-based types except plain text). Encrypted SSL data - (from HTTPS servers) cannot be filtered either, since this would violate - the integrity of the secure transaction. In some situations it might - be necessary to protect certain text, like source code, from filtering - by defining appropriate <TT -CLASS="LITERAL" ->-filter</TT -> exceptions. - </P -><P -> Compressed content can't be filtered either, unless <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is compiled with zlib support (requires at least <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.7), - in which case <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will decompress the content before filtering - it. - </P -><P -> If you use a <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version without zlib support, but want filtering to work on - as much documents as possible, even those that would normally be sent compressed, - you must use the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#PREVENT-COMPRESSION" ->prevent-compression</A -></TT -> - action in conjunction with <TT -CLASS="LITERAL" ->filter</TT ->. - </P -><P -> Content filtering can achieve some of the same effects as the - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> - action, i.e. it can be used to block ads and banners. But the mechanism - works quite differently. One effective use, is to block ad banners - based on their size (see below), since many of these seem to be somewhat - standardized. - </P -><P -> <A -HREF="contact.html" ->Feedback</A -> with suggestions for new or - improved filters is particularly welcome! - </P -><P -> The below list has only the names and a one-line description of each - predefined filter. There are <A -HREF="filter-file.html#PREDEFINED-FILTERS" ->more - verbose explanations</A -> of what these filters do in the <A -HREF="filter-file.html" ->filter file chapter</A ->. - </P -></DD -><DT ->Example usage (with filters from the distribution <TT -CLASS="FILENAME" ->default.filter</TT -> file). - See <A -HREF="filter-file.html#PREDEFINED-FILTERS" ->the Predefined Filters section</A -> for - more explanation on each:</DT -><DD -><P -> <A -NAME="FILTER-JS-ANNOYANCES" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{js-annoyances} # Get rid of particularly annoying JavaScript abuse.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-JS-EVENTS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{js-events} # Kill all JS event bindings and timers (Radically destructive! Only for extra nasty sites).</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-HTML-ANNOYANCES" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{html-annoyances} # Get rid of particularly annoying HTML abuse.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-CONTENT-COOKIES" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{content-cookies} # Kill cookies that come in the HTML or JS content.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-REFRESH-TAGS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{refresh-tags} # Kill automatic refresh tags (for dial-on-demand setups).</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-UNSOLICITED-POPUPS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{unsolicited-popups} # Disable only unsolicited pop-up windows. Useful if your browser lacks this ability.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-ALL-POPUPS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{all-popups} # Kill all popups in JavaScript and HTML. Useful if your browser lacks this ability.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-IMG-REORDER" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{img-reorder} # Reorder attributes in <img> tags to make the banners-by-* filters more effective.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-BANNERS-BY-SIZE" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{banners-by-size} # Kill banners by size.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-BANNERS-BY-LINK" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{banners-by-link} # Kill banners by their links to known clicktrackers.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-WEBBUGS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{webbugs} # Squish WebBugs (1x1 invisible GIFs used for user tracking).</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-TINY-TEXTFORMS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{tiny-textforms} # Extend those tiny textareas up to 40x80 and kill the hard wrap.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-JUMPING-WINDOWS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{jumping-windows} # Prevent windows from resizing and moving themselves.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-FRAMESET-BORDERS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{frameset-borders} # Give frames a border and make them resizable.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-DEMORONIZER" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{demoronizer} # Fix MS's non-standard use of standard charsets.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-SHOCKWAVE-FLASH" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{shockwave-flash} # Kill embedded Shockwave Flash objects.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-QUICKTIME-KIOSKMODE" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{quicktime-kioskmode} # Make Quicktime movies saveable.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-FUN" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{fun} # Text replacements for subversive browsing fun!</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-CRUDE-PARENTAL" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{crude-parental} # Crude parental filtering. Note that this filter doesn't work reliably.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-IE-EXPLOITS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{ie-exploits} # Disable some known Internet Explorer bug exploits.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-SITE-SPECIFICS" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{site-specifics} # Cure for site-specific problems. Don't apply generally!</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-NO-PING" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{no-ping} # Removes non-standard ping attributes in <a> and <area> tags.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-GOOGLE" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{google} # CSS-based block for Google text ads. Also removes a width limitation and the toolbar advertisement.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-YAHOO" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{yahoo} # CSS-based block for Yahoo text ads. Also removes a width limitation.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-MSN" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{msn} # CSS-based block for MSN text ads. Also removes tracking URLs and a width limitation.</PRE -></TD -></TR -></TABLE -> - </P -><P -> <A -NAME="FILTER-BLOGSPOT" -></A -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+filter{blogspot} # Cleans up some Blogspot blogs. Read the fine print before using this.</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="FORCE-TEXT-MODE" ->8.5.16. force-text-mode</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Force <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to treat a document as if it was in some kind of <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->text</I -></SPAN -> format. </P -></DD -><DT ->Effect:</DT -><DD -><P -> Declares a document as text, even if the <SPAN -CLASS="QUOTE" ->"Content-Type:"</SPAN -> isn't detected as such. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> As explained <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->above</A -></TT ->, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> tries to only filter files that are - in some kind of text format. The same restrictions apply to - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CONTENT-TYPE-OVERWRITE" ->content-type-overwrite</A -></TT ->. - <TT -CLASS="LITERAL" ->force-text-mode</TT -> declares a document as text, - without looking at the <SPAN -CLASS="QUOTE" ->"Content-Type:"</SPAN -> first. - </P -><DIV -CLASS="WARNING" -><P -></P -><TABLE -CLASS="WARNING" -BORDER="1" -WIDTH="90%" -><TR -><TD -ALIGN="CENTER" -><B ->Warning</B -></TD -></TR -><TR -><TD -ALIGN="LEFT" -><P -> Think twice before activating this action. Filtering binary data - with regular expressions can cause file damage. - </P -></TD -></TR -></TABLE -></DIV -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+force-text-mode - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="FORWARD-OVERRIDE" ->8.5.17. forward-override</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Change the forwarding settings based on User-Agent or request origin</P -></DD -><DT ->Effect:</DT -><DD -><P -> Overrules the forward directives in the configuration file. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Multi-value.</P -></DD -><DT ->Parameter:</DT -><DD -><P -></P -><UL -><LI -><P -><SPAN -CLASS="QUOTE" ->"forward ."</SPAN -> to use a direct connection without any additional proxies.</P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"forward 127.0.0.1:8123"</SPAN -> to use the HTTP proxy listening at 127.0.0.1 port 8123. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"forward-socks4a 127.0.0.1:9050 ."</SPAN -> to use the socks4a proxy listening at - 127.0.0.1 port 9050. Replace <SPAN -CLASS="QUOTE" ->"forward-socks4a"</SPAN -> with <SPAN -CLASS="QUOTE" ->"forward-socks4"</SPAN -> - to use a socks4 connection (with local DNS resolution) instead, use <SPAN -CLASS="QUOTE" ->"forward-socks5"</SPAN -> - for socks5 connections (with remote DNS resolution). - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"forward-socks4a 127.0.0.1:9050 proxy.example.org:8000"</SPAN -> to use the socks4a proxy - listening at 127.0.0.1 port 9050 to reach the HTTP proxy listening at proxy.example.org port 8000. - Replace <SPAN -CLASS="QUOTE" ->"forward-socks4a"</SPAN -> with <SPAN -CLASS="QUOTE" ->"forward-socks4"</SPAN -> to use a socks4 connection - (with local DNS resolution) instead, use <SPAN -CLASS="QUOTE" ->"forward-socks5"</SPAN -> - for socks5 connections (with remote DNS resolution). - </P -></LI -></UL -></DD -><DT ->Notes:</DT -><DD -><P -> This action takes parameters similar to the - <A -HREF="config.html#FORWARDING" ->forward</A -> directives in the configuration - file, but without the URL pattern. It can be used as replacement, but normally it's only - used in cases where matching based on the request URL isn't sufficient. - </P -><DIV -CLASS="WARNING" -><P -></P -><TABLE -CLASS="WARNING" -BORDER="1" -WIDTH="90%" -><TR -><TD -ALIGN="CENTER" -><B ->Warning</B -></TD -></TR -><TR -><TD -ALIGN="LEFT" -><P -> Please read the description for the <A -HREF="config.html#FORWARDING" ->forward</A -> directives before - using this action. Forwarding to the wrong people will reduce your privacy and increase the - chances of man-in-the-middle attacks. - </P -><P -> If the ports are missing or invalid, default values will be used. This might change - in the future and you shouldn't rely on it. Otherwise incorrect syntax causes Privoxy - to exit. - </P -><P -> Use the <A -HREF="http://config.privoxy.org/show-url-info" -TARGET="_top" ->show-url-info CGI page</A -> - to verify that your forward settings do what you thought the do. - </P -></TD -></TR -></TABLE -></DIV -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Always use direct connections for requests previously tagged as -# <SPAN -CLASS="QUOTE" ->"User-Agent: fetch libfetch/2.0"</SPAN -> and make sure -# resuming downloads continues to work. -# This way you can continue to use Tor for your normal browsing, -# without overloading the Tor network with your FreeBSD ports updates -# or downloads of bigger files like ISOs. -# Note that HTTP headers are easy to fake and therefore their -# values are as (un)trustworthy as your clients and users. -{+forward-override{forward .} \ - -hide-if-modified-since \ - -overwrite-last-modified \ -} -TAG:^User-Agent: fetch libfetch/2.0$ - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HANDLE-AS-EMPTY-DOCUMENT" ->8.5.18. handle-as-empty-document</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Mark URLs that should be replaced by empty documents <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->if they get blocked</I -></SPAN -></P -></DD -><DT ->Effect:</DT -><DD -><P -> This action alone doesn't do anything noticeable. It just marks URLs. - If the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> action <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->also applies</I -></SPAN ->, - the presence or absence of this mark decides whether an HTML <SPAN -CLASS="QUOTE" ->"BLOCKED"</SPAN -> - page, or an empty document will be sent to the client as a substitute for the blocked content. - The <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->empty</I -></SPAN -> document isn't literally empty, but actually contains a single space. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Some browsers complain about syntax errors if JavaScript documents - are blocked with <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - default HTML page; this option can be used to silence them. - And of course this action can also be used to eliminate the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - BLOCKED message in frames. - </P -><P -> The content type for the empty document can be specified with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CONTENT-TYPE-OVERWRITE" ->content-type-overwrite{}</A -></TT ->, - but usually this isn't necessary. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Block all documents on example.org that end with ".js", -# but send an empty document instead of the usual HTML message. -{+block{Blocked JavaScript} +handle-as-empty-document} -example.org/.*.js$ - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HANDLE-AS-IMAGE" ->8.5.19. handle-as-image</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Mark URLs as belonging to images (so they'll be replaced by images <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->if they do get blocked</I -></SPAN ->, rather than HTML pages)</P -></DD -><DT ->Effect:</DT -><DD -><P -> This action alone doesn't do anything noticeable. It just marks URLs as images. - If the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> action <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->also applies</I -></SPAN ->, - the presence or absence of this mark decides whether an HTML <SPAN -CLASS="QUOTE" ->"blocked"</SPAN -> - page, or a replacement image (as determined by the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A -></TT -> action) will be sent to the - client as a substitute for the blocked content. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The below generic example section is actually part of <TT -CLASS="FILENAME" ->default.action</TT ->. - It marks all URLs with well-known image file name extensions as images and should - be left intact. - </P -><P -> Users will probably only want to use the handle-as-image action in conjunction with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT ->, to block sources of banners, whose URLs don't - reflect the file type, like in the second example section. - </P -><P -> Note that you cannot treat HTML pages as images in most cases. For instance, (in-line) ad - frames require an HTML page to be sent, or they won't display properly. - Forcing <TT -CLASS="LITERAL" ->handle-as-image</TT -> in this situation will not replace the - ad frame with an image, but lead to error messages. - </P -></DD -><DT ->Example usage (sections):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Generic image extensions: -# -{+handle-as-image} -/.*.(gif|jpg|jpeg|png|bmp|ico)$ - -# These don't look like images, but they're banners and should be -# blocked as images: -# -{+block{Nasty banners.} +handle-as-image} -nasty-banner-server.example.com/junk.cgi?output=trash</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HIDE-ACCEPT-LANGUAGE" ->8.5.20. hide-accept-language</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Pretend to use different language settings.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes or replaces the <SPAN -CLASS="QUOTE" ->"Accept-Language:"</SPAN -> HTTP header in client requests. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Keyword: <SPAN -CLASS="QUOTE" ->"block"</SPAN ->, or any user defined value. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Faking the browser's language settings can be useful to make a - foreign User-Agent set with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HIDE-USER-AGENT" ->hide-user-agent</A -></TT -> - more believable. - </P -><P -> However some sites with content in different languages check the - <SPAN -CLASS="QUOTE" ->"Accept-Language:"</SPAN -> to decide which one to take by default. - Sometimes it isn't possible to later switch to another language without - changing the <SPAN -CLASS="QUOTE" ->"Accept-Language:"</SPAN -> header first. - </P -><P -> Therefore it's a good idea to either only change the - <SPAN -CLASS="QUOTE" ->"Accept-Language:"</SPAN -> header to languages you understand, - or to languages that aren't wide spread. - </P -><P -> Before setting the <SPAN -CLASS="QUOTE" ->"Accept-Language:"</SPAN -> header - to a rare language, you should consider that it helps to - make your requests unique and thus easier to trace. - If you don't plan to change this header frequently, - you should stick to a common language. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Pretend to use Canadian language settings. -{+hide-accept-language{en-ca} \ -+hide-user-agent{Mozilla/5.0 (X11; U; OpenBSD i386; en-CA; rv:1.8.0.4) Gecko/20060628 Firefox/1.5.0.4} \ -} -/ </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HIDE-CONTENT-DISPOSITION" ->8.5.21. hide-content-disposition</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Prevent download menus for content you prefer to view inside the browser.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes or replaces the <SPAN -CLASS="QUOTE" ->"Content-Disposition:"</SPAN -> HTTP header set by some servers. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Keyword: <SPAN -CLASS="QUOTE" ->"block"</SPAN ->, or any user defined value. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Some servers set the <SPAN -CLASS="QUOTE" ->"Content-Disposition:"</SPAN -> HTTP header for - documents they assume you want to save locally before viewing them. - The <SPAN -CLASS="QUOTE" ->"Content-Disposition:"</SPAN -> header contains the file name - the browser is supposed to use by default. - </P -><P -> In most browsers that understand this header, it makes it impossible to - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->just view</I -></SPAN -> the document, without downloading it first, - even if it's just a simple text file or an image. - </P -><P -> Removing the <SPAN -CLASS="QUOTE" ->"Content-Disposition:"</SPAN -> header helps - to prevent this annoyance, but some browsers additionally check the - <SPAN -CLASS="QUOTE" ->"Content-Type:"</SPAN -> header, before they decide if they can - display a document without saving it first. In these cases, you have - to change this header as well, before the browser stops displaying - download menus. - </P -><P -> It is also possible to change the server's file name suggestion - to another one, but in most cases it isn't worth the time to set - it up. - </P -><P -> This action will probably be removed in the future, - use server-header filters instead. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Disarm the download link in Sourceforge's patch tracker -{ -filter \ - +content-type-overwrite{text/plain}\ - +hide-content-disposition{block} } - .sourceforge.net/tracker/download.php</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HIDE-IF-MODIFIED-SINCE" ->8.5.22. hide-if-modified-since</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Prevent yet another way to track the user's steps between sessions.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes the <SPAN -CLASS="QUOTE" ->"If-Modified-Since:"</SPAN -> HTTP client header or modifies its value. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Keyword: <SPAN -CLASS="QUOTE" ->"block"</SPAN ->, or a user defined value that specifies a range of hours. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Removing this header is useful for filter testing, where you want to force a real - reload instead of getting status code <SPAN -CLASS="QUOTE" ->"304"</SPAN ->, which would cause the - browser to use a cached copy of the page. - </P -><P -> Instead of removing the header, <TT -CLASS="LITERAL" ->hide-if-modified-since</TT -> can - also add or subtract a random amount of time to/from the header's value. - You specify a range of minutes where the random factor should be chosen from and - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> does the rest. A negative value means - subtracting, a positive value adding. - </P -><P -> Randomizing the value of the <SPAN -CLASS="QUOTE" ->"If-Modified-Since:"</SPAN -> makes - it less likely that the server can use the time as a cookie replacement, - but you will run into caching problems if the random range is too high. - </P -><P -> It is a good idea to only use a small negative value and let - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#OVERWRITE-LAST-MODIFIED" ->overwrite-last-modified</A -></TT -> - handle the greater changes. - </P -><P -> It is also recommended to use this action together with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-IF-NONE-MATCH" ->crunch-if-none-match</A -></TT ->, - otherwise it's more or less pointless. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Let the browser revalidate but make tracking based on the time less likely. -{+hide-if-modified-since{-60} \ - +overwrite-last-modified{randomize} \ - +crunch-if-none-match} -/</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HIDE-FROM-HEADER" ->8.5.23. hide-from-header</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Keep your (old and ill) browser from telling web servers your email address</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes any existing <SPAN -CLASS="QUOTE" ->"From:"</SPAN -> HTTP header, or replaces it with the - specified string. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Keyword: <SPAN -CLASS="QUOTE" ->"block"</SPAN ->, or any user defined value. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The keyword <SPAN -CLASS="QUOTE" ->"block"</SPAN -> will completely remove the header - (not to be confused with the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> - action). - </P -><P -> Alternately, you can specify any value you prefer to be sent to the web - server. If you do, it is a matter of fairness not to use any address that - is actually used by a real person. - </P -><P -> This action is rarely needed, as modern web browsers don't send - <SPAN -CLASS="QUOTE" ->"From:"</SPAN -> headers anymore. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+hide-from-header{block}</PRE -></TD -></TR -></TABLE -> or - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+hide-from-header{spam-me-senseless@sittingduck.example.com}</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HIDE-REFERRER" ->8.5.24. hide-referrer</A -></H4 -><A -NAME="HIDE-REFERER" -></A -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Conceal which link you followed to get to a particular site</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes the <SPAN -CLASS="QUOTE" ->"Referer:"</SPAN -> (sic) HTTP header from the client request, - or replaces it with a forged one. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -></P -><UL -><LI -><P -><SPAN -CLASS="QUOTE" ->"conditional-block"</SPAN -> to delete the header completely if the host has changed.</P -></LI -><LI -><P -><SPAN -CLASS="QUOTE" ->"conditional-forge"</SPAN -> to forge the header if the host has changed.</P -></LI -><LI -><P -><SPAN -CLASS="QUOTE" ->"block"</SPAN -> to delete the header unconditionally.</P -></LI -><LI -><P -><SPAN -CLASS="QUOTE" ->"forge"</SPAN -> to pretend to be coming from the homepage of the server we are talking to.</P -></LI -><LI -><P ->Any other string to set a user defined referrer.</P -></LI -></UL -></DD -><DT ->Notes:</DT -><DD -><P -> <TT -CLASS="LITERAL" ->conditional-block</TT -> is the only parameter, - that isn't easily detected in the server's log file. If it blocks the - referrer, the request will look like the visitor used a bookmark or - typed in the address directly. - </P -><P -> Leaving the referrer unmodified for requests on the same host - allows the server owner to see the visitor's <SPAN -CLASS="QUOTE" ->"click path"</SPAN ->, - but in most cases she could also get that information by comparing - other parts of the log file: for example the User-Agent if it isn't - a very common one, or the user's IP address if it doesn't change between - different requests. - </P -><P -> Always blocking the referrer, or using a custom one, can lead to - failures on servers that check the referrer before they answer any - requests, in an attempt to prevent their content from being - embedded or linked to elsewhere. - </P -><P -> Both <TT -CLASS="LITERAL" ->conditional-block</TT -> and <TT -CLASS="LITERAL" ->forge</TT -> - will work with referrer checks, as long as content and valid referring page - are on the same host. Most of the time that's the case. - </P -><P -> - <TT -CLASS="LITERAL" ->hide-referer</TT -> is an alternate spelling of - <TT -CLASS="LITERAL" ->hide-referrer</TT -> and the two can be can be freely - substituted with each other. (<SPAN -CLASS="QUOTE" ->"referrer"</SPAN -> is the - correct English spelling, however the HTTP specification has a bug - it - requires it to be spelled as <SPAN -CLASS="QUOTE" ->"referer"</SPAN ->.) - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+hide-referrer{forge}</PRE -></TD -></TR -></TABLE -> or - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+hide-referrer{http://www.yahoo.com/%7D</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HIDE-USER-AGENT" ->8.5.25. hide-user-agent</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Try to conceal your type of browser and client operating system</P -></DD -><DT ->Effect:</DT -><DD -><P -> Replaces the value of the <SPAN -CLASS="QUOTE" ->"User-Agent:"</SPAN -> HTTP header - in client requests with the specified value. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> Any user-defined string. - </P -></DD -><DT ->Notes:</DT -><DD -><DIV -CLASS="WARNING" -><P -></P -><TABLE -CLASS="WARNING" -BORDER="1" -WIDTH="90%" -><TR -><TD -ALIGN="CENTER" -><B ->Warning</B -></TD -></TR -><TR -><TD -ALIGN="LEFT" -><P -> This can lead to problems on web sites that depend on looking at this header in - order to customize their content for different browsers (which, by the - way, is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->NOT</I -></SPAN -> the right thing to do: good web sites - work browser-independently). - </P -></TD -></TR -></TABLE -></DIV -><P -> Using this action in multi-user setups or wherever different types of - browsers will access the same <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not recommended</I -></SPAN ->. In single-user, single-browser - setups, you might use it to delete your OS version information from - the headers, because it is an invitation to exploit known bugs for your - OS. It is also occasionally useful to forge this in order to access - sites that won't let you in otherwise (though there may be a good - reason in some cases). Example of this: some MSN sites will not - let <SPAN -CLASS="APPLICATION" ->Mozilla</SPAN -> enter, yet forging to a - <SPAN -CLASS="APPLICATION" ->Netscape 6.1</SPAN -> user-agent works just fine. - (Must be just a silly MS goof, I'm sure :-). - </P -><P -> More information on known user-agent strings can be found at - <A -HREF="http://www.user-agents.org/" -TARGET="_top" ->http://www.user-agents.org/</A -> - and - <A -HREF="http://en.wikipedia.org/wiki/User_agent" -TARGET="_top" ->http://en.wikipedia.org/wiki/User_agent</A ->. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+hide-user-agent{Netscape 6.1 (X11; I; Linux 2.4.18 i686)}</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="LIMIT-CONNECT" ->8.5.26. limit-connect</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Prevent abuse of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> as a TCP proxy relay or disable SSL for untrusted sites</P -></DD -><DT ->Effect:</DT -><DD -><P -> Specifies to which ports HTTP CONNECT requests are allowable. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> A comma-separated list of ports or port ranges (the latter using dashes, with the minimum - defaulting to 0 and the maximum to 65K). - </P -></DD -><DT ->Notes:</DT -><DD -><P -> By default, i.e. if no <TT -CLASS="LITERAL" ->limit-connect</TT -> action applies, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> allows HTTP CONNECT requests to all - ports. Use <TT -CLASS="LITERAL" ->limit-connect</TT -> if fine-grained control - is desired for some or all destinations. - </P -><P -> The CONNECT methods exists in HTTP to allow access to secure websites - (<SPAN -CLASS="QUOTE" ->"https://"</SPAN -> 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 server. - This means CONNECT-enabled proxies can be used as TCP relays very easily. - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> relays HTTPS traffic without seeing - the decoded content. Websites can leverage this limitation to circumvent <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s - filters. By specifying an invalid port range you can disable HTTPS entirely. - </P -></DD -><DT ->Example usages:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+limit-connect{443} # Port 443 is OK. -+limit-connect{80,443} # Ports 80 and 443 are OK. -+limit-connect{-3, 7, 20-100, 500-} # Ports less than 3, 7, 20 to 100 and above 500 are OK. -+limit-connect{-} # All ports are OK -+limit-connect{,} # No HTTPS/SSL traffic is allowed</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="PREVENT-COMPRESSION" ->8.5.27. prevent-compression</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Ensure that servers send the content uncompressed, so it can be - passed through <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filter</A -></TT ->s. - </P -></DD -><DT ->Effect:</DT -><DD -><P -> Removes the Accept-Encoding header which can be used to ask for compressed transfer. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> More and more websites send their content compressed by default, which - is generally a good idea and saves bandwidth. But the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filter</A -></TT -> and - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#DEANIMATE-GIFS" ->deanimate-gifs</A -></TT -> - actions need access to the uncompressed data. - </P -><P -> When compiled with zlib support (available since <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.7), content that should be - filtered is decompressed on-the-fly and you don't have to worry about this action. - If you are using an older <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version, or one that hasn't been compiled with zlib - support, this action can be used to convince the server to send the content uncompressed. - </P -><P -> Most text-based instances compress very well, the size is seldom decreased by less than 50%, - for markup-heavy instances like news feeds saving more than 90% of the original size isn't - unusual. - </P -><P -> Not using compression will therefore slow down the transfer, and you should only - enable this action if you really need it. As of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.7 it's disabled in all - predefined action settings. - </P -><P -> Note that some (rare) ill-configured sites don't handle requests for uncompressed - documents correctly. Broken PHP applications tend to send an empty document body, - some IIS versions only send the beginning of the content. If you enable - <TT -CLASS="LITERAL" ->prevent-compression</TT -> per default, you might want to add - exceptions for those sites. See the example for how to do that. - </P -></DD -><DT ->Example usage (sections):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Selectively turn off compression, and enable a filter -# -{ +filter{tiny-textforms} +prevent-compression } -# Match only these sites - .google. - sourceforge.net - sf.net - -# Or instead, we could set a universal default: -# -{ +prevent-compression } - / # Match all sites - -# Then maybe make exceptions for broken sites: -# -{ -prevent-compression } -.compusa.com/</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="OVERWRITE-LAST-MODIFIED" ->8.5.28. overwrite-last-modified</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Prevent yet another way to track the user's steps between sessions.</P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes the <SPAN -CLASS="QUOTE" ->"Last-Modified:"</SPAN -> HTTP server header or modifies its value. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> One of the keywords: <SPAN -CLASS="QUOTE" ->"block"</SPAN ->, <SPAN -CLASS="QUOTE" ->"reset-to-request-time"</SPAN -> - and <SPAN -CLASS="QUOTE" ->"randomize"</SPAN -> - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Removing the <SPAN -CLASS="QUOTE" ->"Last-Modified:"</SPAN -> header is useful for filter - testing, where you want to force a real reload instead of getting status - code <SPAN -CLASS="QUOTE" ->"304"</SPAN ->, which would cause the browser to reuse the old - version of the page. - </P -><P -> The <SPAN -CLASS="QUOTE" ->"randomize"</SPAN -> option overwrites the value of the - <SPAN -CLASS="QUOTE" ->"Last-Modified:"</SPAN -> header with a randomly chosen time - between the original value and the current time. In theory the server - could send each document with a different <SPAN -CLASS="QUOTE" ->"Last-Modified:"</SPAN -> - header to track visits without using cookies. <SPAN -CLASS="QUOTE" ->"Randomize"</SPAN -> - makes it impossible and the browser can still revalidate cached documents. - </P -><P -> <SPAN -CLASS="QUOTE" ->"reset-to-request-time"</SPAN -> overwrites the value of the - <SPAN -CLASS="QUOTE" ->"Last-Modified:"</SPAN -> header with the current time. You could use - this option together with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HIDE-IF-MODIFIED-SINCE" ->hide-if-modified-since</A -></TT -> - to further customize your random range. - </P -><P -> The preferred parameter here is <SPAN -CLASS="QUOTE" ->"randomize"</SPAN ->. It is safe - to use, as long as the time settings are more or less correct. - If the server sets the <SPAN -CLASS="QUOTE" ->"Last-Modified:"</SPAN -> header to the time - of the request, the random range becomes zero and the value stays the same. - Therefore you should later randomize it a second time with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HIDE-IF-MODIFIED-SINCE" ->hided-if-modified-since</A -></TT ->, - just to be sure. - </P -><P -> It is also recommended to use this action together with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-IF-NONE-MATCH" ->crunch-if-none-match</A -></TT ->. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Let the browser revalidate without being tracked across sessions -{ +hide-if-modified-since{-60} \ - +overwrite-last-modified{randomize} \ - +crunch-if-none-match} -/</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="REDIRECT" ->8.5.29. redirect</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Redirect requests to other sites. - </P -></DD -><DT ->Effect:</DT -><DD -><P -> Convinces the browser that the requested document has been moved - to another location and the browser should get it from there. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized</P -></DD -><DT ->Parameter:</DT -><DD -><P -> An absolute URL or a single pcrs command. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Requests to which this action applies are answered with a - HTTP redirect to URLs of your choosing. The new URL is - either provided as parameter, or derived by applying a - single pcrs command to the original URL. - </P -><P -> This action will be ignored if you use it together with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT ->. - It can be combined with - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FAST-REDIRECTS" ->fast-redirects{check-decoded-url}</A -></TT -> - to redirect to a decoded version of a rewritten URL. - </P -><P -> Use this action carefully, make sure not to create redirection loops - and be aware that using your own redirects might make it - possible to fingerprint your requests. - </P -><P -> In case of problems with your redirects, or simply to watch - them working, enable <A -HREF="config.html#DEBUG" ->debug 128</A ->. - </P -></DD -><DT ->Example usages:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Replace example.com's style sheet with another one -{ +redirect{http://localhost/css-replacements/example.com.css%7D } - example.com/stylesheet.css - -# Create a short, easy to remember nickname for a favorite site -# (relies on the browser accept and forward invalid URLs to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->) -{ +redirect{http://www.privoxy.org/user-manual/actions-file.html%7D } - a - -# Always use the expanded view for Undeadly.org articles -# (Note the $ at the end of the URL pattern to make sure -# the request for the rewritten URL isn't redirected as well) -{+redirect{s@$@&mode=expanded@}} -undeadly.org/cgi?action=article&sid=\d*$ - -# Redirect Google search requests to MSN -{+redirect{s@^http://%5B%5E/%5D*/search%5C?q=(%5B%5E&%5D*).*@http://search.msn.com/res... -.google.com/search - -# Redirect MSN search requests to Yahoo -{+redirect{s@^http://%5B%5E/%5D*/results%5C.aspx%5C?q=(%5B%5E&%5D*).*@http://search.ya... -search.msn.com//results.aspx?q= - -# Redirect remote requests for this manual -# to the local version delivered by Privoxy -{+redirect{s@^http://www@http://config@%7D%7D -www.privoxy.org/user-manual/</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SERVER-HEADER-FILTER" ->8.5.30. server-header-filter</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Rewrite or remove single server headers. - </P -></DD -><DT ->Effect:</DT -><DD -><P -> All server headers to which this action applies are filtered on-the-fly - through the specified regular expression based substitutions. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> The name of a server-header filter, as defined in one of the - <A -HREF="filter-file.html" ->filter files</A ->. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Server-header filters are applied to each header on its own, not to - all at once. This makes it easier to diagnose problems, but on the downside - you can't write filters that only change header x if header y's value is z. - You can do that by using tags though. - </P -><P -> Server-header filters are executed after the other header actions have finished - and use their output as input. - </P -><P -> Please refer to the <A -HREF="filter-file.html" ->filter file chapter</A -> - to learn which server-header filters are available by default, and how to - create your own. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{+server-header-filter{html-to-xml}} -example.org/xml-instance-that-is-delivered-as-html - -{+server-header-filter{xml-to-html}} -example.org/instance-that-is-delivered-as-xml-but-is-not - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SERVER-HEADER-TAGGER" ->8.5.31. server-header-tagger</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Enable or disable filters based on the Content-Type header. - </P -></DD -><DT ->Effect:</DT -><DD -><P -> Server headers to which this action applies are filtered on-the-fly through - the specified regular expression based substitutions, the result is used as - tag. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> The name of a server-header tagger, as defined in one of the - <A -HREF="filter-file.html" ->filter files</A ->. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Server-header taggers are applied to each header on its own, - and as the header isn't modified, each tagger <SPAN -CLASS="QUOTE" ->"sees"</SPAN -> - the original. - </P -><P -> Server-header taggers are executed before all other header actions - that modify server headers. Their tags can be used to control - all of the other server-header actions, the content filters - and the crunch actions (<A -HREF="actions-file.html#REDIRECT" ->redirect</A -> - and <A -HREF="actions-file.html#BLOCK" ->block</A ->). - </P -><P -> Obviously crunching based on tags created by server-header taggers - doesn't prevent the request from showing up in the server's log file. - </P -></DD -><DT ->Example usage (section):</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Tag every request with the content type declared by the server -{+server-header-tagger{content-type}} -/ - </PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SESSION-COOKIES-ONLY" ->8.5.32. session-cookies-only</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P -> Allow only temporary <SPAN -CLASS="QUOTE" ->"session"</SPAN -> cookies (for the current - browser session <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->only</I -></SPAN ->). - </P -></DD -><DT ->Effect:</DT -><DD -><P -> Deletes the <SPAN -CLASS="QUOTE" ->"expires"</SPAN -> field from <SPAN -CLASS="QUOTE" ->"Set-Cookie:"</SPAN -> - server headers. Most browsers will not store such cookies permanently and - forget them in between sessions. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Boolean.</P -></DD -><DT ->Parameter:</DT -><DD -><P -> N/A - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This is less strict than <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -></TT -> / - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -></TT -> and allows you to browse - websites that insist or rely on setting cookies, without compromising your privacy too badly. - </P -><P -> Most browsers will not permanently store cookies that have been processed by - <TT -CLASS="LITERAL" ->session-cookies-only</TT -> and will forget about them between sessions. - This makes profiling cookies useless, but won't break sites which require cookies so - that you can log in for transactions. This is generally turned on for all - sites, and is the recommended setting. - </P -><P -> It makes <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->no sense at all</I -></SPAN -> to use <TT -CLASS="LITERAL" ->session-cookies-only</TT -> - together with <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -></TT -> or - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -></TT ->. If you do, cookies - will be plainly killed. - </P -><P -> Note that it is up to the browser how it handles such cookies without an <SPAN -CLASS="QUOTE" ->"expires"</SPAN -> - field. If you use an exotic browser, you might want to try it out to be sure. - </P -><P -> This setting also has no effect on cookies that may have been stored - previously by the browser before starting <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - These would have to be removed manually. - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> also uses - the <A -HREF="actions-file.html#FILTER-CONTENT-COOKIES" ->content-cookies filter</A -> - to block some types of cookies. Content cookies are not effected by - <TT -CLASS="LITERAL" ->session-cookies-only</TT ->. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+session-cookies-only</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SET-IMAGE-BLOCKER" ->8.5.33. set-image-blocker</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Typical use:</DT -><DD -><P ->Choose the replacement for blocked images</P -></DD -><DT ->Effect:</DT -><DD -><P -> This action alone doesn't do anything noticeable. If <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN -> - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and</I -></SPAN -> <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->also</I -></SPAN -> - apply, i.e. if the request is to be blocked as an image, - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->then</I -></SPAN -> the parameter of this action decides what will be - sent as a replacement. - </P -></DD -><DT ->Type:</DT -><DD -><P ->Parameterized.</P -></DD -><DT ->Parameter:</DT -><DD -><P -></P -><UL -><LI -><P -> <SPAN -CLASS="QUOTE" ->"pattern"</SPAN -> to send a built-in checkerboard pattern image. The image is visually - decent, scales very well, and makes it obvious where banners were busted. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"blank"</SPAN -> to send a built-in transparent image. This makes banners disappear - completely, but makes it hard to detect where <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has blocked - images on a given page and complicates troubleshooting if <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - has blocked innocent images, like navigation icons. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"<TT -CLASS="REPLACEABLE" -><I ->target-url</I -></TT ->"</SPAN -> to - send a redirect to <TT -CLASS="REPLACEABLE" -><I ->target-url</I -></TT ->. You can redirect - to any image anywhere, even in your local filesystem via <SPAN -CLASS="QUOTE" ->"file:///"</SPAN -> URL. - (But note that not all browsers support redirecting to a local file system). - </P -><P -> A good application of redirects is to use special <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->-built-in - URLs, which send the built-in images, as <TT -CLASS="REPLACEABLE" -><I ->target-url</I -></TT ->. - This has the same visual effect as specifying <SPAN -CLASS="QUOTE" ->"blank"</SPAN -> or <SPAN -CLASS="QUOTE" ->"pattern"</SPAN -> in - the first place, but enables your browser to cache the replacement image, instead of requesting - it over and over again. - </P -></LI -></UL -></DD -><DT ->Notes:</DT -><DD -><P -> The URLs for the built-in images are <SPAN -CLASS="QUOTE" ->"http://config.privoxy.org/send-banner?type=<TT -CLASS="REPLACEABLE" -><I ->type</I -></TT ->"</SPAN ->, where <TT -CLASS="REPLACEABLE" -><I ->type</I -></TT -> is - either <SPAN -CLASS="QUOTE" ->"blank"</SPAN -> or <SPAN -CLASS="QUOTE" ->"pattern"</SPAN ->. - </P -><P -> There is a third (advanced) type, called <SPAN -CLASS="QUOTE" ->"auto"</SPAN ->. It is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->NOT</I -></SPAN -> to be - used in <TT -CLASS="LITERAL" ->set-image-blocker</TT ->, but meant for use from <A -HREF="filter-file.html" ->filters</A ->. - Auto will select the type of image that would have applied to the referring page, had it been an image. - </P -></DD -><DT ->Example usage:</DT -><DD -><P -> Built-in pattern: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+set-image-blocker{pattern}</PRE -></TD -></TR -></TABLE -> - </P -><P -> Redirect to the BSD daemon: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+set-image-blocker{http://www.freebsd.org/gifs/dae_up3.gif%7D</PRE -></TD -></TR -></TABLE -> - </P -><P -> Redirect to the built-in pattern for better caching: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" ->+set-image-blocker{http://config.privoxy.org/send-banner?type=pattern%7D</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="AEN4093" ->8.5.34. Summary</A -></H3 -><P -> 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, and other criteria, he may depend on. There is no way to have hard - and fast rules for all sites. See the <A -HREF="appendix.html#ACTIONSANAT" ->Appendix</A -> for a brief example on troubleshooting - actions.</P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="ALIASES" ->8.6. Aliases</A -></H2 -><P -> Custom <SPAN -CLASS="QUOTE" ->"actions"</SPAN ->, known to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - as <SPAN -CLASS="QUOTE" ->"aliases"</SPAN ->, can be defined by combining other actions. - These can in turn be invoked just like the built-in actions. - Currently, an alias name can contain any character except space, tab, - <SPAN -CLASS="QUOTE" ->"="</SPAN ->, - <SPAN -CLASS="QUOTE" ->"{"</SPAN -> and <SPAN -CLASS="QUOTE" ->"}"</SPAN ->, but we <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->strongly - recommend</I -></SPAN -> that you only use <SPAN -CLASS="QUOTE" ->"a"</SPAN -> to <SPAN -CLASS="QUOTE" ->"z"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"0"</SPAN -> to <SPAN -CLASS="QUOTE" ->"9"</SPAN ->, <SPAN -CLASS="QUOTE" ->"+"</SPAN ->, and <SPAN -CLASS="QUOTE" ->"-"</SPAN ->. - Alias names are not case sensitive, and are not required to start with a - <SPAN -CLASS="QUOTE" ->"+"</SPAN -> or <SPAN -CLASS="QUOTE" ->"-"</SPAN -> sign, since they are merely textually - expanded.</P -><P -> Aliases can be used throughout the actions file, but they <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->must be - defined in a special section at the top of the file!</I -></SPAN -> - And there can only be one such section per actions file. Each actions file may - have its own alias section, and the aliases defined in it are only visible - within that file.</P -><P -> There are two main reasons to use aliases: One is to save typing for frequently - used combinations of actions, the other one is a gain in flexibility: If you - decide once how you want to handle shops by defining an alias called - <SPAN -CLASS="QUOTE" ->"shop"</SPAN ->, you can later change your policy on shops in - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->one</I -></SPAN -> place, and your changes will take effect everywhere - in the actions file where the <SPAN -CLASS="QUOTE" ->"shop"</SPAN -> alias is used. Calling aliases - by their purpose also makes your actions files more readable.</P -><P -> Currently, there is one big drawback to using aliases, though: - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s built-in web-based action file - editor honors aliases when reading the actions files, but it expands - them before writing. So the effects of your aliases are of course preserved, - but the aliases themselves are lost when you edit sections that use aliases - with it.</P -><P -> Now let's define some aliases...</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # Useful custom aliases we can use later. - # - # Note the (required!) section header line and that this section - # must be at the top of the actions file! - # - {{alias}} - - # These aliases just save typing later: - # (Note that some already use other aliases!) - # - +crunch-all-cookies = +<A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -> +<A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -> - -crunch-all-cookies = -<A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -> -<A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -> - +block-as-image = +block{Blocked image.} +handle-as-image - allow-all-cookies = -crunch-all-cookies -<A -HREF="actions-file.html#SESSION-COOKIES-ONLY" ->session-cookies-only</A -> -<A -HREF="actions-file.html#FILTER-CONTENT-COOKIES" ->filter{content-cookies}</A -> - - # These aliases define combinations of actions - # that are useful for certain types of sites: - # - fragile = -<A -HREF="actions-file.html#BLOCK" ->block</A -> -<A -HREF="actions-file.html#FILTER" ->filter</A -> -crunch-all-cookies -<A -HREF="actions-file.html#FAST-REDIRECTS" ->fast-redirects</A -> -<A -HREF="actions-file.html#HIDE-REFERER" ->hide-referrer</A -> -<A -HREF="actions-file.html#PREVENT-COMPRESSION" ->prevent-compression</A -> - - shop = -crunch-all-cookies -<A -HREF="actions-file.html#FILTER-ALL-POPUPS" ->filter{all-popups}</A -> - - # Short names for other aliases, for really lazy people ;-) - # - c0 = +crunch-all-cookies - c1 = -crunch-all-cookies</PRE -></TD -></TR -></TABLE -></P -><P -> ...and put them to use. These sections would appear in the lower part of an - actions file and define exceptions to the default actions (as specified further - up for the <SPAN -CLASS="QUOTE" ->"/"</SPAN -> pattern):</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # These sites are either very complex or very keen on - # user data and require minimal interference to work: - # - {fragile} - .office.microsoft.com - .windowsupdate.microsoft.com - # Gmail is really mail.google.com, not gmail.com - mail.google.com - - # Shopping sites: - # Allow cookies (for setting and retrieving your customer data) - # - {shop} - .quietpc.com - .worldpay.com # for quietpc.com - mybank.example.com - - # These shops require pop-ups: - # - {-filter{all-popups} -filter{unsolicited-popups}} - .dabs.com - .overclockers.co.uk</PRE -></TD -></TR -></TABLE -></P -><P -> Aliases like <SPAN -CLASS="QUOTE" ->"shop"</SPAN -> and <SPAN -CLASS="QUOTE" ->"fragile"</SPAN -> are typically used for - <SPAN -CLASS="QUOTE" ->"problem"</SPAN -> sites that require more than one action to be disabled - in order to function properly.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="ACT-EXAMPLES" ->8.7. Actions Files Tutorial</A -></H2 -><P -> The above chapters have shown <A -HREF="actions-file.html" ->which actions files - there are and how they are organized</A ->, how actions are <A -HREF="actions-file.html#ACTIONS" ->specified</A -> and <A -HREF="actions-file.html#ACTIONS-APPLY" ->applied - to URLs</A ->, how <A -HREF="actions-file.html#AF-PATTERNS" ->patterns</A -> work, and how to - define and use <A -HREF="actions-file.html#ALIASES" ->aliases</A ->. Now, let's look at an - example <TT -CLASS="FILENAME" ->match-all.action</TT ->, <TT -CLASS="FILENAME" ->default.action</TT -> - and <TT -CLASS="FILENAME" ->user.action</TT -> file and see how all these pieces come together:</P -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="AEN4157" ->8.7.1. match-all.action</A -></H3 -><P -> Remember <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all actions are disabled when matching starts</I -></SPAN ->, - so we have to explicitly enable the ones we want.</P -><P -> While the <TT -CLASS="FILENAME" ->match-all.action</TT -> file only contains a - single section, it is probably the most important one. It has only one - pattern, <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->/</TT ->"</SPAN ->, but this pattern - <A -HREF="actions-file.html#AF-PATTERNS" ->matches all URLs</A ->. Therefore, the set of - actions used in this <SPAN -CLASS="QUOTE" ->"default"</SPAN -> section <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->will - be applied to all requests as a start</I -></SPAN ->. It can be partly or - wholly overridden by other actions files like <TT -CLASS="FILENAME" ->default.action</TT -> - and <TT -CLASS="FILENAME" ->user.action</TT ->, but it will still be largely responsible - for your overall browsing experience.</P -><P -> Again, at the start of matching, all actions are disabled, so there is - no need to disable any actions here. (Remember: a <SPAN -CLASS="QUOTE" ->"+"</SPAN -> - preceding the action name enables the action, a <SPAN -CLASS="QUOTE" ->"-"</SPAN -> disables!). - Also note how this long line has been made more readable by splitting it into - multiple lines with line continuation.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ \ - +<A -HREF="actions-file.html#CHANGE-X-FORWARDED-FOR" ->change-x-forwarded-for{block}</A -> \ - +<A -HREF="actions-file.html#HIDE-FROM-HEADER" ->hide-from-header{block}</A -> \ - +<A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker{pattern}</A -> \ -} -/ # Match all URLs - </PRE -></TD -></TR -></TABLE -></P -><P -> The default behavior is now set.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="AEN4179" ->8.7.2. default.action</A -></H3 -><P -> If you aren't a developer, there's no need for you to edit the - <TT -CLASS="FILENAME" ->default.action</TT -> file. It is maintained by - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developers and if you disagree with some of the - sections, you should overrule them in your <TT -CLASS="FILENAME" ->user.action</TT ->.</P -><P -> Understanding the <TT -CLASS="FILENAME" ->default.action</TT -> file can - help you with your <TT -CLASS="FILENAME" ->user.action</TT ->, though.</P -><P -> The first section in this file is a special section for internal use - that prevents older <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> versions from reading the file:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->########################################################################## -# Settings -- Don't change! For internal Privoxy use ONLY. -########################################################################## -{{settings}} -for-privoxy-version=3.0.11</PRE -></TD -></TR -></TABLE -></P -><P -> After that comes the (optional) alias section. We'll use the example - section from the above <A -HREF="actions-file.html#ALIASES" ->chapter on aliases</A ->, - that also explains why and how aliases are used:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->########################################################################## -# Aliases -########################################################################## -{{alias}} - - # These aliases just save typing later: - # (Note that some already use other aliases!) - # - +crunch-all-cookies = +<A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -> +<A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -> - -crunch-all-cookies = -<A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -> -<A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -> - +block-as-image = +block{Blocked image.} +handle-as-image - mercy-for-cookies = -crunch-all-cookies -<A -HREF="actions-file.html#SESSION-COOKIES-ONLY" ->session-cookies-only</A -> -<A -HREF="actions-file.html#FILTER-CONTENT-COOKIES" ->filter{content-cookies}</A -> - - # These aliases define combinations of actions - # that are useful for certain types of sites: - # - fragile = -<A -HREF="actions-file.html#BLOCK" ->block</A -> -<A -HREF="actions-file.html#FILTER" ->filter</A -> -crunch-all-cookies -<A -HREF="actions-file.html#FAST-REDIRECTS" ->fast-redirects</A -> -<A -HREF="actions-file.html#HIDE-REFERER" ->hide-referrer</A -> - shop = -crunch-all-cookies -<A -HREF="actions-file.html#FILTER-ALL-POPUPS" ->filter{all-popups}</A -></PRE -></TD -></TR -></TABLE -></P -><P -> The first of our specialized sections is concerned with <SPAN -CLASS="QUOTE" ->"fragile"</SPAN -> - sites, i.e. sites that require minimum interference, because they are either - very complex or very keen on tracking you (and have mechanisms in place that - make them unusable for people who avoid being tracked). We will simply use - our pre-defined <TT -CLASS="LITERAL" ->fragile</TT -> alias instead of stating the list - of actions explicitly:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->########################################################################## -# Exceptions for sites that'll break under the default action set: -########################################################################## - -# "Fragile" Use a minimum set of actions for these sites (see alias above): -# -{ fragile } -.office.microsoft.com # surprise, surprise! -.windowsupdate.microsoft.com -mail.google.com</PRE -></TD -></TR -></TABLE -></P -><P -> Shopping sites are not as fragile, but they typically - require cookies to log in, and pop-up windows for shopping - carts or item details. Again, we'll use a pre-defined alias:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Shopping sites: -# -{ shop } -.quietpc.com -.worldpay.com # for quietpc.com -.jungle.com -.scan.co.uk</PRE -></TD -></TR -></TABLE -></P -><P -> The <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FAST-REDIRECTS" ->fast-redirects</A -></TT -> - action, which may have been enabled in <TT -CLASS="FILENAME" ->match-all.action</TT ->, - breaks some sites. So disable it for popular sites where we know it misbehaves:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ -<A -HREF="actions-file.html#FAST-REDIRECTS" ->fast-redirects</A -> } -login.yahoo.com -edit.*.yahoo.com -.google.com -.altavista.com/.*(like|url|link):http -.altavista.com/trans.*urltext=http -.nytimes.com</PRE -></TD -></TR -></TABLE -></P -><P -> It is important that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> knows which - URLs belong to images, so that <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->if</I -></SPAN -> they are to - be blocked, a substitute image can be sent, rather than an HTML page. - Contacting the remote site to find out is not an option, since it - would destroy the loading time advantage of banner blocking, and it - would feed the advertisers information about you. We can mark any - URL as an image with the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT -> action, - and marking all URLs that end in a known image file extension is a - good start:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->########################################################################## -# Images: -########################################################################## - -# Define which file types will be treated as images, in case they get -# blocked further down this file: -# -{ +<A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -> } -/.*.(gif|jpe?g|png|bmp|ico)$</PRE -></TD -></TR -></TABLE -></P -><P -> And then there are known banner sources. They often use scripts to - generate the banners, so it won't be visible from the URL that the - request is for an image. Hence we block them <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and</I -></SPAN -> - mark them as images in one go, with the help of our - <TT -CLASS="LITERAL" ->+block-as-image</TT -> alias defined above. (We could of - course just as well use <TT -CLASS="LITERAL" ->+<A -HREF="actions-file.html#BLOCK" ->block</A -> - +<A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT -> here.) - Remember that the type of the replacement image is chosen by the - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A -></TT -> - action. Since all URLs have matched the default section with its - <TT -CLASS="LITERAL" ->+<A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A ->{pattern}</TT -> - action before, it still applies and needn't be repeated:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Known ad generators: -# -{ +block-as-image } -ar.atwola.com -.ad.doubleclick.net -.ad.*.doubleclick.net -.a.yimg.com/(?:(?!/i/).)*$ -.a[0-9].yimg.com/(?:(?!/i/).)*$ -bs*.gsanet.com -.qkimg.net</PRE -></TD -></TR -></TABLE -></P -><P -> One of the most important jobs of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is to block banners. Many of these can be <SPAN -CLASS="QUOTE" ->"blocked"</SPAN -> - by the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filter</A ->{banners-by-size}</TT -> - action, which we enabled above, and which deletes the references to banner - images from the pages while they are loaded, so the browser doesn't request - them anymore, and hence they don't need to be blocked here. But this naturally - doesn't catch all banners, and some people choose not to use filters, so we - need a comprehensive list of patterns for banner URLs here, and apply the - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> action to them.</P -><P -> First comes many generic patterns, which do most of the work, by - matching typical domain and path name components of banners. Then comes - a list of individual patterns for specific sites, which is omitted here - to keep the example short:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->########################################################################## -# Block these fine banners: -########################################################################## -{ <A -HREF="actions-file.html#BLOCK" ->+block{Banner ads.}</A -> } - -# Generic patterns: -# -ad*. -.*ads. -banner?. -count*. -/.*count(er)?.(pl|cgi|exe|dll|asp|php[34]?) -/(?:.*/)?(publicite|werbung|rekla(ma|me|am)|annonse|maino(kset|nta|s)?)/ - -# Site-specific patterns (abbreviated): -# -.hitbox.com</PRE -></TD -></TR -></TABLE -></P -><P -> It's quite remarkable how many advertisers actually call their banner - servers ads.<TT -CLASS="REPLACEABLE" -><I ->company</I -></TT ->.com, or call the directory - in which the banners are stored simply <SPAN -CLASS="QUOTE" ->"banners"</SPAN ->. So the above - generic patterns are surprisingly effective.</P -><P -> But being very generic, they necessarily also catch URLs that we don't want - to block. The pattern <TT -CLASS="LITERAL" ->.*ads.</TT -> e.g. catches - <SPAN -CLASS="QUOTE" ->"nasty-<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->ads</I -></SPAN ->.nasty-corp.com"</SPAN -> as intended, - but also <SPAN -CLASS="QUOTE" ->"downlo<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->ads</I -></SPAN ->.sourcefroge.net"</SPAN -> or - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->ads</I -></SPAN ->l.some-provider.net."</SPAN -> So here come some - well-known exceptions to the <TT -CLASS="LITERAL" ->+<A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> - section above.</P -><P -> Note that these are exceptions to exceptions from the default! Consider the URL - <SPAN -CLASS="QUOTE" ->"downloads.sourcefroge.net"</SPAN ->: Initially, all actions are deactivated, - so it wouldn't get blocked. Then comes the defaults section, which matches the - URL, but just deactivates the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> - action once again. Then it matches <TT -CLASS="LITERAL" ->.*ads.</TT ->, an exception to the - general non-blocking policy, and suddenly - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->+block</A -></TT -> applies. And now, it'll match - <TT -CLASS="LITERAL" ->.*loads.</TT ->, where <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->-block</A -></TT -> - applies, so (unless it matches <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->again</I -></SPAN -> further down) it ends up - with no <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> action applying.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->########################################################################## -# Save some innocent victims of the above generic block patterns: -########################################################################## - -# By domain: -# -{ -<A -HREF="actions-file.html#BLOCK" ->block</A -> } -adv[io]*. # (for advogato.org and advice.*) -adsl. # (has nothing to do with ads) -adobe. # (has nothing to do with ads either) -ad[ud]*. # (adult.* and add.*) -.edu # (universities don't host banners (yet!)) -.*loads. # (downloads, uploads etc) - -# By path: -# -/.*loads/ - -# Site-specific: -# -www.globalintersec.com/adv # (adv = advanced) -www.ugu.com/sui/ugu/adv</PRE -></TD -></TR -></TABLE -></P -><P -> Filtering source code can have nasty side effects, - so make an exception for our friends at sourceforge.net, - and all paths with <SPAN -CLASS="QUOTE" ->"cvs"</SPAN -> in them. Note that - <TT -CLASS="LITERAL" ->-<A -HREF="actions-file.html#FILTER" ->filter</A -></TT -> - disables <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> filters in one fell swoop!</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Don't filter code! -# -{ -<A -HREF="actions-file.html#FILTER" ->filter</A -> } -/(.*/)?cvs -bugzilla. -developer. -wiki. -.sourceforge.net</PRE -></TD -></TR -></TABLE -></P -><P -> The actual <TT -CLASS="FILENAME" ->default.action</TT -> is of course much more - comprehensive, but we hope this example made clear how it works.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="AEN4292" ->8.7.3. user.action</A -></H3 -><P -> So far we are painting with a broad brush by setting general policies, - which would be a reasonable starting point for many people. Now, - you might want to be more specific and have customized rules that - are more suitable to your personal habits and preferences. These would - be for narrowly defined situations like your ISP or your bank, and should - be placed in <TT -CLASS="FILENAME" ->user.action</TT ->, which is parsed after all other - actions files and hence has the last word, over-riding any previously - defined actions. <TT -CLASS="FILENAME" ->user.action</TT -> is also a - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->safe</I -></SPAN -> place for your personal settings, since - <TT -CLASS="FILENAME" ->default.action</TT -> is actively maintained by the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developers and you'll probably want - to install updated versions from time to time.</P -><P -> So let's look at a few examples of things that one might typically do in - <TT -CLASS="FILENAME" ->user.action</TT ->: </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># My user.action file. <fred@example.com></PRE -></TD -></TR -></TABLE -></P -><P -> As <A -HREF="actions-file.html#ALIASES" ->aliases</A -> are local to the actions - file that they are defined in, you can't use the ones from - <TT -CLASS="FILENAME" ->default.action</TT ->, unless you repeat them here:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Aliases are local to the file they are defined in. -# (Re-)define aliases for this file: -# -{{alias}} -# -# These aliases just save typing later, and the alias names should -# be self explanatory. -# -+crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies --crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies - allow-all-cookies = -crunch-all-cookies -session-cookies-only - allow-popups = -filter{all-popups} -+block-as-image = +block{Blocked as image.} +handle-as-image --block-as-image = -block - -# These aliases define combinations of actions that are useful for -# certain types of sites: -# -fragile = -block -crunch-all-cookies -filter -fast-redirects -hide-referrer -shop = -crunch-all-cookies allow-popups - -# Allow ads for selected useful free sites: -# -allow-ads = -block -filter{banners-by-size} -filter{banners-by-link} - -# Alias for specific file types that are text, but might have conflicting -# MIME types. We want the browser to force these to be text documents. -handle-as-text = -<A -HREF="actions-file.html#FILTER" ->filter</A -> +-<A -HREF="actions-file.html#CONTENT-TYPE-OVERWRITE" ->content-type-overwrite{text/plain}</A -> +-<A -HREF="actions-file.html#FORCE-TEXT-MODE" ->force-text-mode</A -> -<A -HREF="actions-file.html#HIDE-CONTENT-DISPOSITION" ->hide-content-disposition</A -></PRE -></TD -></TR -></TABLE -> </P -><P -> Say you have accounts on some sites that you visit regularly, and - you don't want to have to log in manually each time. So you'd like - to allow persistent cookies for these sites. The - <TT -CLASS="LITERAL" ->allow-all-cookies</TT -> alias defined above does exactly - that, i.e. it disables crunching of cookies in any direction, and the - processing of cookies to make them only temporary.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ allow-all-cookies } - sourceforge.net - .yahoo.com - .msdn.microsoft.com - .redhat.com</PRE -></TD -></TR -></TABLE -></P -><P -> Your bank is allergic to some filter, but you don't know which, so you disable them all:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ -<A -HREF="actions-file.html#FILTER" ->filter</A -> } - .your-home-banking-site.com</PRE -></TD -></TR -></TABLE -></P -><P -> Some file types you may not want to filter for various reasons:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Technical documentation is likely to contain strings that might -# erroneously get altered by the JavaScript-oriented filters: -# -.tldp.org -/(.*/)?selfhtml/ - -# And this stupid host sends streaming video with a wrong MIME type, -# so that Privoxy thinks it is getting HTML and starts filtering: -# -stupid-server.example.com/</PRE -></TD -></TR -></TABLE -></P -><P -> Example of a simple <A -HREF="actions-file.html#BLOCK" ->block</A -> action. Say you've - seen an ad on your favourite page on example.com that you want to get rid of. - You have right-clicked the image, selected <SPAN -CLASS="QUOTE" ->"copy image location"</SPAN -> - and pasted the URL below while removing the leading http://, into a - <TT -CLASS="LITERAL" ->{ +block{} }</TT -> section. Note that <TT -CLASS="LITERAL" ->{ +handle-as-image - }</TT -> need not be specified, since all URLs ending in - <TT -CLASS="LITERAL" ->.gif</TT -> will be tagged as images by the general rules as set - in default.action anyway:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ +<A -HREF="actions-file.html#BLOCK" ->block</A ->{Nasty ads.} } - www.example.com/nasty-ads/sponsor.gif - another.example.net/more/junk/here/</PRE -></TD -></TR -></TABLE -></P -><P -> The URLs of dynamically generated banners, especially from large banner - farms, often don't use the well-known image file name extensions, which - makes it impossible for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to guess - the file type just by looking at the URL. - You can use the <TT -CLASS="LITERAL" ->+block-as-image</TT -> alias defined above for - these cases. - Note that objects which match this rule but then turn out NOT to be an - image are typically rendered as a <SPAN -CLASS="QUOTE" ->"broken image"</SPAN -> icon by the - browser. Use cautiously.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ +block-as-image } - .doubleclick.net - .fastclick.net - /Realmedia/ads/ - ar.atwola.com/</PRE -></TD -></TR -></TABLE -></P -><P -> Now you noticed that the default configuration breaks Forbes Magazine, - but you were too lazy to find out which action is the culprit, and you - were again too lazy to give <A -HREF="contact.html" ->feedback</A ->, so - you just used the <TT -CLASS="LITERAL" ->fragile</TT -> alias on the site, and - -- <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->whoa!</I -></SPAN -> -- it worked. The <TT -CLASS="LITERAL" ->fragile</TT -> - aliases disables those actions that are most likely to break a site. Also, - good for testing purposes to see if it is <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - that is causing the problem or not. We later find other regular sites - that misbehave, and add those to our personalized list of troublemakers:</P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ fragile } - .forbes.com - webmail.example.com - .mybank.com</PRE -></TD -></TR -></TABLE -></P -><P -> You like the <SPAN -CLASS="QUOTE" ->"fun"</SPAN -> text replacements in <TT -CLASS="FILENAME" ->default.filter</TT ->, - but it is disabled in the distributed actions file. - So you'd like to turn it on in your private, - update-safe config, once and for all:</P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ +<A -HREF="actions-file.html#FILTER-FUN" ->filter{fun}</A -> } - / # For ALL sites!</PRE -></TD -></TR -></TABLE -></P -><P -> Note that the above is not really a good idea: There are exceptions - to the filters in <TT -CLASS="FILENAME" ->default.action</TT -> for things that - really shouldn't be filtered, like code on CVS->Web interfaces. Since - <TT -CLASS="FILENAME" ->user.action</TT -> has the last word, these exceptions - won't be valid for the <SPAN -CLASS="QUOTE" ->"fun"</SPAN -> filtering specified here.</P -><P -> You might also worry about how your favourite free websites are - funded, and find that they rely on displaying banner advertisements - to survive. So you might want to specifically allow banners for those - sites that you feel provide value to you:</P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ allow-ads } - .sourceforge.net - .slashdot.org - .osdn.net</PRE -></TD -></TR -></TABLE -> </P -><P -> Note that <TT -CLASS="LITERAL" ->allow-ads</TT -> has been aliased to - <TT -CLASS="LITERAL" ->-<A -HREF="actions-file.html#BLOCK" ->block</A -></TT ->, - <TT -CLASS="LITERAL" ->-<A -HREF="actions-file.html#FILTER-BANNERS-BY-SIZE" ->filter{banners-by-size}</A -></TT ->, and - <TT -CLASS="LITERAL" ->-<A -HREF="actions-file.html#FILTER-BANNERS-BY-LINK" ->filter{banners-by-link}</A -></TT -> above.</P -><P -> Invoke another alias here to force an over-ride of the MIME type <TT -CLASS="LITERAL" -> application/x-sh</TT -> which typically would open a download type - dialog. In my case, I want to look at the shell script, and then I can save - it should I choose to.</P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ handle-as-text } - /.*.sh$</PRE -></TD -></TR -></TABLE -> </P -><P -> <TT -CLASS="FILENAME" ->user.action</TT -> is generally the best place to define - exceptions and additions to the default policies of - <TT -CLASS="FILENAME" ->default.action</TT ->. Some actions are safe to have their - default policies set here though. So let's set a default policy to have a - <SPAN -CLASS="QUOTE" ->"blank"</SPAN -> image as opposed to the checkerboard pattern for - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->ALL</I -></SPAN -> sites. <SPAN -CLASS="QUOTE" ->"/"</SPAN -> of course matches all URL - paths and patterns:</P -><P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->{ +<A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker{blank}</A -> } -/ # ALL sites</PRE -></TD -></TR -></TABLE -></P -></DIV -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="config.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="filter-file.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->The Main Configuration File</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Filter Files</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/appendix.html b/external/privoxy/doc/webserver/user-manual/appendix.html deleted file mode 100644 index 4df57a4..0000000 --- a/external/privoxy/doc/webserver/user-manual/appendix.html +++ /dev/null @@ -1,2187 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Appendix</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="See Also" -HREF="seealso.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="seealso.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -> </TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="APPENDIX" ->14. Appendix</A -></H1 -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="REGEX" ->14.1. Regular Expressions</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> uses Perl-style <SPAN -CLASS="QUOTE" ->"regular - expressions"</SPAN -> in its <A -HREF="actions-file.html" ->actions - files</A -> and <A -HREF="filter-file.html" ->filter file</A ->, - through the <A -HREF="http://www.pcre.org/" -TARGET="_top" ->PCRE</A -> and - <SPAN -CLASS="APPLICATION" ->PCRS</SPAN -> libraries.</P -><P -> If you are reading this, you probably don't understand what <SPAN -CLASS="QUOTE" ->"regular - expressions"</SPAN -> are, or what they can do. So this will be a very brief - introduction only. A full explanation would require a <A -HREF="http://www.oreilly.com/catalog/regex/" -TARGET="_top" ->book</A -> ;-)</P -><P -> Regular expressions provide a language to describe patterns that can be - run against strings of characters (letter, numbers, etc), to see if they - match the string or not. The patterns are themselves (sometimes complex) - strings of literal characters, combined with wild-cards, and other special - characters, called meta-characters. The <SPAN -CLASS="QUOTE" ->"meta-characters"</SPAN -> have - special meanings and are used to build complex patterns to be matched against. - Perl Compatible Regular Expressions are an especially convenient - <SPAN -CLASS="QUOTE" ->"dialect"</SPAN -> of the regular expression language.</P -><P -> To make a simple analogy, we do something similar when we use wild-card - characters when listing files with the <B -CLASS="COMMAND" ->dir</B -> command in DOS. - <TT -CLASS="LITERAL" ->*.*</TT -> matches all filenames. The <SPAN -CLASS="QUOTE" ->"special"</SPAN -> - character here is the asterisk which matches any and all characters. We can be - more specific and use <TT -CLASS="LITERAL" ->?</TT -> to match just individual - characters. So <SPAN -CLASS="QUOTE" ->"dir file?.text"</SPAN -> would match - <SPAN -CLASS="QUOTE" ->"file1.txt"</SPAN ->, <SPAN -CLASS="QUOTE" ->"file2.txt"</SPAN ->, etc. We are pattern - matching, using a similar technique to <SPAN -CLASS="QUOTE" ->"regular expressions"</SPAN ->!</P -><P -> Regular expressions do essentially the same thing, but are much, much more - powerful. There are many more <SPAN -CLASS="QUOTE" ->"special characters"</SPAN -> and ways of - building complex patterns however. Let's look at a few of the common ones, - and then some examples:</P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->.</I -></SPAN -> - Matches any single character, e.g. <SPAN -CLASS="QUOTE" ->"a"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"A"</SPAN ->, <SPAN -CLASS="QUOTE" ->"4"</SPAN ->, <SPAN -CLASS="QUOTE" ->":"</SPAN ->, or <SPAN -CLASS="QUOTE" ->"@"</SPAN ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->?</I -></SPAN -> - The preceding character or expression is matched ZERO or ONE - times. Either/or. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->+</I -></SPAN -> - The preceding character or expression is matched ONE or MORE - times. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->*</I -></SPAN -> - The preceding character or expression is matched ZERO or MORE - times. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -></I -></SPAN -> - The <SPAN -CLASS="QUOTE" ->"escape"</SPAN -> character denotes that - the following character should be taken literally. This is used where one of the - special characters (e.g. <SPAN -CLASS="QUOTE" ->"."</SPAN ->) needs to be taken literally and - not as a special meta-character. Example: <SPAN -CLASS="QUOTE" ->"example.com"</SPAN ->, makes - sure the period is recognized only as a period (and not expanded to its - meta-character meaning of any single character). - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->[ ]</I -></SPAN -> - Characters enclosed in brackets will be matched if - any of the enclosed characters are encountered. For instance, <SPAN -CLASS="QUOTE" ->"[0-9]"</SPAN -> - matches any numeric digit (zero through nine). As an example, we can combine - this with <SPAN -CLASS="QUOTE" ->"+"</SPAN -> to match any digit one of more times: <SPAN -CLASS="QUOTE" ->"[0-9]+"</SPAN ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->( )</I -></SPAN -> - parentheses are used to group a sub-expression, - or multiple sub-expressions. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->|</I -></SPAN -> - The <SPAN -CLASS="QUOTE" ->"bar"</SPAN -> character works like an - <SPAN -CLASS="QUOTE" ->"or"</SPAN -> conditional statement. A match is successful if the - sub-expression on either side of <SPAN -CLASS="QUOTE" ->"|"</SPAN -> matches. As an example: - <SPAN -CLASS="QUOTE" ->"/(this|that) example/"</SPAN -> uses grouping and the bar character - and would match either <SPAN -CLASS="QUOTE" ->"this example"</SPAN -> or <SPAN -CLASS="QUOTE" ->"that - example"</SPAN ->, and nothing else. - </TD -></TR -></TBODY -></TABLE -><P -></P -></P -><P -> These are just some of the ones you are likely to use when matching URLs with - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, 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:</P -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><TT -CLASS="LITERAL" ->/.*/banners/.*</TT -></I -></SPAN -> - A simple example - that uses the common combination of <SPAN -CLASS="QUOTE" ->"."</SPAN -> and <SPAN -CLASS="QUOTE" ->"*"</SPAN -> 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 - (<SPAN -CLASS="QUOTE" ->".*"</SPAN ->) another literal forward slash, the string - <SPAN -CLASS="QUOTE" ->"banners"</SPAN ->, another forward slash, and lastly another - <SPAN -CLASS="QUOTE" ->".*"</SPAN ->. We are building - a directory path here. This will match any file with the path that has a - directory named <SPAN -CLASS="QUOTE" ->"banners"</SPAN -> in it. The <SPAN -CLASS="QUOTE" ->".*"</SPAN -> 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: - <SPAN -CLASS="QUOTE" ->"/eye/hate/spammers/banners/annoy_me_please.gif"</SPAN ->, or just - <SPAN -CLASS="QUOTE" ->"/banners/annoying.html"</SPAN ->, or almost an infinite number of other - possible combinations, just so it has <SPAN -CLASS="QUOTE" ->"banners"</SPAN -> in the path - somewhere.</P -><P -> And now something a little more complex:</P -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><TT -CLASS="LITERAL" ->/.*/adv((er)?ts?|ertis(ing|ements?))?/</TT -></I -></SPAN -> - - We have several literal forward slashes again (<SPAN -CLASS="QUOTE" ->"/"</SPAN ->), so we are - building another expression that is a file path statement. We have another - <SPAN -CLASS="QUOTE" ->".*"</SPAN ->, so we are matching against any conceivable sub-path, just so - it matches our expression. The only true literal that <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->must - match</I -></SPAN -> our pattern is <SPAN -CLASS="APPLICATION" ->adv</SPAN ->, together with - the forward slashes. What comes after the <SPAN -CLASS="QUOTE" ->"adv"</SPAN -> string is the - interesting part. </P -><P -> Remember the <SPAN -CLASS="QUOTE" ->"?"</SPAN -> means the preceding expression (either a - literal character or anything grouped with <SPAN -CLASS="QUOTE" ->"(...)"</SPAN -> in this case) - can exist or not, since this means either zero or one match. So - <SPAN -CLASS="QUOTE" ->"((er)?ts?|ertis(ing|ements?))"</SPAN -> is optional, as are the - individual sub-expressions: <SPAN -CLASS="QUOTE" ->"(er)"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"(ing|ements?)"</SPAN ->, and the <SPAN -CLASS="QUOTE" ->"s"</SPAN ->. The <SPAN -CLASS="QUOTE" ->"|"</SPAN -> - means <SPAN -CLASS="QUOTE" ->"or"</SPAN ->. We have two of those. For instance, - <SPAN -CLASS="QUOTE" ->"(ing|ements?)"</SPAN ->, can expand to match either <SPAN -CLASS="QUOTE" ->"ing"</SPAN -> - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->OR</I -></SPAN -> <SPAN -CLASS="QUOTE" ->"ements?"</SPAN ->. What is being done here, is an - attempt at matching as many variations of <SPAN -CLASS="QUOTE" ->"advertisement"</SPAN ->, and - similar, as possible. So this would expand to match just <SPAN -CLASS="QUOTE" ->"adv"</SPAN ->, - or <SPAN -CLASS="QUOTE" ->"advert"</SPAN ->, or <SPAN -CLASS="QUOTE" ->"adverts"</SPAN ->, or - <SPAN -CLASS="QUOTE" ->"advertising"</SPAN ->, or <SPAN -CLASS="QUOTE" ->"advertisement"</SPAN ->, or - <SPAN -CLASS="QUOTE" ->"advertisements"</SPAN ->. You get the idea. But it would not match - <SPAN -CLASS="QUOTE" ->"advertizements"</SPAN -> (with a <SPAN -CLASS="QUOTE" ->"z"</SPAN ->). We could fix that by - changing our regular expression to: - <SPAN -CLASS="QUOTE" ->"/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/"</SPAN ->, which would then match - either spelling.</P -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" -><TT -CLASS="LITERAL" ->/.*/advert[0-9]+.(gif|jpe?g)</TT -></I -></SPAN -> - Again - another path statement with forward slashes. Anything in the square brackets - <SPAN -CLASS="QUOTE" ->"[ ]"</SPAN -> can be matched. This is using <SPAN -CLASS="QUOTE" ->"0-9"</SPAN -> as a - shorthand expression to mean any digit one through nine. It is the same as - saying <SPAN -CLASS="QUOTE" ->"0123456789"</SPAN ->. So any digit matches. The <SPAN -CLASS="QUOTE" ->"+"</SPAN -> - 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: <SPAN -CLASS="QUOTE" ->"(gif|jpe?g)"</SPAN ->. - This includes a <SPAN -CLASS="QUOTE" ->"|"</SPAN ->, so this needs to match the expression on - either side of that bar character also. A simple <SPAN -CLASS="QUOTE" ->"gif"</SPAN -> on one side, and the other - side will in turn match either <SPAN -CLASS="QUOTE" ->"jpeg"</SPAN -> or <SPAN -CLASS="QUOTE" ->"jpg"</SPAN ->, - since the <SPAN -CLASS="QUOTE" ->"?"</SPAN -> means the letter <SPAN -CLASS="QUOTE" ->"e"</SPAN -> 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 <SPAN -CLASS="QUOTE" ->"advert"</SPAN ->, then one or more digits, and a <SPAN -CLASS="QUOTE" ->"."</SPAN -> - (which is now a literal, and not a special character, since it is escaped - with <SPAN -CLASS="QUOTE" ->""</SPAN ->), and lastly either <SPAN -CLASS="QUOTE" ->"gif"</SPAN ->, or - <SPAN -CLASS="QUOTE" ->"jpeg"</SPAN ->, or <SPAN -CLASS="QUOTE" ->"jpg"</SPAN ->. Some possible matches would - include: <SPAN -CLASS="QUOTE" ->"//advert1.jpg"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"/nasty/ads/advert1234.gif"</SPAN ->, - <SPAN -CLASS="QUOTE" ->"/banners/from/hell/advert99.jpg"</SPAN ->. It would not match - <SPAN -CLASS="QUOTE" ->"advert1.gif"</SPAN -> (no leading slash), or - <SPAN -CLASS="QUOTE" ->"/adverts232.jpg"</SPAN -> (the expression does not include an - <SPAN -CLASS="QUOTE" ->"s"</SPAN ->), or <SPAN -CLASS="QUOTE" ->"/advert1.jsp"</SPAN -> (<SPAN -CLASS="QUOTE" ->"jsp"</SPAN -> is not - in the expression anywhere).</P -><P -> We are barely scratching the surface of regular expressions here so that you - can understand the default <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - 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 :/</P -><P -> More reading on Perl Compatible Regular expressions: - <A -HREF="http://perldoc.perl.org/perlre.html" -TARGET="_top" ->http://perldoc.perl.org/perlre.html</A -></P -><P -> For information on regular expression based substitutions and their applications - in filters, please see the <A -HREF="filter-file.html" ->filter file tutorial</A -> - in this manual.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN5174" ->14.2. Privoxy's Internal Pages</A -></H2 -><P -> Since <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> proxies each requested - web page, it is easy for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to - trap certain special URLs. In this way, we can talk directly to - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, and see how it is - configured, see how our rules are being applied, change these - rules and other configuration options, and even turn - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> filtering off, all with - a web browser. </P -><P -> The URLs listed below are the special ones that allow direct access - to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. Of course, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> must be running to access these. If - not, you will get a friendly error message. Internet access is not - necessary either.</P -><P -> <P -></P -><UL -><LI -><P -> - Privoxy main page: - </P -><A -NAME="AEN5188" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> - </P -></BLOCKQUOTE -><P -> There is a shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A -> (But it - doesn't provide a fall-back to a real page, in case the request is not - sent through <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->) - </P -></LI -><LI -><P -> - Show information about the current configuration, including viewing and - editing of actions files: - </P -><A -NAME="AEN5196" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A -> - </P -></BLOCKQUOTE -></LI -><LI -><P -> - Show the source code version numbers: - </P -><A -NAME="AEN5201" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/show-version" -TARGET="_top" ->http://config.privoxy.org/show-version</A -> - </P -></BLOCKQUOTE -></LI -><LI -><P -> - Show the browser's request headers: - </P -><A -NAME="AEN5206" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/show-request" -TARGET="_top" ->http://config.privoxy.org/show-request</A -> - </P -></BLOCKQUOTE -></LI -><LI -><P -> - Show which actions apply to a URL and why: - </P -><A -NAME="AEN5211" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/show-url-info" -TARGET="_top" ->http://config.privoxy.org/show-url-info</A -> - </P -></BLOCKQUOTE -></LI -><LI -><P -> - Toggle Privoxy on or off. This feature can be turned off/on in the main - <TT -CLASS="FILENAME" ->config</TT -> file. When toggled <SPAN -CLASS="QUOTE" ->"off"</SPAN ->, <SPAN -CLASS="QUOTE" ->"Privoxy"</SPAN -> - continues to run, but only as a pass-through proxy, with no actions taking - place: - </P -><A -NAME="AEN5219" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/toggle" -TARGET="_top" ->http://config.privoxy.org/toggle</A -> - </P -></BLOCKQUOTE -><P -> Short cuts. Turn off, then on: - </P -><A -NAME="AEN5223" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/toggle?set=disable" -TARGET="_top" ->http://config.privoxy.org/toggle?set=disable</A -> - </P -></BLOCKQUOTE -><A -NAME="AEN5226" -></A -><BLOCKQUOTE -CLASS="BLOCKQUOTE" -><P -> - <A -HREF="http://config.privoxy.org/toggle?set=enable" -TARGET="_top" ->http://config.privoxy.org/toggle?set=enable</A -> - </P -></BLOCKQUOTE -></LI -></UL -></P -><P -> These may be bookmarked for quick reference. See next. </P -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="BOOKMARKLETS" ->14.2.1. Bookmarklets</A -></H3 -><P -> Below are some <SPAN -CLASS="QUOTE" ->"bookmarklets"</SPAN -> to allow you to easily access a - <SPAN -CLASS="QUOTE" ->"mini"</SPAN -> version of some of <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - special pages. 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 should work for testing).</P -><P -> To save them, right-click the link and choose <SPAN -CLASS="QUOTE" ->"Add to Favorites"</SPAN -> - (IE) or <SPAN -CLASS="QUOTE" ->"Add Bookmark"</SPAN -> (Netscape). You will get a warning that - the bookmark <SPAN -CLASS="QUOTE" ->"may not be safe"</SPAN -> - just click OK. Then you can run the - Bookmarklet directly from your favorites/bookmarks. For even faster access, - you can put them on the <SPAN -CLASS="QUOTE" ->"Links"</SPAN -> bar (IE) or the <SPAN -CLASS="QUOTE" ->"Personal - Toolbar"</SPAN -> (Netscape), and run them with a single click. </P -><P -> <P -></P -><UL -><LI -><P -> <A -HREF="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&set=enabled%27,%27ijbstatus%27,%...));" -TARGET="_top" ->Privoxy - Enable</A -> - </P -></LI -><LI -><P -> <A -HREF="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&set=disabled%27,%27ijbstatus%27,...));" -TARGET="_top" ->Privoxy - Disable</A -> - </P -></LI -><LI -><P -> <A -HREF="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&set=toggle%27,%27ijbstatus%27,%2...));" -TARGET="_top" ->Privoxy - Toggle Privoxy</A -> (Toggles between enabled and disabled) - </P -></LI -><LI -><P -> <A -HREF="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y%27,%27ijbstatus%27,%27width=250,heig...));" -TARGET="_top" ->Privoxy- View Status</A -> - </P -></LI -><LI -><P -> <A -HREF="javascript:void(window.open('http://config.privoxy.org/show-url-info?url=%27+escape(location.href),%27Why...));" -TARGET="_top" ->Privoxy - Why?</A -> - </P -></LI -></UL -></P -><P -> Credit: The site which gave us the general idea for these bookmarklets is - <A -HREF="http://www.bookmarklets.com/" -TARGET="_top" ->www.bookmarklets.com</A ->. They - have more information about bookmarklets. </P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CHAIN" ->14.3. Chain of Events</A -></H2 -><P -> Let's take a quick look at how some of <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - core features are triggered, and the ensuing sequence of events when a web - page is requested by your browser:</P -><P -> <P -></P -><UL -><LI -><P -> First, your web browser requests a web page. The browser knows to send - the request to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, which will in turn, - relay the request to the remote web server after passing the following - tests: - </P -></LI -><LI -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> traps any request for its own internal CGI - pages (e.g <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->) and sends the CGI page back to the browser. - </P -></LI -><LI -><P -> Next, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> checks to see if the URL - matches any <A -HREF="actions-file.html#BLOCK" -><SPAN -CLASS="QUOTE" ->"+block"</SPAN -></A -> patterns. If - so, the URL is then blocked, and the remote web server will not be contacted. - <A -HREF="actions-file.html#HANDLE-AS-IMAGE" -><SPAN -CLASS="QUOTE" ->"+handle-as-image"</SPAN -></A -> - and - <A -HREF="actions-file.html#HANDLE-AS-EMPTY-DOCUMENT" -><SPAN -CLASS="QUOTE" ->"+handle-as-empty-document"</SPAN -></A -> - are then checked, and if there is no match, an - HTML <SPAN -CLASS="QUOTE" ->"BLOCKED"</SPAN -> page is sent back to the browser. Otherwise, if - it does match, an image is returned for the former, and an empty text - document for the latter. The type of image would depend on the setting of - <A -HREF="actions-file.html#SET-IMAGE-BLOCKER" -><SPAN -CLASS="QUOTE" ->"+set-image-blocker"</SPAN -></A -> - (blank, checkerboard pattern, or an HTTP redirect to an image elsewhere). - </P -></LI -><LI -><P -> Untrusted URLs are blocked. If URLs are being added to the - <TT -CLASS="FILENAME" ->trust</TT -> file, then that is done. - </P -></LI -><LI -><P -> If the URL pattern matches the <A -HREF="actions-file.html#FAST-REDIRECTS" -><SPAN -CLASS="QUOTE" ->"+fast-redirects"</SPAN -></A -> action, - it is then processed. Unwanted parts of the requested URL are stripped. - </P -></LI -><LI -><P -> Now the rest of the client browser's request headers are processed. If any - of these match any of the relevant actions (e.g. <A -HREF="actions-file.html#HIDE-USER-AGENT" -><SPAN -CLASS="QUOTE" ->"+hide-user-agent"</SPAN -></A ->, - etc.), headers are suppressed or forged as determined by these actions and - their parameters. - </P -></LI -><LI -><P -> Now the web server starts sending its response back (i.e. typically a web - page). - </P -></LI -><LI -><P -> First, the server headers are read and processed to determine, among other - things, the MIME type (document type) and encoding. The headers are then - filtered as determined by the - <A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" -><SPAN -CLASS="QUOTE" ->"+crunch-incoming-cookies"</SPAN -></A ->, - <A -HREF="actions-file.html#SESSION-COOKIES-ONLY" -><SPAN -CLASS="QUOTE" ->"+session-cookies-only"</SPAN -></A ->, - and <A -HREF="actions-file.html#DOWNGRADE-HTTP-VERSION" -><SPAN -CLASS="QUOTE" ->"+downgrade-http-version"</SPAN -></A -> - actions. - </P -></LI -><LI -><P -> If any <A -HREF="actions-file.html#FILTER" -><SPAN -CLASS="QUOTE" ->"+filter"</SPAN -></A -> action - or <A -HREF="actions-file.html#DEANIMATE-GIFS" -><SPAN -CLASS="QUOTE" ->"+deanimate-gifs"</SPAN -></A -> - action applies (and the document type fits the action), the rest of the page is - read into memory (up to a configurable limit). Then the filter rules (from - <TT -CLASS="FILENAME" ->default.filter</TT -> and any other filter files) are - processed against the buffered content. Filters are applied in the order - they are specified in one of the filter files. Animated GIFs, if present, - are reduced to either the first or last frame, depending on the action - setting.The entire page, which is now filtered, is then sent by - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> back to your browser. - </P -><P -> If neither a <A -HREF="actions-file.html#FILTER" -><SPAN -CLASS="QUOTE" ->"+filter"</SPAN -></A -> action - or <A -HREF="actions-file.html#DEANIMATE-GIFS" -><SPAN -CLASS="QUOTE" ->"+deanimate-gifs"</SPAN -></A -> - matches, then <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> passes the raw data through - to the client browser as it becomes available. - </P -></LI -><LI -><P -> As the browser receives the now (possibly filtered) page content, it - reads and then requests any URLs that may be embedded within the page - source, e.g. ad images, stylesheets, JavaScript, other HTML documents (e.g. - frames), sounds, etc. For each of these objects, the browser issues a - separate request (this is easily viewable in <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - logs). And each such request is in turn processed just as above. Note that a - complex web page will have many, many such embedded URLs. If these - secondary requests are to a different server, then quite possibly a very - differing set of actions is triggered. - </P -></LI -></UL -></P -><P -> NOTE: This is somewhat of a simplistic overview of what happens with each URL - request. For the sake of brevity and simplicity, we have focused on - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> core features only.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="ACTIONSANAT" ->14.4. Troubleshooting: Anatomy of an Action</A -></H2 -><P -> The way <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> applies - <A -HREF="actions-file.html#ACTIONS" ->actions</A -> and <A -HREF="actions-file.html#FILTER" ->filters</A -> - 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 - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->see</I -></SPAN -> just what <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is - doing. Especially, if something <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is doing - is causing us a problem inadvertently. It can be a little daunting to look at - the actions and filters files themselves, since they tend to be filled with - <A -HREF="appendix.html#REGEX" ->regular expressions</A -> whose consequences are not - always so obvious. </P -><P -> One quick test to see if <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is causing a problem - or not, is to disable it temporarily. This should be the first troubleshooting - step. See <A -HREF="appendix.html#BOOKMARKLETS" ->the Bookmarklets</A -> section on a quick - and easy way to do this (be sure to flush caches afterward!). Looking at the - logs is a good idea too. (Note that both the toggle feature and logging are - enabled via <TT -CLASS="FILENAME" ->config</TT -> file settings, and may need to be - turned <SPAN -CLASS="QUOTE" ->"on"</SPAN ->.)</P -><P -> Another easy troubleshooting step to try is if you have done any - customization of your installation, revert back to the installed - defaults and see if that helps. There are times the developers get complaints - about one thing or another, and the problem is more related to a customized - configuration issue.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> also provides the - <A -HREF="http://config.privoxy.org/show-url-info" -TARGET="_top" ->http://config.privoxy.org/show-url-info</A -> - page that can show us very specifically how <SPAN -CLASS="APPLICATION" ->actions</SPAN -> - are being applied to any given URL. This is a big help for troubleshooting.</P -><P -> First, enter one URL (or partial URL) at the prompt, and then - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will tell us - how the current configuration will handle it. This will not - help with filtering effects (i.e. the <A -HREF="actions-file.html#FILTER" -><SPAN -CLASS="QUOTE" ->"+filter"</SPAN -></A -> action) from - one of the filter files since this is handled very - differently and not so easy to trap! 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 <SPAN -CLASS="QUOTE" ->"View - Page Source"</SPAN -> option for this. Or right click on the ad, and grab the - URL.</P -><P -> Let's try an example, <A -HREF="http://google.com" -TARGET="_top" ->google.com</A ->, - and look at it one section at a time in a sample configuration (your real - configuration may vary):</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> Matches for http://www.google.com: - - In file: default.action <SPAN -CLASS="GUIBUTTON" ->[ View ]</SPAN -> <SPAN -CLASS="GUIBUTTON" ->[ Edit ]</SPAN -> - - {+change-x-forwarded-for{block} - +deanimate-gifs {last} - +fast-redirects {check-decoded-url} - +filter {refresh-tags} - +filter {img-reorder} - +filter {banners-by-size} - +filter {webbugs} - +filter {jumping-windows} - +filter {ie-exploits} - +hide-from-header {block} - +hide-referrer {forge} - +session-cookies-only - +set-image-blocker {pattern} -/ - - { -session-cookies-only } - .google.com - - { -fast-redirects } - .google.com - -In file: user.action <SPAN -CLASS="GUIBUTTON" ->[ View ]</SPAN -> <SPAN -CLASS="GUIBUTTON" ->[ Edit ]</SPAN -> -(no matches in this file) </PRE -></TD -></TR -></TABLE -></P -><P -> This is telling us how we have defined our - <A -HREF="actions-file.html#ACTIONS" -><SPAN -CLASS="QUOTE" ->"actions"</SPAN -></A ->, and - which ones match for our test case, <SPAN -CLASS="QUOTE" ->"google.com"</SPAN ->. - Displayed is all the actions that are available to us. Remember, - the <TT -CLASS="LITERAL" ->+</TT -> sign denotes <SPAN -CLASS="QUOTE" ->"on"</SPAN ->. <TT -CLASS="LITERAL" ->-</TT -> - denotes <SPAN -CLASS="QUOTE" ->"off"</SPAN ->. So some are <SPAN -CLASS="QUOTE" ->"on"</SPAN -> here, but many - are <SPAN -CLASS="QUOTE" ->"off"</SPAN ->. Each example we try may provide a slightly different - end result, depending on our configuration directives.</P -><P -> The first listing - is for our <TT -CLASS="FILENAME" ->default.action</TT -> file. The large, multi-line - listing, is how the actions are set to match for all URLs, i.e. our default - settings. If you look at your <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> file, this would be the - section just below the <SPAN -CLASS="QUOTE" ->"aliases"</SPAN -> section near the top. This - will apply to all URLs as signified by the single forward slash at the end - of the listing -- <SPAN -CLASS="QUOTE" ->" / "</SPAN ->.</P -><P -> But we have defined additional actions that would be exceptions to these general - rules, and then we list specific URLs (or patterns) that these exceptions - would apply to. Last match wins. Just below this then are two explicit - matches for <SPAN -CLASS="QUOTE" ->".google.com"</SPAN ->. The first is negating our previous - cookie setting, which was for <A -HREF="actions-file.html#SESSION-COOKIES-ONLY" -><SPAN -CLASS="QUOTE" ->"+session-cookies-only"</SPAN -></A -> - (i.e. not persistent). So we will allow persistent cookies for google, at - least that is how it is in this example. The second turns - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->off</I -></SPAN -> any <A -HREF="actions-file.html#FAST-REDIRECTS" -><SPAN -CLASS="QUOTE" ->"+fast-redirects"</SPAN -></A -> - action, allowing this to take place unmolested. Note that there is a leading - dot here -- <SPAN -CLASS="QUOTE" ->".google.com"</SPAN ->. This will match any hosts and - sub-domains, in the google.com domain also, such as - <SPAN -CLASS="QUOTE" ->"www.google.com"</SPAN -> or <SPAN -CLASS="QUOTE" ->"mail.google.com"</SPAN ->. But it would not - match <SPAN -CLASS="QUOTE" ->"www.google.de"</SPAN ->! So, apparently, we have these two actions - defined as exceptions to the general rules at the top somewhere in the lower - part of our <TT -CLASS="FILENAME" ->default.action</TT -> file, and - <SPAN -CLASS="QUOTE" ->"google.com"</SPAN -> is referenced somewhere in these latter sections.</P -><P -> Then, for our <TT -CLASS="FILENAME" ->user.action</TT -> file, we again have no hits. - So there is nothing google-specific that we might have added to our own, local - configuration. If there was, those actions would over-rule any actions from - previously processed files, such as <TT -CLASS="FILENAME" ->default.action</TT ->. - <TT -CLASS="FILENAME" ->user.action</TT -> typically has the last word. This is the - best place to put hard and fast exceptions,</P -><P -> And finally we pull it all together in the bottom section and summarize how - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is applying all its <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> - to <SPAN -CLASS="QUOTE" ->"google.com"</SPAN ->: </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> Final results: - - -add-header - -block - +change-x-forwarded-for{block} - -client-header-filter{hide-tor-exit-notation} - -content-type-overwrite - -crunch-client-header - -crunch-if-none-match - -crunch-incoming-cookies - -crunch-outgoing-cookies - -crunch-server-header - +deanimate-gifs {last} - -downgrade-http-version - -fast-redirects - -filter {js-events} - -filter {content-cookies} - -filter {all-popups} - -filter {banners-by-link} - -filter {tiny-textforms} - -filter {frameset-borders} - -filter {demoronizer} - -filter {shockwave-flash} - -filter {quicktime-kioskmode} - -filter {fun} - -filter {crude-parental} - -filter {site-specifics} - -filter {js-annoyances} - -filter {html-annoyances} - +filter {refresh-tags} - -filter {unsolicited-popups} - +filter {img-reorder} - +filter {banners-by-size} - +filter {webbugs} - +filter {jumping-windows} - +filter {ie-exploits} - -filter {google} - -filter {yahoo} - -filter {msn} - -filter {blogspot} - -filter {no-ping} - -force-text-mode - -handle-as-empty-document - -handle-as-image - -hide-accept-language - -hide-content-disposition - +hide-from-header {block} - -hide-if-modified-since - +hide-referrer {forge} - -hide-user-agent - -limit-connect - -overwrite-last-modified - -prevent-compression - -redirect - -server-header-filter{xml-to-html} - -server-header-filter{html-to-xml} - -session-cookies-only - +set-image-blocker {pattern} </PRE -></TD -></TR -></TABLE -></P -><P -> Notice the only difference here to the previous listing, is to - <SPAN -CLASS="QUOTE" ->"fast-redirects"</SPAN -> and <SPAN -CLASS="QUOTE" ->"session-cookies-only"</SPAN ->, - which are activated specifically for this site in our configuration, - and thus show in the <SPAN -CLASS="QUOTE" ->"Final Results"</SPAN ->.</P -><P -> Now another example, <SPAN -CLASS="QUOTE" ->"ad.doubleclick.net"</SPAN ->:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { +block{Domains starts with "ad"} } - ad*. - - { +block{Domain contains "ad"} } - .ad. - - { +block{Doubleclick banner server} +handle-as-image } - .[a-vx-z]*.doubleclick.net</PRE -></TD -></TR -></TABLE -></P -><P -> We'll just show the interesting part here - the explicit matches. It is - matched three different times. Two <SPAN -CLASS="QUOTE" ->"+block{}"</SPAN -> sections, - and a <SPAN -CLASS="QUOTE" ->"+block{} +handle-as-image"</SPAN ->, - which is the expanded form of one of our aliases that had been defined as: - <SPAN -CLASS="QUOTE" ->"+block-as-image"</SPAN ->. (<A -HREF="actions-file.html#ALIASES" -><SPAN -CLASS="QUOTE" ->"Aliases"</SPAN -></A -> are defined in - the first section of the actions file and typically used to combine more - than one action.)</P -><P -> 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 <SPAN -CLASS="QUOTE" ->"ad.doubleclick.net"</SPAN -> - is done here -- as both a <A -HREF="actions-file.html#BLOCK" -><SPAN -CLASS="QUOTE" ->"+block{}"</SPAN -></A -> - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and</I -></SPAN -> an - <A -HREF="actions-file.html#HANDLE-AS-IMAGE" -><SPAN -CLASS="QUOTE" ->"+handle-as-image"</SPAN -></A ->. - The custom alias <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->+block-as-image</TT ->"</SPAN -> just - simplifies the process and make it more readable.</P -><P -> One last example. Let's try <SPAN -CLASS="QUOTE" ->"http://www.example.net/adsl/HOWTO/"</SPAN ->. - This one is giving us problems. We are getting a blank page. Hmmm ...</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> Matches for http://www.example.net/adsl/HOWTO/: - - In file: default.action <SPAN -CLASS="GUIBUTTON" ->[ View ]</SPAN -> <SPAN -CLASS="GUIBUTTON" ->[ Edit ]</SPAN -> - - {-add-header - -block - +change-x-forwarded-for{block} - -client-header-filter{hide-tor-exit-notation} - -content-type-overwrite - -crunch-client-header - -crunch-if-none-match - -crunch-incoming-cookies - -crunch-outgoing-cookies - -crunch-server-header - +deanimate-gifs - -downgrade-http-version - +fast-redirects {check-decoded-url} - -filter {js-events} - -filter {content-cookies} - -filter {all-popups} - -filter {banners-by-link} - -filter {tiny-textforms} - -filter {frameset-borders} - -filter {demoronizer} - -filter {shockwave-flash} - -filter {quicktime-kioskmode} - -filter {fun} - -filter {crude-parental} - -filter {site-specifics} - -filter {js-annoyances} - -filter {html-annoyances} - +filter {refresh-tags} - -filter {unsolicited-popups} - +filter {img-reorder} - +filter {banners-by-size} - +filter {webbugs} - +filter {jumping-windows} - +filter {ie-exploits} - -filter {google} - -filter {yahoo} - -filter {msn} - -filter {blogspot} - -filter {no-ping} - -force-text-mode - -handle-as-empty-document - -handle-as-image - -hide-accept-language - -hide-content-disposition - +hide-from-header{block} - +hide-referer{forge} - -hide-user-agent - -overwrite-last-modified - +prevent-compression - -redirect - -server-header-filter{xml-to-html} - -server-header-filter{html-to-xml} - +session-cookies-only - +set-image-blocker{blank} } - / - - { +block{Path contains "ads".} +handle-as-image } - /ads</PRE -></TD -></TR -></TABLE -></P -><P -> Ooops, the <SPAN -CLASS="QUOTE" ->"/adsl/"</SPAN -> is matching <SPAN -CLASS="QUOTE" ->"/ads"</SPAN -> in our - configuration! But we did not want this at all! Now we see why we get the - blank page. It is actually triggering two different actions here, and - the effects are aggregated so that the URL is blocked, and <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is told - to treat the block as if it were an image. But this is, of course, all wrong. - We could now add a new action below this (or better in our own - <TT -CLASS="FILENAME" ->user.action</TT -> file) that explicitly - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->un</I -></SPAN -> blocks ( - <A -HREF="actions-file.html#BLOCK" -><SPAN -CLASS="QUOTE" ->"{-block}"</SPAN -></A ->) paths with - <SPAN -CLASS="QUOTE" ->"adsl"</SPAN -> in them (remember, last match in the configuration - wins). There are various ways to handle such exceptions. Example:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { -block } - /adsl</PRE -></TD -></TR -></TABLE -></P -><P -> Now the page displays ;-) - Remember to flush your browser's caches when making these kinds of changes to - your configuration to insure that you get a freshly delivered page! Or, try - using <TT -CLASS="LITERAL" ->Shift+Reload</TT ->.</P -><P -> But now what about a situation where we get no explicit matches like - we did with:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { +block{Path starts with "ads".} +handle-as-image } - /ads</PRE -></TD -></TR -></TABLE -></P -><P -> That actually was very helpful 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 of <TT -CLASS="FILENAME" ->default.action</TT -> 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 - <A -HREF="actions-file.html#FILTER" -><SPAN -CLASS="QUOTE" ->"+filter"</SPAN -></A -> actions. - These tend to be harder to troubleshoot. - Try adding the URL for the site to one of aliases that turn off - <A -HREF="actions-file.html#FILTER" -><SPAN -CLASS="QUOTE" ->"+filter"</SPAN -></A ->:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { shop } - .quietpc.com - .worldpay.com # for quietpc.com - .jungle.com - .scan.co.uk - .forbes.com</PRE -></TD -></TR -></TABLE -></P -><P -> <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->{ shop }</TT ->"</SPAN -> is an <SPAN -CLASS="QUOTE" ->"alias"</SPAN -> that expands to - <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->{ -filter -session-cookies-only }</TT ->"</SPAN ->. - Or you could do your own exception to negate filtering: </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { -filter } - # Disable ALL filter actions for sites in this section - .forbes.com - developer.ibm.com - localhost</PRE -></TD -></TR -></TABLE -></P -><P -> This would turn off all filtering for these sites. This is best - put in <TT -CLASS="FILENAME" ->user.action</TT ->, for local site - exceptions. Note that when a simple domain pattern is used by itself (without - the subsequent path portion), all sub-pages within that domain are included - automatically in the scope of the action.</P -><P -> Images that are inexplicably being blocked, may well be hitting the -<A -HREF="actions-file.html#FILTER-BANNERS-BY-SIZE" -><SPAN -CLASS="QUOTE" ->"+filter{banners-by-size}"</SPAN -></A -> - rule, which assumes - that images of certain sizes are ad banners (works well - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->most of the time</I -></SPAN -> since these tend to be standardized).</P -><P -> <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->{ fragile }</TT ->"</SPAN -> is an alias that disables most - actions that are the most likely to cause trouble. This can be used as a - last resort for problem sites. </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> { fragile } - # Handle with care: easy to break - mail.google. - mybank.example.com</PRE -></TD -></TR -></TABLE -></P -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Remember to flush caches!</I -></SPAN -> Note that the - <TT -CLASS="LITERAL" ->mail.google</TT -> reference lacks the TLD portion (e.g. - <SPAN -CLASS="QUOTE" ->".com"</SPAN ->). This will effectively match any TLD with - <TT -CLASS="LITERAL" ->google</TT -> in it, such as <TT -CLASS="LITERAL" ->mail.google.de.</TT ->, - just as an example.</P -><P -> - If this still does not work, you will have to go through the remaining - actions one by one to find which one(s) is causing the problem.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="seealso.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -> </TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->See Also</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -> </TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/config.html b/external/privoxy/doc/webserver/user-manual/config.html deleted file mode 100644 index 05e19b3..0000000 --- a/external/privoxy/doc/webserver/user-manual/config.html +++ /dev/null @@ -1,4121 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->The Main Configuration File</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Privoxy Configuration" -HREF="configuration.html"><LINK -REL="NEXT" -TITLE="Actions Files" -HREF="actions-file.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="configuration.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="actions-file.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CONFIG" ->7. The Main Configuration File</A -></H1 -><P -> Again, the main configuration file is named <TT -CLASS="FILENAME" ->config</TT -> on - Linux/Unix/BSD and OS/2, and <TT -CLASS="FILENAME" ->config.txt</TT -> 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:</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->confdir /etc/privoxy</I -></SPAN -></P -> - </TT -> </P -><P -> Assigns the value <TT -CLASS="LITERAL" ->/etc/privoxy</TT -> to the option - <TT -CLASS="LITERAL" ->confdir</TT -> and thus indicates that the configuration - directory is named <SPAN -CLASS="QUOTE" ->"/etc/privoxy/"</SPAN ->.</P -><P -> All options in the config file except for <TT -CLASS="LITERAL" ->confdir</TT -> and - <TT -CLASS="LITERAL" ->logdir</TT -> are optional. Watch out in the below description - for what happens if you leave them unset.</P -><P -> The main config file controls all aspects of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s - operation that are not location dependent (i.e. they apply universally, no matter - where you may be surfing).</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="LOCAL-SET-UP" ->7.1. Local Set-up Documentation</A -></H2 -><P -> If you intend to operate <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> for more users - than just yourself, it might be a good idea to let them know how to reach - you, what you block and why you do that, your policies, etc. - </P -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="USER-MANUAL" ->7.1.1. user-manual</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Location of the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> User Manual. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->A fully qualified URI</P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> <A -HREF="http://www.privoxy.org/user-manual/" -TARGET="_top" ->http://www.privoxy.org/<TT -CLASS="REPLACEABLE" -><I ->version</I -></TT ->/user-manual/</A -> - will be used, where <TT -CLASS="REPLACEABLE" -><I ->version</I -></TT -> is the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The User Manual URI is the single best source of information on - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, and is used for help links from some - of the internal CGI pages. The manual itself is normally packaged with the - binary distributions, so you probably want to set this to a locally - installed copy. - </P -><P -> Examples: - </P -><P -> The best all purpose solution is simply to put the full local - <TT -CLASS="LITERAL" ->PATH</TT -> to where the <I -CLASS="CITETITLE" ->User Manual</I -> is - located: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> user-manual /usr/share/doc/privoxy/user-manual</PRE -></TD -></TR -></TABLE -> - </P -><P -> The User Manual is then available to anyone with access to - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, by following the built-in URL: - <TT -CLASS="LITERAL" ->http://config.privoxy.org/user-manual/</TT -> - (or the shortcut: <TT -CLASS="LITERAL" ->http://p.p/user-manual/</TT ->). - </P -><P -> If the documentation is not on the local system, it can be accessed - from a remote server, as: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> user-manual http://example.com/privoxy/user-manual/</PRE -></TD -></TR -></TABLE -> - </P -><DIV -CLASS="WARNING" -><P -></P -><TABLE -CLASS="WARNING" -BORDER="1" -WIDTH="90%" -><TR -><TD -ALIGN="CENTER" -><B ->Warning</B -></TD -></TR -><TR -><TD -ALIGN="LEFT" -><P -> If set, this option should be <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->the first option in the config - file</I -></SPAN ->, because it is used while the config file is being read - on start-up. - </P -></TD -></TR -></TABLE -></DIV -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="TRUST-INFO-URL" ->7.1.2. trust-info-url</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> A URL to be displayed in the error page that users will see if access to an untrusted page is denied. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->URL</P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> No links are displayed on the "untrusted" error page. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The value of this option only matters if the experimental trust mechanism has been - activated. (See <A -HREF="config.html#TRUSTFILE" -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->trustfile</I -></SPAN -></A -> below.) - </P -><P -> If you use the trust mechanism, it is a good idea to write up some on-line - documentation about your trust policy and to specify the URL(s) here. - Use multiple times for multiple URLs. - </P -><P -> The URL(s) should be added to the trustfile as well, so users don't end up - locked out from the information on why they were locked out in the first place! - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ADMIN-ADDRESS" ->7.1.3. admin-address</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> An email address to reach the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> administrator. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->Email address</P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> No email address is displayed on error pages and the CGI user interface. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> If both <TT -CLASS="LITERAL" ->admin-address</TT -> and <TT -CLASS="LITERAL" ->proxy-info-url</TT -> - are unset, the whole "Local Privoxy Support" box on all generated pages will - not be shown. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="PROXY-INFO-URL" ->7.1.4. proxy-info-url</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> A URL to documentation about the local <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> setup, - configuration or policies. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->URL</P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> No link to local documentation is displayed on error pages and the CGI user interface. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> If both <TT -CLASS="LITERAL" ->admin-address</TT -> and <TT -CLASS="LITERAL" ->proxy-info-url</TT -> - are unset, the whole "Local Privoxy Support" box on all generated pages will - not be shown. - </P -><P -> This URL shouldn't be blocked ;-) - </P -></DD -></DL -></DIV -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONF-LOG-LOC" ->7.2. Configuration and Log File Locations</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can (and normally does) use a number of - other files for additional configuration, help and logging. - This section of the configuration file tells <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - where to find those other files. </P -><P -> The user running <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, must have read - permission for all configuration files, and write permission to any files - that would be modified, such as log files and actions files.</P -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="CONFDIR" ->7.2.1. confdir</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P ->The directory where the other configuration files are located.</P -></DD -><DT ->Type of value:</DT -><DD -><P ->Path name</P -></DD -><DT ->Default value:</DT -><DD -><P ->/etc/privoxy (Unix) <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->or</I -></SPAN -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> installation dir (Windows) </P -></DD -><DT ->Effect if unset:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Mandatory</I -></SPAN -></P -></DD -><DT ->Notes:</DT -><DD -><P -> No trailing <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->/</TT ->"</SPAN ->, please. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="TEMPLDIR" ->7.2.2. templdir</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P ->An alternative directory where the templates are loaded from.</P -></DD -><DT ->Type of value:</DT -><DD -><P ->Path name</P -></DD -><DT ->Default value:</DT -><DD -><P ->unset</P -></DD -><DT ->Effect if unset:</DT -><DD -><P ->The templates are assumed to be located in confdir/template.</P -></DD -><DT ->Notes:</DT -><DD -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> original templates are usually - overwritten with each update. Use this option to relocate customized - templates that should be kept. As template variables might change - between updates, you shouldn't expect templates to work with - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> releases other than the one - they were part of, though. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="LOGDIR" ->7.2.3. logdir</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> The directory where all logging takes place - (i.e. where the <TT -CLASS="FILENAME" ->logfile</TT -> is located). - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->Path name</P -></DD -><DT ->Default value:</DT -><DD -><P ->/var/log/privoxy (Unix) <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->or</I -></SPAN -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> installation dir (Windows) </P -></DD -><DT ->Effect if unset:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Mandatory</I -></SPAN -></P -></DD -><DT ->Notes:</DT -><DD -><P -> No trailing <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->/</TT ->"</SPAN ->, please. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ACTIONSFILE" ->7.2.4. actionsfile</A -></H4 -><A -NAME="DEFAULT.ACTION" -></A -><A -NAME="STANDARD.ACTION" -></A -><A -NAME="USER.ACTION" -></A -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> The <A -HREF="actions-file.html" ->actions file(s)</A -> to use - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->Complete file name, relative to <TT -CLASS="LITERAL" ->confdir</TT -></P -></DD -><DT ->Default values:</DT -><DD -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <P -CLASS="LITERALLAYOUT" -> match-all.action # Actions that are applied to all sites and maybe overruled later on.</P -> - </TD -></TR -><TR -><TD -> <P -CLASS="LITERALLAYOUT" -> default.action # Main actions file</P -> - </TD -></TR -><TR -><TD -> <P -CLASS="LITERALLAYOUT" -> user.action # User customizations</P -> - </TD -></TR -></TBODY -></TABLE -><P -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> No actions are taken at all. More or less neutral proxying. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Multiple <TT -CLASS="LITERAL" ->actionsfile</TT -> lines are permitted, and are in fact recommended! - </P -><P -> - The default values are <TT -CLASS="FILENAME" ->default.action</TT ->, which is the - <SPAN -CLASS="QUOTE" ->"main"</SPAN -> actions file maintained by the developers, and - <TT -CLASS="FILENAME" ->user.action</TT ->, where you can make your personal additions. - </P -><P -> - Actions files contain all the per site and per URL configuration for - ad blocking, cookie management, privacy considerations, etc. - There is no point in using <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> without at - least one actions file. - </P -><P -> Note that since Privoxy 3.0.7, the complete filename, including the <SPAN -CLASS="QUOTE" ->".action"</SPAN -> - extension has to be specified. The syntax change was necessary to be consistent - with the other file options and to allow previously forbidden characters. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="FILTERFILE" ->7.2.5. filterfile</A -></H4 -><A -NAME="DEFAULT.FILTER" -></A -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> The <A -HREF="filter-file.html" ->filter file(s)</A -> to use - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->File name, relative to <TT -CLASS="LITERAL" ->confdir</TT -></P -></DD -><DT ->Default value:</DT -><DD -><P ->default.filter (Unix) <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->or</I -></SPAN -> default.filter.txt (Windows)</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> No textual content filtering takes place, i.e. all - <TT -CLASS="LITERAL" ->+<A -HREF="actions-file.html#FILTER" ->filter</A ->{<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT ->}</TT -> - actions in the actions files are turned neutral. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Multiple <TT -CLASS="LITERAL" ->filterfile</TT -> lines are permitted. - </P -><P -> The <A -HREF="filter-file.html" ->filter files</A -> contain content modification - rules that use <A -HREF="appendix.html#REGEX" ->regular expressions</A ->. These rules permit - powerful changes on the content of Web pages, and optionally the headers - as well, e.g., you could try to disable your favorite JavaScript annoyances, - re-write the actual displayed text, or just have some fun - playing buzzword bingo with web pages. - </P -><P -> The - <TT -CLASS="LITERAL" ->+<A -HREF="actions-file.html#FILTER" ->filter</A ->{<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT ->}</TT -> - actions rely on the relevant filter (<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT ->) - to be defined in a filter file! - </P -><P -> A pre-defined filter file called <TT -CLASS="FILENAME" ->default.filter</TT -> that contains - a number of useful filters for common problems is included in the distribution. - See the section on the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filter</A -></TT -> - action for a list. - </P -><P -> It is recommended to place any locally adapted filters into a separate - file, such as <TT -CLASS="FILENAME" ->user.filter</TT ->. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="LOGFILE" ->7.2.6. logfile</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> The log file to use - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->File name, relative to <TT -CLASS="LITERAL" ->logdir</TT -></P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset (commented out)</I -></SPAN ->. When activated: logfile (Unix) <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->or</I -></SPAN -> privoxy.log (Windows).</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> No logfile is written. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The logfile is where all logging and error messages are written. The level - of detail and number of messages are set with the <TT -CLASS="LITERAL" ->debug</TT -> - option (see below). The logfile can be useful for tracking down a problem with - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> (e.g., it's not blocking an ad you - think it should block) and it can help you to monitor what your browser - is doing. - </P -><P -> Depending on the debug options below, the logfile may be a privacy risk - if third parties can get access to it. As most users will never look - at it, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.7 and later only log fatal - errors by default. - </P -><P -> For most troubleshooting purposes, you will have to change that, - please refer to the debugging section for details. - </P -><P -> 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 <SPAN -CLASS="QUOTE" ->"man cron"</SPAN ->). For Red Hat based Linux distributions, a - <B -CLASS="COMMAND" ->logrotate</B -> script has been included. - </P -><P -> Any log files must be writable by whatever user <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is being run as (on Unix, default user id is <SPAN -CLASS="QUOTE" ->"privoxy"</SPAN ->). - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="TRUSTFILE" ->7.2.7. trustfile</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> The name of the trust file to use - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->File name, relative to <TT -CLASS="LITERAL" ->confdir</TT -></P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset (commented out)</I -></SPAN ->. When activated: trust (Unix) <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->or</I -></SPAN -> trust.txt (Windows)</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> The entire trust mechanism is disabled. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The trust mechanism is an experimental feature for building white-lists and should - be used with care. It is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->NOT</I -></SPAN -> recommended for the casual user. - </P -><P -> If you specify a trust file, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will only allow - access to sites that are specified in the trustfile. Sites can be listed - in one of two ways: - </P -><P -> Prepending a <TT -CLASS="LITERAL" ->~</TT -> character limits access to this site - only (and any sub-paths within this site), e.g. - <TT -CLASS="LITERAL" ->~www.example.com</TT -> allows access to - <TT -CLASS="LITERAL" ->~www.example.com/features/news.html</TT ->, etc. - </P -><P -> Or, you can designate sites as <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->trusted referrers</I -></SPAN ->, by - prepending the name with a <TT -CLASS="LITERAL" ->+</TT -> character. The effect is that - access to untrusted sites will be granted -- but only if a link from this - trusted referrer was used to get there. The link target will then be added - to the <SPAN -CLASS="QUOTE" ->"trustfile"</SPAN -> so that future, direct accesses will be - granted. Sites added via this mechanism do not become trusted referrers - themselves (i.e. they are added with a <TT -CLASS="LITERAL" ->~</TT -> designation). - There is a limit of 512 such entries, after which new entries will not be - made. - </P -><P -> If you use the <TT -CLASS="LITERAL" ->+</TT -> operator in the trust file, it may grow - considerably over time. - </P -><P -> It is recommended that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> be compiled with - the <TT -CLASS="LITERAL" ->--disable-force</TT ->, <TT -CLASS="LITERAL" ->--disable-toggle</TT -> and - <TT -CLASS="LITERAL" -> --disable-editor</TT -> options, if this feature is to be - used. - </P -><P -> Possible applications include limiting Internet access for children. - </P -></DD -></DL -></DIV -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="DEBUGGING" ->7.3. Debugging</A -></H2 -><P -> These options are mainly useful when tracing a problem. - Note that you might also want to invoke - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with the <TT -CLASS="LITERAL" ->--no-daemon</TT -> - command line option when debugging. - </P -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="DEBUG" ->7.3.1. debug</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Key values that determine what information gets logged. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->Integer values</P -></DD -><DT ->Default value:</DT -><DD -><P ->0 (i.e.: only fatal errors (that cause Privoxy to exit) are logged)</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Default value is used (see above). - </P -></DD -><DT ->Notes:</DT -><DD -><P -> The available debug levels are: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> debug 1 # Log the destination for each request <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> let through. See also debug 1024. - debug 2 # show each connection status - debug 4 # show I/O status - debug 8 # show header parsing - debug 16 # log all data written to the network into the logfile - debug 32 # debug force feature - debug 64 # debug regular expression filters - debug 128 # debug redirects - debug 256 # debug GIF de-animation - debug 512 # Common Log Format - debug 1024 # Log the destination for requests <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> didn't let through, and the reason why. - debug 2048 # CGI user interface - debug 4096 # Startup banner and warnings. - debug 8192 # Non-fatal errors</PRE -></TD -></TR -></TABLE -> - </P -><P -> To select multiple debug levels, you can either add them or use - multiple <TT -CLASS="LITERAL" ->debug</TT -> lines. - </P -><P -> A debug level of 1 is informative because it will show you each request - as it happens. <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->1, 4096 and 8192 are recommended</I -></SPAN -> - so that you will notice when things go wrong. The other levels are - probably only of interest if you are hunting down a specific problem. - They can produce a hell of an output (especially 16). - - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> used to ship with the debug levels recommended above enabled by - default, but due to privacy concerns 3.0.7 and later are configured to - only log fatal errors. - </P -><P -> If you are used to the more verbose settings, simply enable the debug lines - below again. - </P -><P -> If you want to use pure CLF (Common Log Format), you should set <SPAN -CLASS="QUOTE" ->"debug - 512"</SPAN -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->ONLY</I -></SPAN -> and not enable anything else. - </P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has a hard-coded limit for the - length of log messages. If it's reached, messages are logged truncated - and marked with <SPAN -CLASS="QUOTE" ->"... [too long, truncated]"</SPAN ->. - </P -><P -> Please don't file any support requests without trying to reproduce - the problem with increased debug level first. Once you read the log - messages, you may even be able to solve the problem on your own. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SINGLE-THREADED" ->7.3.2. single-threaded</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether to run only one server thread. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->None</I -></SPAN -></P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Multi-threaded (or, where unavailable: forked) operation, i.e. the ability to - serve multiple requests simultaneously. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This option is only there for debugging purposes. - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->It will drastically reduce performance.</I -></SPAN -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="HOSTNAME" ->7.3.3. hostname</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> The hostname shown on the CGI pages. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->Text</P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> The hostname provided by the operating system is used. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> On some misconfigured systems resolving the hostname fails or - takes too much time and slows Privoxy down. Setting a fixed hostname - works around the problem. - </P -><P -> In other circumstances it might be desirable to show a hostname - other than the one returned by the operating system. For example - if the system has several different hostnames and you don't want - to use the first one. - </P -><P -> Note that Privoxy does not validate the specified hostname value. - </P -></DD -></DL -></DIV -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="ACCESS-CONTROL" ->7.4. Access Control and Security</A -></H2 -><P -> This section of the config file controls the security-relevant aspects - of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s configuration. - </P -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="LISTEN-ADDRESS" ->7.4.1. listen-address</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> The IP address and TCP port on which <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will - listen for client requests. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->[<TT -CLASS="REPLACEABLE" -><I ->IP-Address</I -></TT ->]:<TT -CLASS="REPLACEABLE" -><I ->Port</I -></TT -></P -></DD -><DT ->Default value:</DT -><DD -><P ->127.0.0.1:8118</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Bind to 127.0.0.1 (localhost), port 8118. This is suitable and recommended for - home users who run <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on the same machine as - their browser. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> You will need to configure your browser(s) to this proxy address and port. - </P -><P -> 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. - </P -><P -> If you leave out the IP address, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will - bind to all interfaces (addresses) on your machine and may become reachable - from the Internet. In that case, consider using <A -HREF="config.html#ACLS" ->access control lists</A -> (ACL's, see below), and/or - a firewall. - </P -><P -> If you open <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to untrusted users, you will - also want to make sure that the following actions are disabled: <TT -CLASS="LITERAL" -><A -HREF="config.html#ENABLE-EDIT-ACTIONS" ->enable-edit-actions</A -></TT -> and - <TT -CLASS="LITERAL" -><A -HREF="config.html#ENABLE-REMOTE-TOGGLE" ->enable-remote-toggle</A -></TT -> - </P -></DD -><DT ->Example:</DT -><DD -><P -> Suppose you are running <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 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: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="PROGRAMLISTING" -> listen-address 192.168.0.1:8118</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="TOGGLE" ->7.4.2. toggle</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Initial state of "toggle" status - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->1 or 0</P -></DD -><DT ->Default value:</DT -><DD -><P ->1</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Act as if toggled on - </P -></DD -><DT ->Notes:</DT -><DD -><P -> If set to 0, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will start in - <SPAN -CLASS="QUOTE" ->"toggled off"</SPAN -> mode, i.e. mostly behave like a normal, - content-neutral proxy with both ad blocking and content filtering - disabled. See <TT -CLASS="LITERAL" ->enable-remote-toggle</TT -> below. - </P -><P -> The windows version will only display the toggle icon in the system tray - if this option is present. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ENABLE-REMOTE-TOGGLE" ->7.4.3. enable-remote-toggle</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether or not the <A -HREF="http://config.privoxy.org/toggle" -TARGET="_top" ->web-based toggle - feature</A -> may be used - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->0 or 1</P -></DD -><DT ->Default value:</DT -><DD -><P ->0</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> The web-based toggle feature is disabled. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> When toggled off, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> mostly acts like a normal, - content-neutral proxy, i.e. doesn't block ads or filter content. - </P -><P -> Access to the toggle feature can <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not</I -></SPAN -> be - controlled separately by <SPAN -CLASS="QUOTE" ->"ACLs"</SPAN -> or HTTP authentication, - so that everybody who can access <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> (see - <SPAN -CLASS="QUOTE" ->"ACLs"</SPAN -> and <TT -CLASS="LITERAL" ->listen-address</TT -> above) can - toggle it for all users. So this option is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not recommended</I -></SPAN -> - for multi-user environments with untrusted users. - </P -><P -> Note that malicious client side code (e.g Java) is also - capable of using this option. - </P -><P -> As a lot of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> users don't read - documentation, this feature is disabled by default. - </P -><P -> Note that you must have compiled <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with - support for this feature, otherwise this option has no effect. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ENABLE-REMOTE-HTTP-TOGGLE" ->7.4.4. enable-remote-http-toggle</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether or not Privoxy recognizes special HTTP headers to change its behaviour. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->0 or 1</P -></DD -><DT ->Default value:</DT -><DD -><P ->0</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Privoxy ignores special HTTP headers. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> When toggled on, the client can change <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - behaviour by setting special HTTP headers. Currently the only supported - special header is <SPAN -CLASS="QUOTE" ->"X-Filter: No"</SPAN ->, to disable filtering for - the ongoing request, even if it is enabled in one of the action files. - </P -><P -> This feature is disabled by default. If you are using - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in a environment with trusted clients, - you may enable this feature at your discretion. Note that malicious client - side code (e.g Java) is also capable of using this feature. - </P -><P -> This option will be removed in future releases as it has been obsoleted - by the more general header taggers. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ENABLE-EDIT-ACTIONS" ->7.4.5. enable-edit-actions</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether or not the <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->web-based actions - file editor</A -> may be used - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->0 or 1</P -></DD -><DT ->Default value:</DT -><DD -><P ->0</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> The web-based actions file editor is disabled. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Access to the editor can <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not</I -></SPAN -> be - controlled separately by <SPAN -CLASS="QUOTE" ->"ACLs"</SPAN -> or HTTP authentication, - so that everybody who can access <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> (see - <SPAN -CLASS="QUOTE" ->"ACLs"</SPAN -> and <TT -CLASS="LITERAL" ->listen-address</TT -> above) can - modify its configuration for all users. - </P -><P -> This option is <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not recommended</I -></SPAN -> for environments - with untrusted users and as a lot of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - users don't read documentation, this feature is disabled by default. - </P -><P -> Note that malicious client side code (e.g Java) is also - capable of using the actions editor and you shouldn't enable - this options unless you understand the consequences and are - sure your browser is configured correctly. - </P -><P -> Note that you must have compiled <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with - support for this feature, otherwise this option has no effect. - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ENFORCE-BLOCKS" ->7.4.6. enforce-blocks</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether the user is allowed to ignore blocks and can <SPAN -CLASS="QUOTE" ->"go there anyway"</SPAN ->. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->0 or 1</I -></TT -> - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->0</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Blocks are not enforced. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is mainly used to block and filter - requests as a service to the user, for example to block ads and other - junk that clogs the pipes. <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> configuration - isn't perfect and sometimes innocent pages are blocked. In this situation it - makes sense to allow the user to enforce the request and have - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> ignore the block. - </P -><P -> In the default configuration <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - <SPAN -CLASS="QUOTE" ->"Blocked"</SPAN -> page contains a <SPAN -CLASS="QUOTE" ->"go there anyway"</SPAN -> - link to adds a special string (the force prefix) to the request URL. - If that link is used, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will - detect the force prefix, remove it again and let the request pass. - </P -><P -> Of course <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can also be used to enforce - a network policy. In that case the user obviously should not be able to - bypass any blocks, and that's what the <SPAN -CLASS="QUOTE" ->"enforce-blocks"</SPAN -> - option is for. If it's enabled, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> hides - the <SPAN -CLASS="QUOTE" ->"go there anyway"</SPAN -> link. If the user adds the force - prefix by hand, it will not be accepted and the circumvention attempt - is logged. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> enforce-blocks 1 - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ACLS" ->7.4.7. ACLs: permit-access and deny-access</A -></H4 -><A -NAME="PERMIT-ACCESS" -></A -><A -NAME="DENY-ACCESS" -></A -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Who can access what. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->src_addr</I -></TT ->[/<TT -CLASS="REPLACEABLE" -><I ->src_masklen</I -></TT ->] - [<TT -CLASS="REPLACEABLE" -><I ->dst_addr</I -></TT ->[/<TT -CLASS="REPLACEABLE" -><I ->dst_masklen</I -></TT ->]] - </P -><P -> Where <TT -CLASS="REPLACEABLE" -><I ->src_addr</I -></TT -> and - <TT -CLASS="REPLACEABLE" -><I ->dst_addr</I -></TT -> are IP addresses in dotted decimal notation or valid - DNS names, and <TT -CLASS="REPLACEABLE" -><I ->src_masklen</I -></TT -> and - <TT -CLASS="REPLACEABLE" -><I ->dst_masklen</I -></TT -> are subnet masks in CIDR notation, i.e. integer - values from 2 to 30 representing the length (in bits) of the network address. The masks and the whole - destination part are optional. - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Don't restrict access further than implied by <TT -CLASS="LITERAL" ->listen-address</TT -> - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Access controls are included at the request of ISPs and systems - administrators, and <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->are not usually needed by individual users</I -></SPAN ->. - For a typical home user, it will normally suffice to ensure that - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> only listens on the localhost - (127.0.0.1) or internal (home) network address by means of the - <A -HREF="config.html#LISTEN-ADDRESS" -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->listen-address</I -></SPAN -></A -> - option. - </P -><P -> Please see the warnings in the FAQ that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is not intended to be a substitute for a firewall or to encourage anyone - to defer addressing basic security weaknesses. - </P -><P -> Multiple ACL lines are OK. - If any ACLs are specified, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> only talks - to IP addresses that match at least one <TT -CLASS="LITERAL" ->permit-access</TT -> line - and don't match any subsequent <TT -CLASS="LITERAL" ->deny-access</TT -> line. In other words, the - last match wins, with the default being <TT -CLASS="LITERAL" ->deny-access</TT ->. - </P -><P -> If <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is using a forwarder (see <TT -CLASS="LITERAL" ->forward</TT -> below) - for a particular destination URL, the <TT -CLASS="REPLACEABLE" -><I ->dst_addr</I -></TT -> - that is examined is the address of the forwarder and <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->NOT</I -></SPAN -> the address - of the ultimate target. This is necessary because it may be impossible for the local - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to determine the IP address of the - ultimate target (that's often what gateways are used for). - </P -><P -> You should prefer using IP addresses over DNS names, because the address lookups take - time. All DNS names must resolve! You can <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not</I -></SPAN -> use domain patterns - like <SPAN -CLASS="QUOTE" ->"*.org"</SPAN -> or partial domain names. If a DNS name resolves to multiple - IP addresses, only the first one is used. - </P -><P -> Denying access to particular sites by ACL may have undesired side effects - if the site in question is hosted on a machine which also hosts other sites - (most sites are). - </P -></DD -><DT ->Examples:</DT -><DD -><P -> Explicitly define the default behavior if no ACL and - <TT -CLASS="LITERAL" ->listen-address</TT -> are set: <SPAN -CLASS="QUOTE" ->"localhost"</SPAN -> - is OK. The absence of a <TT -CLASS="REPLACEABLE" -><I ->dst_addr</I -></TT -> implies that - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> destination addresses are OK: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> permit-access localhost</PRE -></TD -></TR -></TABLE -> - </P -><P -> Allow any host on the same class C subnet as www.privoxy.org access to - nothing but www.example.com (or other domains hosted on the same system): - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> permit-access www.privoxy.org/24 www.example.com/32</PRE -></TD -></TR -></TABLE -> - </P -><P -> Allow access from any host on the 26-bit subnet 192.168.45.64 to anywhere, - with the exception that 192.168.45.73 may not access the IP address behind - www.dirty-stuff.example.com: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> permit-access 192.168.45.64/26 - deny-access 192.168.45.73 www.dirty-stuff.example.com</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="BUFFER-LIMIT" ->7.4.8. buffer-limit</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Maximum size of the buffer for content filtering. - </P -></DD -><DT ->Type of value:</DT -><DD -><P ->Size in Kbytes</P -></DD -><DT ->Default value:</DT -><DD -><P ->4096</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Use a 4MB (4096 KB) limit. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> For content filtering, i.e. the <TT -CLASS="LITERAL" ->+filter</TT -> and - <TT -CLASS="LITERAL" ->+deanimate-gif</TT -> actions, it is necessary that - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 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. - Hence this option. - </P -><P -> When a document buffer size reaches the <TT -CLASS="LITERAL" ->buffer-limit</TT ->, it is - flushed to the client unfiltered and no further attempt to - filter the rest of the document is made. Remember that there may be multiple threads - running, which might require up to <TT -CLASS="LITERAL" ->buffer-limit</TT -> Kbytes - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->each</I -></SPAN ->, unless you have enabled <SPAN -CLASS="QUOTE" ->"single-threaded"</SPAN -> - above. - </P -></DD -></DL -></DIV -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="FORWARDING" ->7.5. Forwarding</A -></H2 -><P -> This feature allows routing of HTTP requests through a chain of - multiple proxies.</P -><P -> Forwarding can be used to chain Privoxy with a caching proxy to speed - up browsing. Using a parent proxy may also be necessary if the machine - that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> runs on has no direct Internet access.</P -><P -> Note that parent proxies can severely decrease your privacy level. - For example a parent proxy could add your IP address to the request - headers and if it's a caching proxy it may add the <SPAN -CLASS="QUOTE" ->"Etag"</SPAN -> - header to revalidation requests again, even though you configured Privoxy - to remove it. It may also ignore Privoxy's header time randomization and use the - original values which could be used by the server as cookie replacement - to track your steps between visits.</P -><P -> Also specified here are SOCKS proxies. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - supports the SOCKS 4 and SOCKS 4A protocols.</P -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="FORWARD" ->7.5.1. forward</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> To which parent HTTP proxy specific requests should be routed. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->target_pattern</I -></TT -> - <TT -CLASS="REPLACEABLE" -><I ->http_parent</I -></TT ->[:<TT -CLASS="REPLACEABLE" -><I ->port</I -></TT ->] - </P -><P -> where <TT -CLASS="REPLACEABLE" -><I ->target_pattern</I -></TT -> is a <A -HREF="actions-file.html#AF-PATTERNS" ->URL pattern</A -> - that specifies to which requests (i.e. URLs) this forward rule shall apply. Use <TT -CLASS="LITERAL" ->/</TT -> to - denote <SPAN -CLASS="QUOTE" ->"all URLs"</SPAN ->. - <TT -CLASS="REPLACEABLE" -><I ->http_parent</I -></TT ->[:<TT -CLASS="REPLACEABLE" -><I ->port</I -></TT ->] - is the DNS name or IP address of the parent HTTP proxy through which the requests should be forwarded, - optionally followed by its listening port (default: 8080). - Use a single dot (<TT -CLASS="LITERAL" ->.</TT ->) to denote <SPAN -CLASS="QUOTE" ->"no forwarding"</SPAN ->. - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Don't use parent HTTP proxies. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> If <TT -CLASS="REPLACEABLE" -><I ->http_parent</I -></TT -> is <SPAN -CLASS="QUOTE" ->"."</SPAN ->, then requests are not - forwarded to another HTTP proxy but are made directly to the web servers. - </P -><P -> Multiple lines are OK, they are checked in sequence, and the last match wins. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> Everything goes to an example parent proxy, except SSL on port 443 (which it doesn't handle): - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward / parent-proxy.example.org:8080 - forward :443 .</PRE -></TD -></TR -></TABLE -> - </P -><P -> Everything goes to our example ISP's caching proxy, except for requests - to that ISP's sites: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward / caching-proxy.isp.example.net:8000 - forward .isp.example.net .</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SOCKS" ->7.5.2. forward-socks4, forward-socks4a and forward-socks5</A -></H4 -><A -NAME="FORWARD-SOCKS4" -></A -><A -NAME="FORWARD-SOCKS4A" -></A -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Through which SOCKS proxy (and optionally to which parent HTTP proxy) specific requests should be routed. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->target_pattern</I -></TT -> - <TT -CLASS="REPLACEABLE" -><I ->socks_proxy</I -></TT ->[:<TT -CLASS="REPLACEABLE" -><I ->port</I -></TT ->] - <TT -CLASS="REPLACEABLE" -><I ->http_parent</I -></TT ->[:<TT -CLASS="REPLACEABLE" -><I ->port</I -></TT ->] - </P -><P -> where <TT -CLASS="REPLACEABLE" -><I ->target_pattern</I -></TT -> is a - <A -HREF="actions-file.html#AF-PATTERNS" ->URL pattern</A -> that specifies to which - requests (i.e. URLs) this forward rule shall apply. Use <TT -CLASS="LITERAL" ->/</TT -> to - denote <SPAN -CLASS="QUOTE" ->"all URLs"</SPAN ->. <TT -CLASS="REPLACEABLE" -><I ->http_parent</I -></TT -> - and <TT -CLASS="REPLACEABLE" -><I ->socks_proxy</I -></TT -> - are IP addresses in dotted decimal notation or valid DNS names - (<TT -CLASS="REPLACEABLE" -><I ->http_parent</I -></TT -> - may be <SPAN -CLASS="QUOTE" ->"."</SPAN -> to denote <SPAN -CLASS="QUOTE" ->"no HTTP forwarding"</SPAN ->), and the optional - <TT -CLASS="REPLACEABLE" -><I ->port</I -></TT -> parameters are TCP ports, - i.e. integer values from 1 to 65535 - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Unset</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Don't use SOCKS proxies. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Multiple lines are OK, they are checked in sequence, and the last match wins. - </P -><P -> The difference between <TT -CLASS="LITERAL" ->forward-socks4</TT -> and <TT -CLASS="LITERAL" ->forward-socks4a</TT -> - is that in the SOCKS 4A protocol, the DNS resolution of the target hostname happens on the SOCKS - server, while in SOCKS 4 it happens locally. - </P -><P -> With <TT -CLASS="LITERAL" ->forward-socks5</TT -> the DNS resolution will happen on the remote server as well. - </P -><P -> If <TT -CLASS="REPLACEABLE" -><I ->http_parent</I -></TT -> is <SPAN -CLASS="QUOTE" ->"."</SPAN ->, then requests are not - forwarded to another HTTP proxy but are made (HTTP-wise) directly to the web servers, albeit through - a SOCKS proxy. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> From the company example.com, direct connections are made to all - <SPAN -CLASS="QUOTE" ->"internal"</SPAN -> domains, but everything outbound goes through - their ISP's proxy by way of example.com's corporate SOCKS 4A gateway to - the Internet. - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward-socks4a / socks-gw.example.com:1080 www-cache.isp.example.net:8080 - forward .example.com .</PRE -></TD -></TR -></TABLE -> - </P -><P -> A rule that uses a SOCKS 4 gateway for all destinations but no HTTP parent looks like this: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward-socks4 / socks-gw.example.com:1080 .</PRE -></TD -></TR -></TABLE -> - </P -><P -> To chain Privoxy and Tor, both running on the same system, you would use - something like: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward-socks4a / 127.0.0.1:9050 .</PRE -></TD -></TR -></TABLE -> - </P -><P -> The public <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> network can't be used to - reach your local network, if you need to access local servers you - therefore might want to make some exceptions: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward 192.168.*.*/ . - forward 10.*.*.*/ . - forward 127.*.*.*/ .</PRE -></TD -></TR -></TABLE -> - </P -><P -> Unencrypted connections to systems in these address ranges will - be as (un)secure as the local network is, but the alternative is that you - can't reach the local network through <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - at all. Of course this may actually be desired and there is no reason - to make these exceptions if you aren't sure you need them. - </P -><P -> If you also want to be able to reach servers in your local network by - using their names, you will need additional exceptions that look like - this: - </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="90%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward localhost/ .</PRE -></TD -></TR -></TABLE -> - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ADVANCED-FORWARDING-EXAMPLES" ->7.5.3. Advanced Forwarding Examples</A -></H4 -><P -> If you have links to multiple ISPs that provide various special content - only to their subscribers, you can configure multiple <SPAN -CLASS="APPLICATION" ->Privoxies</SPAN -> - which have connections to the respective ISPs to act as forwarders to each other, so that - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->your</I -></SPAN -> users can see the internal content of all ISPs.</P -><P -> Assume that host-a has a PPP connection to isp-a.example.net. And host-b has a PPP connection to - isp-b.example.org. Both run <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. Their forwarding - configuration can look like this:</P -><P -> host-a:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward / . - forward .isp-b.example.net host-b:8118</PRE -></TD -></TR -></TABLE -></P -><P -> host-b:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward / . - forward .isp-a.example.org host-a:8118</PRE -></TD -></TR -></TABLE -></P -><P -> Now, your users can set their browser's proxy to use either - host-a or host-b and be able to browse the internal content - of both isp-a and isp-b.</P -><P -> If you intend to chain <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and - <SPAN -CLASS="APPLICATION" ->squid</SPAN -> locally, then chaining as - <TT -CLASS="LITERAL" ->browser -> squid -> privoxy</TT -> is the recommended way. </P -><P -> Assuming that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and <SPAN -CLASS="APPLICATION" ->squid</SPAN -> - run on the same box, your <SPAN -CLASS="APPLICATION" ->squid</SPAN -> configuration could then look like this:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # Define Privoxy as parent proxy (without ICP) - cache_peer 127.0.0.1 parent 8118 7 no-query - - # Define ACL for protocol FTP - acl ftp proto FTP - - # Do not forward FTP requests to Privoxy - always_direct allow ftp - - # Forward all the rest to Privoxy - never_direct allow all</PRE -></TD -></TR -></TABLE -></P -><P -> You would then need to change your browser's proxy settings to <SPAN -CLASS="APPLICATION" ->squid</SPAN ->'s address and port. - Squid normally uses port 3128. If unsure consult <TT -CLASS="LITERAL" ->http_port</TT -> in <TT -CLASS="FILENAME" ->squid.conf</TT ->.</P -><P -> You could just as well decide to only forward requests you suspect - of leading to Windows executables through a virus-scanning parent proxy, - say, on <TT -CLASS="LITERAL" ->antivir.example.com</TT ->, port 8010:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> forward / . - forward /.*.(exe|com|dll|zip)$ antivir.example.com:8010</PRE -></TD -></TR -></TABLE -> </P -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="FORWARDED-CONNECT-RETRIES" ->7.5.4. forwarded-connect-retries</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> How often Privoxy retries if a forwarded connection request fails. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->Number of retries.</I -></TT -> - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->0</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Connections forwarded through other proxies are treated like direct connections and no retry attempts are made. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->forwarded-connect-retries</I -></TT -> is mainly interesting - for socks4a connections, where <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can't detect why the connections failed. - The connection might have failed because of a DNS timeout in which case a retry makes sense, - but it might also have failed because the server doesn't exist or isn't reachable. In this - case the retry will just delay the appearance of Privoxy's error message. - </P -><P -> Note that in the context of this option, <SPAN -CLASS="QUOTE" ->"forwarded connections"</SPAN -> includes all connections - that Privoxy forwards through other proxies. This option is not limited to the HTTP CONNECT method. - </P -><P -> Only use this option, if you are getting lots of forwarding-related error messages - that go away when you try again manually. Start with a small value and check Privoxy's - logfile from time to time, to see how many retries are usually needed. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> forwarded-connect-retries 1 - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ACCEPT-INTERCEPTED-REQUESTS" ->7.5.5. accept-intercepted-requests</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether intercepted requests should be treated as valid. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->0 or 1</I -></TT -> - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->0</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Only proxy requests are accepted, intercepted requests are treated as invalid. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> If you don't trust your clients and want to force them - to use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, enable this - option and configure your packet filter to redirect outgoing - HTTP connections into <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - </P -><P -> Make sure that <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> own requests - aren't redirected as well. Additionally take care that - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can't intentionally connect - to itself, otherwise you could run into redirection loops if - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> listening port is reachable - by the outside or an attacker has access to the pages you visit. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> accept-intercepted-requests 1 - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="ALLOW-CGI-REQUEST-CRUNCHING" ->7.5.6. allow-cgi-request-crunching</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether requests to <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> CGI pages can be blocked or redirected. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->0 or 1</I -></TT -> - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->0</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> ignores block and redirect actions for its CGI pages. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> By default <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> ignores block or redirect actions - for its CGI pages. Intercepting these requests can be useful in multi-user - setups to implement fine-grained access control, but it can also render the complete - web interface useless and make debugging problems painful if done without care. - </P -><P -> Don't enable this option unless you're sure that you really need it. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> allow-cgi-request-crunching 1 - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SPLIT-LARGE-FORMS" ->7.5.7. split-large-forms</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Whether the CGI interface should stay compatible with broken HTTP clients. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->0 or 1</I -></TT -> - </P -></DD -><DT ->Default value:</DT -><DD -><P -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->0</I -></SPAN -></P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> The CGI form generate long GET URLs. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> CGI forms can lead to - rather long URLs. This isn't a problem as far as the HTTP - standard is concerned, but it can confuse clients with arbitrary - URL length limitations. - </P -><P -> Enabling split-large-forms causes <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - to divide big forms into smaller ones to keep the URL length down. - It makes editing a lot less convenient and you can no longer - submit all changes at once, but at least it works around this - browser bug. - </P -><P -> If you don't notice any editing problems, there is no reason - to enable this option, but if one of the submit buttons appears - to be broken, you should give it a try. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> split-large-forms 1 - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="KEEP-ALIVE-TIMEOUT" ->7.5.8. keep-alive-timeout</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Number of seconds after which an open connection will no longer be reused. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->Time in seconds.</I -></TT -> - </P -></DD -><DT ->Default value:</DT -><DD -><P ->None</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> Connections are not reused. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> This option has no effect if <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - has been compiled without keep-alive support. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> Note that reusing connections doesn't necessary cause speedups. - There are also a few privacy implications you should be aware of. - </P -><P -> Outgoing connections are shared between clients (if there are more - than one) and closing the client that initiated the outgoing connection - does not affect the connection between <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and the server unless - the client's request hasn't been completed yet. If the outgoing connection - is idle, it will not be closed until either <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - or the server's timeout is reached. While it's open, the server knows - that the system running <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is still there. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> keep-alive-timeout 300 - </P -></DD -></DL -></DIV -></DIV -><DIV -CLASS="SECT3" -><H4 -CLASS="SECT3" -><A -NAME="SOCKET-TIMEOUT" ->7.5.9. socket-timeout</A -></H4 -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Specifies:</DT -><DD -><P -> Number of seconds after which a socket times out if - no data is received. - </P -></DD -><DT ->Type of value:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->Time in seconds.</I -></TT -> - </P -></DD -><DT ->Default value:</DT -><DD -><P ->None</P -></DD -><DT ->Effect if unset:</DT -><DD -><P -> A default value of 300 seconds is used. - </P -></DD -><DT ->Notes:</DT -><DD -><P -> For SOCKS requests the timeout currently doesn't start until - the SOCKS server accepted the request. This will be fixed in - the next release. - </P -></DD -><DT ->Examples:</DT -><DD -><P -> socket-timeout 300 - </P -></DD -></DL -></DIV -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="WINDOWS-GUI" ->7.6. Windows GUI Options</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> has a number of options specific to the - Windows GUI interface:</P -><A -NAME="ACTIVITY-ANIMATION" -></A -><P -> If <SPAN -CLASS="QUOTE" ->"activity-animation"</SPAN -> is set to 1, the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> icon will animate when - <SPAN -CLASS="QUOTE" ->"Privoxy"</SPAN -> is active. To turn off, set to 0.</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->activity-animation 1</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="LOG-MESSAGES" -></A -><P -> If <SPAN -CLASS="QUOTE" ->"log-messages"</SPAN -> is set to 1, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will log messages to the console - window:</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->log-messages 1</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="LOG-BUFFER-SIZE" -></A -><P -> - If <SPAN -CLASS="QUOTE" ->"log-buffer-size"</SPAN -> 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 <SPAN -CLASS="QUOTE" ->"log-max-lines"</SPAN -> (see below).</P -><P -> Warning: Setting this to 0 will result in the buffer to grow infinitely and - eat up all your memory!</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->log-buffer-size 1</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="LOG-MAX-LINES" -></A -><P -> <SPAN -CLASS="APPLICATION" ->log-max-lines</SPAN -> is the maximum number of lines held - in the log buffer. See above.</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->log-max-lines 200</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="LOG-HIGHLIGHT-MESSAGES" -></A -><P -> If <SPAN -CLASS="QUOTE" ->"log-highlight-messages"</SPAN -> is set to 1, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will highlight portions of the log - messages with a bold-faced font:</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->log-highlight-messages 1</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="LOG-FONT-NAME" -></A -><P -> The font used in the console window:</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->log-font-name Comic Sans MS</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="LOG-FONT-SIZE" -></A -><P -> Font size used in the console window:</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->log-font-size 8</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="SHOW-ON-TASK-BAR" -></A -><P -> - <SPAN -CLASS="QUOTE" ->"show-on-task-bar"</SPAN -> controls whether or not - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will appear as a button on the Task bar - when minimized:</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->show-on-task-bar 0</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="CLOSE-BUTTON-MINIMIZES" -></A -><P -> If <SPAN -CLASS="QUOTE" ->"close-button-minimizes"</SPAN -> is set to 1, the Windows close - button will minimize <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> instead of closing - the program (close with the exit option on the File menu).</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->close-button-minimizes 1</I -></SPAN -><br> - </P -> - </TT -></P -><A -NAME="HIDE-CONSOLE" -></A -><P -> The <SPAN -CLASS="QUOTE" ->"hide-console"</SPAN -> option is specific to the MS-Win console - version of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. If this option is used, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will disconnect from and hide the - command console.</P -><P -> <TT -CLASS="LITERAL" -> <P -CLASS="LITERALLAYOUT" -> #<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->hide-console</I -></SPAN -><br> - </P -> - </TT -></P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="configuration.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="actions-file.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Privoxy Configuration</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Actions Files</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/configuration.html b/external/privoxy/doc/webserver/user-manual/configuration.html deleted file mode 100644 index b4f021e..0000000 --- a/external/privoxy/doc/webserver/user-manual/configuration.html +++ /dev/null @@ -1,514 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy Configuration</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Starting Privoxy" -HREF="startup.html"><LINK -REL="NEXT" -TITLE="The Main Configuration File" -HREF="config.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="startup.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="config.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CONFIGURATION" ->6. Privoxy Configuration</A -></H1 -><P -> All <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> configuration is stored - in text files. These files can be edited with a text editor. - Many important aspects of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can - also be controlled easily with a web browser. - </P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN776" ->6.1. Controlling Privoxy with Your Web Browser</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s user interface can be reached through the special - URL <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> - (shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->), - which is a built-in page and works without Internet access. - You will see the following section: </P -><TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> <H2 -CLASS="BRIDGEHEAD" -><A -NAME="AEN784" -></A -> Privoxy Menu</H2 -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> ▪ <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->View & change the current configuration</A -> - </TD -></TR -><TR -><TD -> ▪ <A -HREF="http://config.privoxy.org/show-version" -TARGET="_top" ->View the source code version numbers</A -> - </TD -></TR -><TR -><TD -> ▪ <A -HREF="http://config.privoxy.org/show-request" -TARGET="_top" ->View the request headers.</A -> - </TD -></TR -><TR -><TD -> ▪ <A -HREF="http://config.privoxy.org/show-url-info" -TARGET="_top" ->Look up which actions apply to a URL and why</A -> - </TD -></TR -><TR -><TD -> ▪ <A -HREF="http://config.privoxy.org/toggle" -TARGET="_top" ->Toggle Privoxy on or off</A -> - </TD -></TR -><TR -><TD -> ▪ <A -HREF="http://www.privoxy.org/3.0.12/user-manual/" -TARGET="_top" ->Documentation</A -> - </TD -></TR -></TBODY -></TABLE -><P -></P -></PRE -></TD -></TR -></TABLE -><P -> This should be self-explanatory. Note the first item leads to an editor for the - <A -HREF="actions-file.html" ->actions files</A ->, which is where the ad, banner, - cookie, and URL blocking magic is configured as well as other advanced features of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. This is an easy way to adjust various - aspects of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> configuration. The actions - file, and other configuration files, are explained in detail below. </P -><P -> <SPAN -CLASS="QUOTE" ->"Toggle Privoxy On or Off"</SPAN -> is handy for sites that might - have problems with your current actions and filters. You can in fact use - it as a test to see whether it is <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - causing the problem or not. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> continues - to run as a proxy in this case, but all manipulation is disabled, i.e. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> acts like a normal forwarding proxy. There - is even a toggle <A -HREF="appendix.html#BOOKMARKLETS" ->Bookmarklet</A -> offered, so - that you can toggle <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with one click from - your browser.</P -><P -> Note that several of the features described above are disabled by default - in <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.7 beta and later. - Check the - <A -HREF="config.html" -TARGET="_top" ->configuration file</A -> to learn why - and in which cases it's safe to enable them again.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONFOVERVIEW" ->6.2. Configuration Files Overview</A -></H2 -><P -> For Unix, *BSD and Linux, all configuration files are located in - <TT -CLASS="FILENAME" ->/etc/privoxy/</TT -> by default. For MS Windows, OS/2, and - AmigaOS these are all in the same directory as the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> executable. </P -><P -> The installed defaults provide a reasonable starting point, though - some settings may be aggressive by some standards. For the time being, the - principle configuration files are:</P -><P -> <P -></P -><UL -><LI -><P -> The <A -HREF="config.html" ->main configuration file</A -> is named <TT -CLASS="FILENAME" ->config</TT -> - on Linux, Unix, BSD, OS/2, and AmigaOS and <TT -CLASS="FILENAME" ->config.txt</TT -> - on Windows. This is a required file. - </P -></LI -><LI -><P -> <TT -CLASS="FILENAME" ->match-all.action</TT -> is used to define which <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> - relating to banner-blocking, images, pop-ups, content modification, cookie handling - etc should be applied by default. It should be the first actions file loaded. - </P -><P -> <TT -CLASS="FILENAME" ->default.action</TT -> defines many exceptions (both positive and negative) - from the default set of actions that's configured in <TT -CLASS="FILENAME" ->match-all.action</TT ->. - It should be the second actions file loaded and shouldn't be edited by the user. - </P -><P -> Multiple actions files may be defined in <TT -CLASS="FILENAME" ->config</TT ->. These - are processed in the order they are defined. Local customizations and locally - preferred exceptions to the default policies as defined in - <TT -CLASS="FILENAME" ->match-all.action</TT -> (which you will most probably want - to define sooner or later) are best applied in <TT -CLASS="FILENAME" ->user.action</TT ->, - where you can preserve them across upgrades. The file isn't installed by all - installers, but you can easily create it yourself with a text editor. - </P -><P -> - There is also a web based editor that can be accessed from - <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A -> - (Shortcut: <A -HREF="http://p.p/show-status" -TARGET="_top" ->http://p.p/show-status</A ->) for the - various actions files. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"Filter files"</SPAN -> (the <A -HREF="filter-file.html" ->filter - file</A ->) 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. The filtering jobs are only pre-defined here; - whether to apply them or not is up to the actions files. - <TT -CLASS="FILENAME" ->default.filter</TT -> includes various filters made - available for use by the developers. Some are much more intrusive than - others, and all should be used with caution. You may define additional - filter files in <TT -CLASS="FILENAME" ->config</TT -> as you can with - actions files. We suggest <TT -CLASS="FILENAME" ->user.filter</TT -> for any - locally defined filters or customizations. - </P -></LI -></UL -></P -><P -> The syntax of the configuration and filter files may change between different - Privoxy versions, unfortunately some enhancements cost backwards compatibility. - </P -><P -> All files use the <SPAN -CLASS="QUOTE" ->"<TT -CLASS="LITERAL" ->#</TT ->"</SPAN -> character to denote a - comment (the rest of the line will be ignored) and understand line continuation - through placing a backslash ("<TT -CLASS="LITERAL" -></TT ->") as the very last character - in a line. If the <TT -CLASS="LITERAL" ->#</TT -> is preceded by a backslash, it looses - its special function. Placing a <TT -CLASS="LITERAL" ->#</TT -> in front of an otherwise - valid configuration line to prevent it from being interpreted is called "commenting - out" that line. Blank lines are ignored.</P -><P -> The actions files and filter files - can use Perl style <A -HREF="appendix.html#REGEX" ->regular expressions</A -> for - maximum flexibility. </P -><P -> After making any changes, there is no need to restart - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in order for the changes to take - effect. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> detects such changes - automatically. Note, however, that it may take one or two additional - requests for the change to take effect. When changing the listening address - of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, these <SPAN -CLASS="QUOTE" ->"wake up"</SPAN -> requests - must obviously be sent to the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->old</I -></SPAN -> listening address.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="startup.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="config.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Starting Privoxy</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->The Main Configuration File</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/contact.html b/external/privoxy/doc/webserver/user-manual/contact.html deleted file mode 100644 index 3fd43eb..0000000 --- a/external/privoxy/doc/webserver/user-manual/contact.html +++ /dev/null @@ -1,514 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Contacting the Developers, Bug Reporting and Feature -Requests</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Privoxy's Template Files" -HREF="templates.html"><LINK -REL="NEXT" -TITLE="Privoxy Copyright, License and History" -HREF="copyright.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="templates.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="copyright.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="CONTACT" ->11. Contacting the Developers, Bug Reporting and Feature -Requests</A -></H1 -><P -> We value your feedback. In fact, we rely on it to improve - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and its configuration. - However, please note the following hints, so we can - provide you with the best support:</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-SUPPORT" ->11.1. Get Support</A -></H2 -><P -> For casual users, our - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=211118" -TARGET="_top" ->support forum at SourceForge</A -> - is probably best suited: - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=211118" -TARGET="_top" ->http://sourceforge.net/tracker/?group_id=11118&atid=211118</A -></P -><P -> All users are of course welcome to discuss their issues on the <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-users" -TARGET="_top" ->users - mailing list</A ->, where the developers also hang around.</P -><P -> Please don't sent private support requests to individual Privoxy - developers, either use the mailing lists or the support trackers.</P -><P -> Note that the Privoxy mailing lists are moderated. Posts from unsubscribed - addresses have to be accepted manually by a moderator. This may cause a - delay of several days and if you use a subject that doesn't clearly - mention Privoxy or one of its features, your message may be accidentally - discarded as spam.</P -><P -> If you aren't subscribed, you should therefore spend a few seconds - to come up with a proper subject. Additionally you should make it clear - that you want to get CC'd. Otherwise some responses will be directed to - the mailing list only, and you won't see them.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="REPORTING" ->11.2. Reporting Problems</A -></H2 -><P -><SPAN -CLASS="QUOTE" ->"Problems"</SPAN -> for our purposes, come in two forms:</P -><P -></P -><UL -><LI -><P -> Configuration issues, such as ads that slip through, or sites that - don't function properly due to one <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - <SPAN -CLASS="QUOTE" ->"action"</SPAN -> or another being turned <SPAN -CLASS="QUOTE" ->"on"</SPAN ->. - </P -></LI -><LI -><P -> <SPAN -CLASS="QUOTE" ->"Bugs"</SPAN -> in the programming code that makes up - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, such as that might cause a crash. - </P -></LI -></UL -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="CONTACT-ADS" ->11.2.1. Reporting Ads or Other Configuration Problems</A -></H3 -><P -> Please send feedback on ads that slipped through, innocent images that were - blocked, sites that don't work properly, and other configuration related problem of - <TT -CLASS="FILENAME" ->default.action</TT -> file, to - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=460288" -TARGET="_top" -> http://sourceforge.net/tracker/?group_id=11118&atid=460288</A ->, - the Actions File Tracker.</P -><P -> New, improved <TT -CLASS="FILENAME" ->default.action</TT -> files may occasionally be made - available based on your feedback. These will be announced on the <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce" -TARGET="_top" ->ijbswa-announce</A -> - list and available from our the <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->files section</A -> of - our <A -HREF="http://sf.net/projects/ijbswa/" -TARGET="_top" ->project page</A ->.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="CONTACT-BUGS" ->11.2.2. Reporting Bugs</A -></H3 -><P -> Please report all bugs through our bug tracker: - <A -HREF="http://sourceforge.net/tracker/?group_id=11118&atid=111118" -TARGET="_top" ->http://sourceforge.net/tracker/?group_id=11118&atid=111118</A ->. </P -><P -> Before doing so, please make sure that the bug has <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not already been submitted</I -></SPAN -> - and observe the additional hints at the top of the <A -HREF="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=111118" -TARGET="_top" ->submit - form</A ->. If already submitted, please feel free to add any info to the - original report that might help to solve the issue.</P -><P -> Please try to verify that it is a <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> bug, - and not a browser or site bug or documented behaviour that just happens - to be different than what you expected. If unsure, - try <A -HREF="http://config.privoxy.org/toggle?set=disable" -TARGET="_top" ->toggling - off</A -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, and see if the problem persists.</P -><P -> If you are using your own custom configuration, please try - the stock configs to see if the problem is configuration related. - If you're having problems with a feature that is disabled by default, - please ask around on the mailing list if others can reproduce the problem.</P -><P -> If you aren't using the latest Privoxy version, the bug may have been found - and fixed in the meantime. We would appreciate if you could take the time - to <A -HREF="http://www.privoxy.org/user-manual/installation.html" -TARGET="_top" ->upgrade - to the latest version</A -> (or even the latest CVS snapshot) and verify - that your bug still exists.</P -><P ->Please be sure to provide the following information:</P -><P -> <P -></P -><UL -><LI -><P -> The exact <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version you are using - (if you got the source from CVS, please also provide the source code revisions - as shown in <A -HREF="http://config.privoxy.org/show-version" -TARGET="_top" ->http://config.privoxy.org/show-version</A ->). - </P -></LI -><LI -><P -> The operating system and versions you run - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on, (e.g. <SPAN -CLASS="APPLICATION" ->Windows - XP SP2</SPAN ->), if you are using a Unix flavor, - sending the output of <SPAN -CLASS="QUOTE" ->"uname -a"</SPAN -> should do, - in case of GNU/Linux, please also name the distribution. - </P -></LI -><LI -><P -> The name, platform, and version of the <SPAN -CLASS="APPLICATION" ->browser</SPAN -> - you were using (e.g. <SPAN -CLASS="APPLICATION" ->Internet Explorer v5.5</SPAN -> for Mac). - </P -></LI -><LI -><P -> The URL where the problem occurred, or some way for us to duplicate the - problem (e.g. <TT -CLASS="LITERAL" ->http://somesite.example.com/?somethingelse=123</TT ->). - </P -></LI -><LI -><P -> Whether your version of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is one supplied - by the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developers via SourceForge, - or if you got your copy somewhere else. - </P -></LI -><LI -><P -> Whether you are using <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in tandem with - another proxy such as <SPAN -CLASS="APPLICATION" ->Tor</SPAN ->. If so, please - temporary disable the other proxy to see if the symptoms change. - </P -></LI -><LI -><P -> Whether you are using a personal firewall product. If so, does - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> work without it? - </P -></LI -><LI -><P -> Any other pertinent information to help identify the problem such as config - or log file excerpts (yes, you should have log file entries for each - action taken). - </P -></LI -></UL -></P -><P -> You don't have to tell us your actual name when filing a problem - report, but please use a nickname so we can differentiate between - your messages and the ones entered by other "anonymous" users that - may respond to your request if they have the same problem or already - found a solution.</P -><P -> Please also check the status of your request a few days after submitting - it, as we may request additional information. If you use a SF id, - you should automatically get a mail when someone responds to your request.</P -><P -> The <A -HREF="http://www.privoxy.org/user-manual/appendix.html#ACTIONSANAT" -TARGET="_top" ->appendix - of the Privoxy User Manual</A -> also has helpful information - on understanding <TT -CLASS="LITERAL" ->actions</TT ->, and <TT -CLASS="LITERAL" ->action</TT -> debugging. </P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-FEATURE" ->11.3. Request New Features</A -></H2 -><P -> You are welcome to submit ideas on new features or other proposals - for improvement through our feature request tracker at - <A -HREF="http://sourceforge.net/tracker/?atid=361118&group_id=11118" -TARGET="_top" ->http://sourceforge.net/tracker/?atid=361118&group_id=11118</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CONTACT-OTHER" ->11.4. Other</A -></H2 -><P ->For any other issues, feel free to use the mailing lists. Technically interested users -and people who wish to contribute to the project are also welcome on the developers list! -You can find an overview of all <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->-related mailing lists, -including list archives, at: -<A -HREF="http://sourceforge.net/mail/?group_id=11118" -TARGET="_top" ->http://sourceforge.net/mail/?group_id=11118</A ->.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="templates.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="copyright.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Privoxy's Template Files</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Privoxy Copyright, License and History</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/copyright.html b/external/privoxy/doc/webserver/user-manual/copyright.html deleted file mode 100644 index b2e1e96..0000000 --- a/external/privoxy/doc/webserver/user-manual/copyright.html +++ /dev/null @@ -1,424 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy Copyright, License and History</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Contacting the Developers, Bug Reporting and Feature -Requests" -HREF="contact.html"><LINK -REL="NEXT" -TITLE="See Also" -HREF="seealso.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="contact.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="seealso.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="COPYRIGHT" ->12. Privoxy Copyright, License and History</A -></H1 -><P -> Copyright © 2001-2009 by Privoxy Developers <CODE -CLASS="EMAIL" -><<A -HREF="mailto:ijbswa-developers@lists.sourceforge.net" ->ijbswa-developers@lists.sourceforge.net</A ->></CODE -></P -><P -> Some source code is based on code Copyright © 1997 by Anonymous Coders - and Junkbusters, Inc. and licensed under the <I -CLASS="CITETITLE" ->GNU General Public - License</I ->.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN4921" ->12.1. License</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is free software; you can - redistribute it and/or modify it under the terms of the - <I -CLASS="CITETITLE" ->GNU General Public License</I ->, version 2, - as published by the Free Software Foundation.</P -><P -> 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 <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" -> <I -CLASS="CITETITLE" ->GNU General Public License</I -></A -> for details.</P -><P -> You should have received a copy of the <I -CLASS="CITETITLE" ->GNU GPL</I -> - along with this program; if not, write to the <P -CLASS="ADDRESS" -> Free Software<br> - Foundation, Inc. <SPAN -CLASS="STREET" ->51 Franklin Street, Fifth Floor</SPAN -><br> - <SPAN -CLASS="CITY" ->Boston</SPAN ->, <SPAN -CLASS="STATE" ->MA</SPAN -> <SPAN -CLASS="POSTCODE" ->02110-1301</SPAN -><br> - <SPAN -CLASS="COUNTRY" ->USA</SPAN -> </P -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="HISTORY" ->12.2. History</A -></H2 -><P -> A long time ago, there was the - <A -HREF="http://www.junkbusters.com/ijb.html" -TARGET="_top" -><SPAN -CLASS="APPLICATION" ->Internet Junkbuster</SPAN -></A ->, - by Anonymous Coders and <A -HREF="http://www.junkbusters.com/" -TARGET="_top" ->Junkbusters - Corporation</A ->. This saved many users a lot of pain in the early days of - web advertising and user tracking.</P -><P -> But the web, its protocols and standards, and with it, the techniques for - forcing ads on users, give up autonomy over their browsing, and - for tracking them, keeps evolving. Unfortunately, the <SPAN -CLASS="APPLICATION" ->Internet - Junkbuster</SPAN -> did not. Version 2.0.2, published in 1998, was - (and is) the last official - <A -HREF="http://www.junkbusters.com/ijbdist.html#release" -TARGET="_top" ->release</A -> - available from <A -HREF="http://www.junkbusters.com" -TARGET="_top" ->Junkbusters Corporation</A ->. - Fortunately, it had been released under the GNU - <A -HREF="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" -TARGET="_top" ->GPL</A ->, - which allowed further development by others.</P -><P -> So Stefan Waldherr started maintaining an improved version of the - software, to which eventually a number of people contributed patches. - It could already replace banners with a transparent image, and had a first - version of pop-up killing, but it was still very closely based on the - original, with all its limitations, such as the lack of HTTP/1.1 support, - flexible per-site configuration, or content modification. The last release - from this effort was version 2.0.2-10, published in 2000.</P -><P -> Then, some - <A -HREF="http://www.privoxy.org/user-manual/copyright.html#AUTHORS" -TARGET="_top" ->developers</A -> - picked up the thread, and started turning the software inside out, upside down, - and then reassembled it, adding many - <A -HREF="http://www.privoxy.org/user-manual/introduction.html#FEATURES" -TARGET="_top" ->new - features</A -> along the way.</P -><P -> The result of this is <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, whose first - stable version, 3.0, was released August, 2002. - </P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AUTHORS" ->12.3. Authors</A -></H2 -><P ->Current Privoxy Team:</P -><P -CLASS="LITERALLAYOUT" -> Fabian Keil, lead developer<br> - David Schmidt, developer<br> -<br> - Hal Burgiss<br> - Mark Miller<br> - Gerry Murphy<br> - Lee Rian<br> - Roland Rosenfeld<br> - Jörg Strohmayer</P -><P -> Former Privoxy Team Members:</P -><P -CLASS="LITERALLAYOUT" -> Johny Agotnes<br> - Rodrigo Barbosa<br> - Moritz Barsnick<br> - Ian Cummings<br> - Brian Dessent<br> - Jon Foster<br> - Karsten Hopp<br> - Alexander Lazic<br> - Daniel Leite<br> - Gábor Lipták<br> - Adam Lock<br> - Guy Laroche<br> - Justin McMurtry<br> - Andreas Oesterhelt<br> - Haroon Rafique<br> - Georg Sauthoff<br> - Thomas Steudten<br> - Rodney Stromlund<br> - Sviatoslav Sviridov<br> - Sarantis Paskalis<br> - Stefan Waldherr</P -><P -> Thanks to the many people who have tested Privoxy, reported bugs, provided - patches, made suggestions or contributed in some way. These include (in - alphabetical order):</P -><P -CLASS="LITERALLAYOUT" -> Ken Arromdee<br> - Devin Bayer<br> - Gergely Bor<br> - Reiner Buehl<br> - Andrew J. Caines<br> - Clifford Caoile<br> - Frédéric Crozat<br> - Michael T. Davis<br> - Mattes Dolak<br> - Matthias Drochner<br> - Peter E.<br> - Florian Effenberger<br> - Markus Elfring<br> - Dean Gaudet<br> - Stephen Gildea<br> - Daniel Griscom<br> - Felix Gröbert<br> - Aaron Hamid<br> - Darel Henman<br> - Magnus Holmgren<br> - Eric M. Hopper<br> - Ralf Horstmann<br> - Stefan Huehner<br> - Peter Hyman<br> - Derek Jennings<br> - Petr Kadlec<br> - David Laight<br> - Bert van Leeuwen<br> - Don Libes<br> - Paul Lieverse<br> - Toby Lyward<br> - Wil Mahan<br> - Jindrich Makovicka<br> - David Mediavilla<br> - Raphael Moll<br> - Amuro Namie<br> - Adam Piggott<br> - Dan Price<br> - Roberto Ragusa<br> - Félix Rauch<br> - Maynard Riley<br> - Chung-chieh Shan<br> - Spinor S.<br> - Bart Schelstraete<br> - Oliver Stoeneberg<br> - Peter Thoenen<br> - Martin Thomas<br> - Bobby G. Vinyard<br> - Jochen Voss<br> - Glenn Washburn<br> - Song Weijia<br> - Jörg Weinmann<br> - Darren Wiebe<br> - Anduin Withers<br> - Oliver Yeoh<br> - Jamie Zawinski</P -><P -> Privoxy is based in part on code originally developed by - Junkbusters Corp. and Anonymous Coders.</P -><P -> Privoxy heavily relies on Philip Hazel's PCRE.</P -><P -> The code to filter compressed content makes use of zlib - which is written by Jean-loup Gailly and Mark Adler.</P -><P -> On systems that lack snprintf(), Privoxy is using a version - written by Mark Martinec. On systems that lack strptime(), - Privoxy is using the one from the GNU C Library written - by Ulrich Drepper.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="contact.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="seealso.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Contacting the Developers, Bug Reporting and Feature -Requests</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->See Also</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/files-in-use.jpg b/external/privoxy/doc/webserver/user-manual/files-in-use.jpg deleted file mode 100644 index 207b6f7..0000000 Binary files a/external/privoxy/doc/webserver/user-manual/files-in-use.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/user-manual/filter-file.html b/external/privoxy/doc/webserver/user-manual/filter-file.html deleted file mode 100644 index 3a2ec3a..0000000 --- a/external/privoxy/doc/webserver/user-manual/filter-file.html +++ /dev/null @@ -1,1652 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Filter Files</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Actions Files" -HREF="actions-file.html"><LINK -REL="NEXT" -TITLE="Privoxy's Template Files" -HREF="templates.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="actions-file.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="templates.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="FILTER-FILE" ->9. Filter Files</A -></H1 -><P -> On-the-fly text substitutions need - to be defined in a <SPAN -CLASS="QUOTE" ->"filter file"</SPAN ->. Once defined, they - can then be invoked as an <SPAN -CLASS="QUOTE" ->"action"</SPAN ->.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> supports three different filter actions: - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filter</A -></TT -> to - rewrite the content that is send to the client, - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CLIENT-HEADER-FILTER" ->client-header-filter</A -></TT -> - to rewrite headers that are send by the client, and - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SERVER-HEADER-FILTER" ->server-header-filter</A -></TT -> - to rewrite headers that are send by the server.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> also supports two tagger actions: - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CLIENT-HEADER-TAGGER" ->client-header-tagger</A -></TT -> - and - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SERVER-HEADER-TAGGER" ->server-header-tagger</A -></TT ->. - Taggers and filters use the same syntax in the filter files, the difference - is that taggers don't modify the text they are filtering, but use a rewritten - version of the filtered text as tag. The tags can then be used to change the - applying actions through sections with <A -HREF="actions-file.html#TAG-PATTERN" ->tag-patterns</A ->.</P -><P -> Multiple filter files can be defined through the <TT -CLASS="LITERAL" -> <A -HREF="config.html#FILTERFILE" ->filterfile</A -></TT -> config directive. The filters - as supplied by the developers are located in - <TT -CLASS="FILENAME" ->default.filter</TT ->. It is recommended that any locally - defined or modified filters go in a separately defined file such as - <TT -CLASS="FILENAME" ->user.filter</TT ->. - </P -><P -> Common tasks for content filters are to eliminate common annoyances in - HTML and JavaScript, such as pop-up windows, - exit consoles, crippled windows without navigation tools, the - infamous <BLINK> tag etc, to suppress images with certain - width and height attributes (standard banner sizes or web-bugs), - or just to have fun.</P -><P -> Enabled content filters are applied to any content whose - <SPAN -CLASS="QUOTE" ->"Content Type"</SPAN -> header is recognised as a sign - of text-based content, with the exception of <TT -CLASS="LITERAL" ->text/plain</TT ->. - Use the <A -HREF="actions-file.html#FORCE-TEXT-MODE" ->force-text-mode</A -> action - to also filter other content.</P -><P -> Substitutions are made at the source level, so if you want to <SPAN -CLASS="QUOTE" ->"roll - your own"</SPAN -> filters, you should first be familiar with HTML syntax, - and, of course, regular expressions.</P -><P -> Just like the <A -HREF="actions-file.html" ->actions files</A ->, the - filter file is organized in sections, which are called <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->filters</I -></SPAN -> - here. Each filter consists of a heading line, that starts with one of the - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->keywords</I -></SPAN -> <TT -CLASS="LITERAL" ->FILTER:</TT ->, - <TT -CLASS="LITERAL" ->CLIENT-HEADER-FILTER:</TT -> or <TT -CLASS="LITERAL" ->SERVER-HEADER-FILTER:</TT -> - followed by the filter's <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->name</I -></SPAN ->, and a short (one line) - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->description</I -></SPAN -> of what it does. Below that line - come the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->jobs</I -></SPAN ->, i.e. lines that define the actual - text substitutions. By convention, the name of a filter - should describe what the filter <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->eliminates</I -></SPAN ->. The - comment is used in the <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->web-based - user interface</A ->.</P -><P -> Once a filter called <TT -CLASS="REPLACEABLE" -><I ->name</I -></TT -> has been defined - in the filter file, it can be invoked by using an action of the form - +<TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filter</A ->{<TT -CLASS="REPLACEABLE" -><I ->name</I -></TT ->}</TT -> - in any <A -HREF="actions-file.html" ->actions file</A ->.</P -><P -> Filter definitions start with a header line that contains the filter - type, the filter name and the filter description. - A content filter header line for a filter called <SPAN -CLASS="QUOTE" ->"foo"</SPAN -> could look - like this:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->FILTER: foo Replace all "foo" with "bar"</PRE -></TD -></TR -></TABLE -></P -><P -> Below that line, and up to the next header line, come the jobs that - define what text replacements the filter executes. They are specified - in a syntax that imitates <A -HREF="http://www.perl.org/" -TARGET="_top" ->Perl</A ->'s - <TT -CLASS="LITERAL" ->s///</TT -> operator. If you are familiar with Perl, you - will find this to be quite intuitive, and may want to look at the - PCRS documentation for the subtle differences to Perl behaviour. Most - notably, the non-standard option letter <TT -CLASS="LITERAL" ->U</TT -> is supported, - which turns the default to ungreedy matching.</P -><P -> If you are new to - <A -HREF="http://en.wikipedia.org/wiki/Regular_expressions" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"Regular - Expressions"</SPAN -></A ->, you might want to take a look at - the <A -HREF="appendix.html#REGEX" ->Appendix on regular expressions</A ->, and - see the <A -HREF="http://perldoc.perl.org/perlre.html" -TARGET="_top" ->Perl - manual</A -> for - <A -HREF="http://perldoc.perl.org/perlop.html" -TARGET="_top" ->the - <TT -CLASS="LITERAL" ->s///</TT -> operator's syntax</A -> and <A -HREF="http://perldoc.perl.org/perlre.html" -TARGET="_top" ->Perl-style regular - expressions</A -> in general. - The below examples might also help to get you started.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="AEN4447" ->9.1. Filter File Tutorial</A -></H2 -><P -> Now, let's complete our <SPAN -CLASS="QUOTE" ->"foo"</SPAN -> content filter. We have already defined - the heading, but the jobs are still missing. Since all it does is to replace - <SPAN -CLASS="QUOTE" ->"foo"</SPAN -> with <SPAN -CLASS="QUOTE" ->"bar"</SPAN ->, there is only one (trivial) job - needed:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->s/foo/bar/</PRE -></TD -></TR -></TABLE -></P -><P -> But wait! Didn't the comment say that <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> occurrences - of <SPAN -CLASS="QUOTE" ->"foo"</SPAN -> should be replaced? Our current job will only take - care of the first <SPAN -CLASS="QUOTE" ->"foo"</SPAN -> on each page. For global substitution, - we'll need to add the <TT -CLASS="LITERAL" ->g</TT -> option:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->s/foo/bar/g</PRE -></TD -></TR -></TABLE -></P -><P -> Our complete filter now looks like this:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->FILTER: foo Replace all "foo" with "bar" -s/foo/bar/g</PRE -></TD -></TR -></TABLE -></P -><P -> Let's look at some real filters for more interesting examples. Here you see - a filter that protects against some common annoyances that arise from JavaScript - abuse. Let's look at its jobs one after the other:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse - -# Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm -# -s|(<script.*)document.referrer(.*</script>)|$1"Not Your Business!"$2|Usg</PRE -></TD -></TR -></TABLE -></P -><P -> Following the header line and a comment, you see the job. Note that it uses - <TT -CLASS="LITERAL" ->|</TT -> as the delimiter instead of <TT -CLASS="LITERAL" ->/</TT ->, because - the pattern contains a forward slash, which would otherwise have to be escaped - by a backslash (<TT -CLASS="LITERAL" -></TT ->).</P -><P -> Now, let's examine the pattern: it starts with the text <TT -CLASS="LITERAL" -><script.*</TT -> - enclosed in parentheses. Since the dot matches any character, and <TT -CLASS="LITERAL" ->*</TT -> - means: <SPAN -CLASS="QUOTE" ->"Match an arbitrary number of the element left of myself"</SPAN ->, this - matches <SPAN -CLASS="QUOTE" ->"<script"</SPAN ->, followed by <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->any</I -></SPAN -> text, i.e. - it matches the whole page, from the start of the first <script> tag.</P -><P -> That's more than we want, but the pattern continues: <TT -CLASS="LITERAL" ->document.referrer</TT -> - matches only the exact string <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN ->. The dot needed to - be <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->escaped</I -></SPAN ->, i.e. preceded by a backslash, to take away its - special meaning as a joker, and make it just a regular dot. So far, the meaning is: - Match from the start of the first <script> tag in a the page, up to, and including, - the text <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN ->, if <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->both</I -></SPAN -> are present - in the page (and appear in that order).</P -><P -> But there's still more pattern to go. The next element, again enclosed in parentheses, - is <TT -CLASS="LITERAL" ->.*</script></TT ->. You already know what <TT -CLASS="LITERAL" ->.*</TT -> - means, so the whole pattern translates to: Match from the start of the first <script> - tag in a page to the end of the last <script> tag, provided that the text - <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN -> appears somewhere in between.</P -><P -> This is still not the whole story, since we have ignored the options and the parentheses: - The portions of the page matched by sub-patterns that are enclosed in parentheses, will be - remembered and be available through the variables <TT -CLASS="LITERAL" ->$1, $2, ...</TT -> in - the substitute. The <TT -CLASS="LITERAL" ->U</TT -> option switches to ungreedy matching, which means - that the first <TT -CLASS="LITERAL" ->.*</TT -> in the pattern will only <SPAN -CLASS="QUOTE" ->"eat up"</SPAN -> all - text in between <SPAN -CLASS="QUOTE" ->"<script"</SPAN -> and the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->first</I -></SPAN -> occurrence - of <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN ->, and that the second <TT -CLASS="LITERAL" ->.*</TT -> will - only span the text up to the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->first</I -></SPAN -> <SPAN -CLASS="QUOTE" ->"</script>"</SPAN -> - tag. Furthermore, the <TT -CLASS="LITERAL" ->s</TT -> option says that the match may span - multiple lines in the page, and the <TT -CLASS="LITERAL" ->g</TT -> option again means that the - substitution is global.</P -><P -> So, to summarize, the pattern means: Match all scripts that contain the text - <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN ->. Remember the parts of the script from - (and including) the start tag up to (and excluding) the string - <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN -> as <TT -CLASS="LITERAL" ->$1</TT ->, and the part following - that string, up to and including the closing tag, as <TT -CLASS="LITERAL" ->$2</TT ->.</P -><P -> Now the pattern is deciphered, but wasn't this about substituting things? So - lets look at the substitute: <TT -CLASS="LITERAL" ->$1"Not Your Business!"$2</TT -> is - easy to read: The text remembered as <TT -CLASS="LITERAL" ->$1</TT ->, followed by - <TT -CLASS="LITERAL" ->"Not Your Business!"</TT -> (<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->including</I -></SPAN -> - the quotation marks!), followed by the text remembered as <TT -CLASS="LITERAL" ->$2</TT ->. - This produces an exact copy of the original string, with the middle part - (the <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN ->) replaced by <TT -CLASS="LITERAL" ->"Not Your - Business!"</TT ->.</P -><P -> The whole job now reads: Replace <SPAN -CLASS="QUOTE" ->"document.referrer"</SPAN -> by - <TT -CLASS="LITERAL" ->"Not Your Business!"</TT -> wherever it appears inside a - <script> tag. Note that this job won't break JavaScript syntax, - since both the original and the replacement are syntactically valid - string objects. The script just won't have access to the referrer - information anymore.</P -><P -> We'll show you two other jobs from the JavaScript taming department, but - this time only point out the constructs of special interest:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># The status bar is for displaying link targets, not pointless blahblah -# -s/window.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</PRE -></TD -></TR -></TABLE -></P -><P -> <TT -CLASS="LITERAL" ->\s</TT -> stands for whitespace characters (space, tab, newline, - carriage return, form feed), so that <TT -CLASS="LITERAL" ->\s*</TT -> means: <SPAN -CLASS="QUOTE" ->"zero - or more whitespace"</SPAN ->. The <TT -CLASS="LITERAL" ->?</TT -> in <TT -CLASS="LITERAL" ->.*?</TT -> - makes this matching of arbitrary text ungreedy. (Note that the <TT -CLASS="LITERAL" ->U</TT -> - option is not set). The <TT -CLASS="LITERAL" ->['"]</TT -> construct means: <SPAN -CLASS="QUOTE" ->"a single - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->or</I -></SPAN -> a double quote"</SPAN ->. Finally, <TT -CLASS="LITERAL" ->\1</TT -> is - a back-reference to the first parenthesis just like <TT -CLASS="LITERAL" ->$1</TT -> above, - with the difference that in the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->pattern</I -></SPAN ->, a backslash indicates - a back-reference, whereas in the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->substitute</I -></SPAN ->, it's the dollar.</P -><P -> So what does this job do? It replaces assignments of single- or double-quoted - strings to the <SPAN -CLASS="QUOTE" ->"window.status"</SPAN -> object with a dummy assignment - (using a variable name that is hopefully odd enough not to conflict with - real variables in scripts). Thus, it catches many cases where e.g. pointless - descriptions are displayed in the status bar instead of the link target when - you move your mouse over links.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html -# -s/(<body [^>]*)onunload(.*>)/$1never$2/iU</PRE -></TD -></TR -></TABLE -></P -><P -> Including the - <A -HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events..." -TARGET="_top" ->OnUnload - event binding</A -> in the HTML DOM was a <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->CRIME</I -></SPAN ->. - When I close a browser window, I want it to close and die. Basta. - This job replaces the <SPAN -CLASS="QUOTE" ->"onunload"</SPAN -> attribute in - <SPAN -CLASS="QUOTE" ->"<body>"</SPAN -> tags with the dummy word <TT -CLASS="LITERAL" ->never</TT ->. - Note that the <TT -CLASS="LITERAL" ->i</TT -> option makes the pattern matching - case-insensitive. Also note that ungreedy matching alone doesn't always guarantee - a minimal match: In the first parenthesis, we had to use <TT -CLASS="LITERAL" ->[^>]*</TT -> - instead of <TT -CLASS="LITERAL" ->.*</TT -> to prevent the match from exceeding the - <body> tag if it doesn't contain <SPAN -CLASS="QUOTE" ->"OnUnload"</SPAN ->, but the page's - content does.</P -><P -> The last example is from the fun department:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" ->FILTER: fun Fun text replacements - -# Spice the daily news: -# -s/microsoft(?!.com)/MicroSuck/ig</PRE -></TD -></TR -></TABLE -></P -><P -> Note the <TT -CLASS="LITERAL" ->(?!.com)</TT -> part (a so-called negative lookahead) - in the job's pattern, which means: Don't match, if the string - <SPAN -CLASS="QUOTE" ->".com"</SPAN -> appears directly following <SPAN -CLASS="QUOTE" ->"microsoft"</SPAN -> - in the page. This prevents links to microsoft.com from being trashed, while - still replacing the word everywhere else.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -># Buzzword Bingo (example for extended regex syntax) -# -s* industry[ -]leading \ -| cutting[ -]edge \ -| customer[ -]focused \ -| market[ -]driven \ -| award[ -]winning # Comments are OK, too! \ -| high[ -]performance \ -| solutions[ -]based \ -| unmatched \ -| unparalleled \ -| unrivalled \ -*<font color="red"><b>BINGO!</b></font> \ -*igx</PRE -></TD -></TR -></TABLE -></P -><P -> The <TT -CLASS="LITERAL" ->x</TT -> option in this job turns on extended syntax, and allows for - e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting. </P -><P -> You get the idea?</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="PREDEFINED-FILTERS" ->9.2. The Pre-defined Filters</A -></H2 -><P ->The distribution <TT -CLASS="FILENAME" ->default.filter</TT -> file contains a selection of -pre-defined filters for your convenience:</P -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->js-annoyances</I -></SPAN -></DT -><DD -><P -> The purpose of this filter is to get rid of particularly annoying JavaScript abuse. - To that end, it - <P -></P -><UL -><LI -><P -> replaces JavaScript references to the browser's referrer information - with the string "Not Your Business!". This compliments the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HIDE-REFERRER" ->hide-referrer</A -></TT -> action on the content level. - </P -></LI -><LI -><P -> removes the bindings to the DOM's - <A -HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events..." -TARGET="_top" ->unload - event</A -> which we feel has no right to exist and is responsible for most <SPAN -CLASS="QUOTE" ->"exit consoles"</SPAN ->, i.e. - nasty windows that pop up when you close another one. - </P -></LI -><LI -><P -> removes code that causes new windows to be opened with undesired properties, such as being - full-screen, non-resizeable, without location, status or menu bar etc. - </P -></LI -></UL -> - </P -><P -> Use with caution. This is an aggressive filter, and can break sites that - rely heavily on JavaScript. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->js-events</I -></SPAN -></DT -><DD -><P -> This is a very radical measure. It removes virtually all JavaScript event bindings, which - means that scripts can not react to user actions such as mouse movements or clicks, window - resizing etc, anymore. Use with caution! - </P -><P -> We <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->strongly discourage</I -></SPAN -> using this filter as a default since it breaks - many legitimate scripts. It is meant for use only on extra-nasty sites (should you really - need to go there). - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->html-annoyances</I -></SPAN -></DT -><DD -><P -> This filter will undo many common instances of HTML based abuse. - </P -><P -> The <TT -CLASS="LITERAL" ->BLINK</TT -> and <TT -CLASS="LITERAL" ->MARQUEE</TT -> tags - are neutralized (yeah baby!), and browser windows will be created as - resizeable (as of course they should be!), and will have location, - scroll and menu bars -- even if specified otherwise. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->content-cookies</I -></SPAN -></DT -><DD -><P -> Most cookies are set in the HTTP dialog, where they can be intercepted - by the - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -></TT -> - and <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -></TT -> - actions. But web sites increasingly make use of HTML meta tags and JavaScript - to sneak cookies to the browser on the content level. - </P -><P -> This filter disables most HTML and JavaScript code that reads or sets - cookies. It cannot detect all clever uses of these types of code, so it - should not be relied on as an absolute fix. Use it wherever you would also - use the cookie crunch actions. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->refresh tags</I -></SPAN -></DT -><DD -><P -> Disable any refresh tags if the interval is greater than nine seconds (so - that redirections done via refresh tags are not destroyed). This is useful - for dial-on-demand setups, or for those who find this HTML feature - annoying. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->unsolicited-popups</I -></SPAN -></DT -><DD -><P -> This filter attempts to prevent only <SPAN -CLASS="QUOTE" ->"unsolicited"</SPAN -> pop-up - windows from opening, yet still allow pop-up windows that the user - has explicitly chosen to open. It was added in version 3.0.1, - as an improvement over earlier such filters. - </P -><P -> Technical note: The filter works by redefining the window.open JavaScript - function to a dummy function, <TT -CLASS="LITERAL" ->PrivoxyWindowOpen()</TT ->, - during the loading and rendering phase of each HTML page access, and - restoring the function afterward. - </P -><P -> This is recommended only for browsers that cannot perform this function - reliably themselves. And be aware that some sites require such windows - in order to function normally. Use with caution. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all-popups</I -></SPAN -></DT -><DD -><P -> Attempt to prevent <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> pop-up windows from opening. - Note this should be used with even more discretion than the above, since - it is more likely to break some sites that require pop-ups for normal - usage. Use with caution. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->img-reorder</I -></SPAN -></DT -><DD -><P -> This is a helper filter that has no value if used alone. It makes the - <TT -CLASS="LITERAL" ->banners-by-size</TT -> and <TT -CLASS="LITERAL" ->banners-by-link</TT -> - (see below) filters more effective and should be enabled together with them. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->banners-by-size</I -></SPAN -></DT -><DD -><P -> This filter removes image tags purely based on what size they are. Fortunately - for us, many ads and banner images tend to conform to certain standardized - sizes, which makes this filter quite effective for ad stripping purposes. - </P -><P -> Occasionally this filter will cause false positives on images that are not ads, - but just happen to be of one of the standard banner sizes. - </P -><P -> Recommended only for those who require extreme ad blocking. The default - block rules should catch 95+% of all ads <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->without</I -></SPAN -> this filter enabled. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->banners-by-link</I -></SPAN -></DT -><DD -><P -> This is an experimental filter that attempts to kill any banners if - their URLs seem to point to known or suspected click trackers. It is currently - not of much value and is not recommended for use by default. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->webbugs</I -></SPAN -></DT -><DD -><P -> Webbugs are small, invisible images (technically 1X1 GIF images), that - are used to track users across websites, and collect information on them. - As an HTML page is loaded by the browser, an embedded image tag causes the - browser to contact a third-party site, disclosing the tracking information - through the requested URL and/or cookies for that third-party domain, without - the user ever becoming aware of the interaction with the third-party site. - HTML-ized spam also uses a similar technique to verify email addresses. - </P -><P -> This filter removes the HTML code that loads such <SPAN -CLASS="QUOTE" ->"webbugs"</SPAN ->. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->tiny-textforms</I -></SPAN -></DT -><DD -><P -> A rather special-purpose filter that can be used to enlarge textareas (those - multi-line text boxes in web forms) and turn off hard word wrap in them. - It was written for the sourceforge.net tracker system where such boxes are - a nuisance, but it can be handy on other sites, too. - </P -><P -> It is not recommended to use this filter as a default. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->jumping-windows</I -></SPAN -></DT -><DD -><P -> Many consider windows that move, or resize themselves to be abusive. This filter - neutralizes the related JavaScript code. Note that some sites might not display - or behave as intended when using this filter. Use with caution. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->frameset-borders</I -></SPAN -></DT -><DD -><P -> Some web designers seem to assume that everyone in the world will view their - web sites using the same browser brand and version, screen resolution etc, - because only that assumption could explain why they'd use static frame sizes, - yet prevent their frames from being resized by the user, should they be too - small to show their whole content. - </P -><P -> This filter removes the related HTML code. It should only be applied to sites - which need it. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->demoronizer</I -></SPAN -></DT -><DD -><P -> Many Microsoft products that generate HTML use non-standard extensions (read: - violations) of the ISO 8859-1 aka Latin-1 character set. This can cause those - HTML documents to display with errors on standard-compliant platforms. - </P -><P -> This filter translates the MS-only characters into Latin-1 equivalents. - It is not necessary when using MS products, and will cause corruption of - all documents that use 8-bit character sets other than Latin-1. It's mostly - worthwhile for Europeans on non-MS platforms, if weird garbage characters - sometimes appear on some pages, or user agents that don't correct for this on - the fly. - - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->shockwave-flash</I -></SPAN -></DT -><DD -><P -> A filter for shockwave haters. As the name suggests, this filter strips code - out of web pages that is used to embed shockwave flash objects. - </P -><P -> </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->quicktime-kioskmode</I -></SPAN -></DT -><DD -><P -> Change HTML code that embeds Quicktime objects so that kioskmode, which - prevents saving, is disabled. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->fun</I -></SPAN -></DT -><DD -><P -> Text replacements for subversive browsing fun. Make fun of your favorite - Monopolist or play buzzword bingo. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->crude-parental</I -></SPAN -></DT -><DD -><P -> A demonstration-only filter that shows how <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - can be used to delete web content on a keyword basis. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->ie-exploits</I -></SPAN -></DT -><DD -><P -> An experimental collection of text replacements to disable malicious HTML and JavaScript - code that exploits known security holes in Internet Explorer. - </P -><P -> Presently, it only protects against Nimda and a cross-site scripting bug, and - would need active maintenance to provide more substantial protection. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->site-specifics</I -></SPAN -></DT -><DD -><P -> Some web sites have very specific problems, the cure for which doesn't apply - anywhere else, or could even cause damage on other sites. - </P -><P -> This is a collection of such site-specific cures which should only be applied - to the sites they were intended for, which is what the supplied - <TT -CLASS="FILENAME" ->default.action</TT -> file does. Users shouldn't need to change - anything regarding this filter. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->google</I -></SPAN -></DT -><DD -><P -> A CSS based block for Google text ads. Also removes a width limitation - and the toolbar advertisement. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->yahoo</I -></SPAN -></DT -><DD -><P -> Another CSS based block, this time for Yahoo text ads. And removes - a width limitation as well. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->msn</I -></SPAN -></DT -><DD -><P -> Another CSS based block, this time for MSN text ads. And removes - tracking URLs, as well as a width limitation. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->blogspot</I -></SPAN -></DT -><DD -><P -> Cleans up some Blogspot blogs. Read the fine print before using this one! - </P -><P -> This filter also intentionally removes some navigation stuff and sets the - page width to 100%. As a result, some rounded <SPAN -CLASS="QUOTE" ->"corners"</SPAN -> would - appear to early or not at all and as fixing this would require a browser - that understands background-size (CSS3), they are removed instead. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->xml-to-html</I -></SPAN -></DT -><DD -><P -> Server-header filter to change the Content-Type from xml to html. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->html-to-xml</I -></SPAN -></DT -><DD -><P -> Server-header filter to change the Content-Type from html to xml. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->no-ping</I -></SPAN -></DT -><DD -><P -> Removes the non-standard <TT -CLASS="LITERAL" ->ping</TT -> attribute from - anchor and area HTML tags. - </P -></DD -><DT -><SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->hide-tor-exit-notation</I -></SPAN -></DT -><DD -><P -> Client-header filter to remove the <B -CLASS="COMMAND" ->Tor</B -> exit node notation - found in Host and Referer headers. - </P -><P -> If <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> and <B -CLASS="COMMAND" ->Tor</B -> are chained and <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is configured to use socks4a, one can use <SPAN -CLASS="QUOTE" ->"http://www.example.org.foobar.exit/"</SPAN -> - to access the host <SPAN -CLASS="QUOTE" ->"www.example.org"</SPAN -> through the - <B -CLASS="COMMAND" ->Tor</B -> exit node <SPAN -CLASS="QUOTE" ->"foobar"</SPAN ->. - </P -><P -> As the HTTP client isn't aware of this notation, it treats the - whole string <SPAN -CLASS="QUOTE" ->"www.example.org.foobar.exit"</SPAN -> as host and uses it - for the <SPAN -CLASS="QUOTE" ->"Host"</SPAN -> and <SPAN -CLASS="QUOTE" ->"Referer"</SPAN -> headers. From the - server's point of view the resulting headers are invalid and can cause problems. - </P -><P -> An invalid <SPAN -CLASS="QUOTE" ->"Referer"</SPAN -> header can trigger <SPAN -CLASS="QUOTE" ->"hot-linking"</SPAN -> - protections, an invalid <SPAN -CLASS="QUOTE" ->"Host"</SPAN -> header will make it impossible for - the server to find the right vhost (several domains hosted on the same IP address). - </P -><P -> This client-header filter removes the <SPAN -CLASS="QUOTE" ->"foo.exit"</SPAN -> part in those headers - to prevent the mentioned problems. Note that it only modifies - the HTTP headers, it doesn't make it impossible for the server - to detect your <B -CLASS="COMMAND" ->Tor</B -> exit node based on the IP address - the request is coming from. - </P -></DD -></DL -></DIV -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="actions-file.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="templates.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Actions Files</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Privoxy's Template Files</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/index.html b/external/privoxy/doc/webserver/user-manual/index.html deleted file mode 100644 index 366386b..0000000 --- a/external/privoxy/doc/webserver/user-manual/index.html +++ /dev/null @@ -1,963 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy 3.0.12 User Manual</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="NEXT" -TITLE="Introduction" -HREF="introduction.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="ARTICLE" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="ARTICLE" -><DIV -CLASS="TITLEPAGE" -><H1 -CLASS="TITLE" -><A -NAME="AEN2" ->Privoxy 3.0.12 User Manual</A -></H1 -><P -CLASS="PUBDATE" -> <SUB -> <A -HREF="copyright.html" ->Copyright</A -> © 2001-2009 by - <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->Privoxy Developers</A -> - </SUB -><BR></P -><P -CLASS="PUBDATE" ->$Id: index.html,v 1.60 2009/03/21 12:58:53 fabiankeil Exp $<BR></P -><DIV -><DIV -CLASS="ABSTRACT" -><P -></P -><A -NAME="AEN9" -></A -><P -> The <I -CLASS="CITETITLE" ->Privoxy User Manual</I -> gives users information on how to - install, configure and use <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->Privoxy</A ->. - </P -><P -> Privoxy is a non-caching web proxy with advanced filtering capabilities - for enhancing privacy, modifying web page data and HTTP headers, controlling - access, and removing ads and other obnoxious Internet junk. Privoxy has a - flexible configuration and can be customized to suit individual needs and tastes. - It has application for both stand-alone systems and multi-user networks.</P -><P -> Privoxy is Free Software and licensed under the GPL2.</P -><P -> Privoxy is an associated project of Software in the Public Interest (SPI). - <A -HREF="http://www.privoxy.org/faq/general.html#DONATE" -TARGET="_top" ->Donations are welcome</A ->.</P -><P -> You can find the latest version of the <I -CLASS="CITETITLE" ->Privoxy User Manual</I -> at <A -HREF="http://www.privoxy.org/user-manual/" -TARGET="_top" ->http://www.privoxy.org/user-manual/</A ->. - Please see the <A -HREF="contact.html" ->Contact section</A -> on how to - contact the developers. - </P -><P -></P -></DIV -></DIV -><HR></DIV -><DIV -CLASS="TOC" -><DL -><DT -><B ->Table of Contents</B -></DT -><DT ->1. <A -HREF="introduction.html" ->Introduction</A -></DT -><DD -><DL -><DT ->1.1. <A -HREF="introduction.html#FEATURES" ->Features</A -></DT -></DL -></DD -><DT ->2. <A -HREF="installation.html" ->Installation</A -></DT -><DD -><DL -><DT ->2.1. <A -HREF="installation.html#INSTALLATION-PACKAGES" ->Binary Packages</A -></DT -><DD -><DL -><DT ->2.1.1. <A -HREF="installation.html#INSTALLATION-PACK-RPM" ->Red Hat and Fedora RPMs</A -></DT -><DT ->2.1.2. <A -HREF="installation.html#INSTALLATION-DEB" ->Debian and Ubuntu</A -></DT -><DT ->2.1.3. <A -HREF="installation.html#INSTALLATION-PACK-WIN" ->Windows</A -></DT -><DT ->2.1.4. <A -HREF="installation.html#INSTALLATION-PACK-BINTGZ" ->Solaris</A -></DT -><DT ->2.1.5. <A -HREF="installation.html#INSTALLATION-OS2" ->OS/2</A -></DT -><DT ->2.1.6. <A -HREF="installation.html#INSTALLATION-MAC" ->Mac OS X</A -></DT -><DT ->2.1.7. <A -HREF="installation.html#INSTALLATION-AMIGA" ->AmigaOS</A -></DT -><DT ->2.1.8. <A -HREF="installation.html#INSTALLATION-TBZ" ->FreeBSD</A -></DT -><DT ->2.1.9. <A -HREF="installation.html#INSTALLATTION-GENTOO" ->Gentoo</A -></DT -></DL -></DD -><DT ->2.2. <A -HREF="installation.html#INSTALLATION-SOURCE" ->Building from Source</A -></DT -><DT ->2.3. <A -HREF="installation.html#INSTALLATION-KEEPUPDATED" ->Keeping your Installation Up-to-Date</A -></DT -></DL -></DD -><DT ->3. <A -HREF="whatsnew.html" ->What's New in this Release</A -></DT -><DD -><DL -><DT ->3.1. <A -HREF="whatsnew.html#UPGRADERSNOTE" ->Note to Upgraders</A -></DT -></DL -></DD -><DT ->4. <A -HREF="quickstart.html" ->Quickstart to Using Privoxy</A -></DT -><DD -><DL -><DT ->4.1. <A -HREF="quickstart.html#QUICKSTART-AD-BLOCKING" ->Quickstart to Ad Blocking</A -></DT -></DL -></DD -><DT ->5. <A -HREF="startup.html" ->Starting Privoxy</A -></DT -><DD -><DL -><DT ->5.1. <A -HREF="startup.html#START-REDHAT" ->Red Hat and Fedora</A -></DT -><DT ->5.2. <A -HREF="startup.html#START-DEBIAN" ->Debian</A -></DT -><DT ->5.3. <A -HREF="startup.html#START-WINDOWS" ->Windows</A -></DT -><DT ->5.4. <A -HREF="startup.html#START-UNICES" ->Solaris, NetBSD, FreeBSD, HP-UX and others</A -></DT -><DT ->5.5. <A -HREF="startup.html#START-OS2" ->OS/2</A -></DT -><DT ->5.6. <A -HREF="startup.html#START-MACOSX" ->Mac OS X</A -></DT -><DT ->5.7. <A -HREF="startup.html#START-AMIGAOS" ->AmigaOS</A -></DT -><DT ->5.8. <A -HREF="startup.html#START-GENTOO" ->Gentoo</A -></DT -><DT ->5.9. <A -HREF="startup.html#CMDOPTIONS" ->Command Line Options</A -></DT -></DL -></DD -><DT ->6. <A -HREF="configuration.html" ->Privoxy Configuration</A -></DT -><DD -><DL -><DT ->6.1. <A -HREF="configuration.html#AEN776" ->Controlling Privoxy with Your Web Browser</A -></DT -><DT ->6.2. <A -HREF="configuration.html#CONFOVERVIEW" ->Configuration Files Overview</A -></DT -></DL -></DD -><DT ->7. <A -HREF="config.html" ->The Main Configuration File</A -></DT -><DD -><DL -><DT ->7.1. <A -HREF="config.html#LOCAL-SET-UP" ->Local Set-up Documentation</A -></DT -><DD -><DL -><DT ->7.1.1. <A -HREF="config.html#USER-MANUAL" ->user-manual</A -></DT -><DT ->7.1.2. <A -HREF="config.html#TRUST-INFO-URL" ->trust-info-url</A -></DT -><DT ->7.1.3. <A -HREF="config.html#ADMIN-ADDRESS" ->admin-address</A -></DT -><DT ->7.1.4. <A -HREF="config.html#PROXY-INFO-URL" ->proxy-info-url</A -></DT -></DL -></DD -><DT ->7.2. <A -HREF="config.html#CONF-LOG-LOC" ->Configuration and Log File Locations</A -></DT -><DD -><DL -><DT ->7.2.1. <A -HREF="config.html#CONFDIR" ->confdir</A -></DT -><DT ->7.2.2. <A -HREF="config.html#TEMPLDIR" ->templdir</A -></DT -><DT ->7.2.3. <A -HREF="config.html#LOGDIR" ->logdir</A -></DT -><DT ->7.2.4. <A -HREF="config.html#ACTIONSFILE" ->actionsfile</A -></DT -><DT ->7.2.5. <A -HREF="config.html#FILTERFILE" ->filterfile</A -></DT -><DT ->7.2.6. <A -HREF="config.html#LOGFILE" ->logfile</A -></DT -><DT ->7.2.7. <A -HREF="config.html#TRUSTFILE" ->trustfile</A -></DT -></DL -></DD -><DT ->7.3. <A -HREF="config.html#DEBUGGING" ->Debugging</A -></DT -><DD -><DL -><DT ->7.3.1. <A -HREF="config.html#DEBUG" ->debug</A -></DT -><DT ->7.3.2. <A -HREF="config.html#SINGLE-THREADED" ->single-threaded</A -></DT -><DT ->7.3.3. <A -HREF="config.html#HOSTNAME" ->hostname</A -></DT -></DL -></DD -><DT ->7.4. <A -HREF="config.html#ACCESS-CONTROL" ->Access Control and Security</A -></DT -><DD -><DL -><DT ->7.4.1. <A -HREF="config.html#LISTEN-ADDRESS" ->listen-address</A -></DT -><DT ->7.4.2. <A -HREF="config.html#TOGGLE" ->toggle</A -></DT -><DT ->7.4.3. <A -HREF="config.html#ENABLE-REMOTE-TOGGLE" ->enable-remote-toggle</A -></DT -><DT ->7.4.4. <A -HREF="config.html#ENABLE-REMOTE-HTTP-TOGGLE" ->enable-remote-http-toggle</A -></DT -><DT ->7.4.5. <A -HREF="config.html#ENABLE-EDIT-ACTIONS" ->enable-edit-actions</A -></DT -><DT ->7.4.6. <A -HREF="config.html#ENFORCE-BLOCKS" ->enforce-blocks</A -></DT -><DT ->7.4.7. <A -HREF="config.html#ACLS" ->ACLs: permit-access and deny-access</A -></DT -><DT ->7.4.8. <A -HREF="config.html#BUFFER-LIMIT" ->buffer-limit</A -></DT -></DL -></DD -><DT ->7.5. <A -HREF="config.html#FORWARDING" ->Forwarding</A -></DT -><DD -><DL -><DT ->7.5.1. <A -HREF="config.html#FORWARD" ->forward</A -></DT -><DT ->7.5.2. <A -HREF="config.html#SOCKS" ->forward-socks4, forward-socks4a and forward-socks5</A -></DT -><DT ->7.5.3. <A -HREF="config.html#ADVANCED-FORWARDING-EXAMPLES" ->Advanced Forwarding Examples</A -></DT -><DT ->7.5.4. <A -HREF="config.html#FORWARDED-CONNECT-RETRIES" ->forwarded-connect-retries</A -></DT -><DT ->7.5.5. <A -HREF="config.html#ACCEPT-INTERCEPTED-REQUESTS" ->accept-intercepted-requests</A -></DT -><DT ->7.5.6. <A -HREF="config.html#ALLOW-CGI-REQUEST-CRUNCHING" ->allow-cgi-request-crunching</A -></DT -><DT ->7.5.7. <A -HREF="config.html#SPLIT-LARGE-FORMS" ->split-large-forms</A -></DT -><DT ->7.5.8. <A -HREF="config.html#KEEP-ALIVE-TIMEOUT" ->keep-alive-timeout</A -></DT -><DT ->7.5.9. <A -HREF="config.html#SOCKET-TIMEOUT" ->socket-timeout</A -></DT -></DL -></DD -><DT ->7.6. <A -HREF="config.html#WINDOWS-GUI" ->Windows GUI Options</A -></DT -></DL -></DD -><DT ->8. <A -HREF="actions-file.html" ->Actions Files</A -></DT -><DD -><DL -><DT ->8.1. <A -HREF="actions-file.html#AEN2288" ->Finding the Right Mix</A -></DT -><DT ->8.2. <A -HREF="actions-file.html#AEN2295" ->How to Edit</A -></DT -><DT ->8.3. <A -HREF="actions-file.html#ACTIONS-APPLY" ->How Actions are Applied to Requests</A -></DT -><DT ->8.4. <A -HREF="actions-file.html#AF-PATTERNS" ->Patterns</A -></DT -><DD -><DL -><DT ->8.4.1. <A -HREF="actions-file.html#AEN2386" ->The Domain Pattern</A -></DT -><DT ->8.4.2. <A -HREF="actions-file.html#AEN2462" ->The Path Pattern</A -></DT -><DT ->8.4.3. <A -HREF="actions-file.html#TAG-PATTERN" ->The Tag Pattern</A -></DT -></DL -></DD -><DT ->8.5. <A -HREF="actions-file.html#ACTIONS" ->Actions</A -></DT -><DD -><DL -><DT ->8.5.1. <A -HREF="actions-file.html#ADD-HEADER" ->add-header</A -></DT -><DT ->8.5.2. <A -HREF="actions-file.html#BLOCK" ->block</A -></DT -><DT ->8.5.3. <A -HREF="actions-file.html#CHANGE-X-FORWARDED-FOR" ->change-x-forwarded-for</A -></DT -><DT ->8.5.4. <A -HREF="actions-file.html#CLIENT-HEADER-FILTER" ->client-header-filter</A -></DT -><DT ->8.5.5. <A -HREF="actions-file.html#CLIENT-HEADER-TAGGER" ->client-header-tagger</A -></DT -><DT ->8.5.6. <A -HREF="actions-file.html#CONTENT-TYPE-OVERWRITE" ->content-type-overwrite</A -></DT -><DT ->8.5.7. <A -HREF="actions-file.html#CRUNCH-CLIENT-HEADER" ->crunch-client-header</A -></DT -><DT ->8.5.8. <A -HREF="actions-file.html#CRUNCH-IF-NONE-MATCH" ->crunch-if-none-match</A -></DT -><DT ->8.5.9. <A -HREF="actions-file.html#CRUNCH-INCOMING-COOKIES" ->crunch-incoming-cookies</A -></DT -><DT ->8.5.10. <A -HREF="actions-file.html#CRUNCH-SERVER-HEADER" ->crunch-server-header</A -></DT -><DT ->8.5.11. <A -HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES" ->crunch-outgoing-cookies</A -></DT -><DT ->8.5.12. <A -HREF="actions-file.html#DEANIMATE-GIFS" ->deanimate-gifs</A -></DT -><DT ->8.5.13. <A -HREF="actions-file.html#DOWNGRADE-HTTP-VERSION" ->downgrade-http-version</A -></DT -><DT ->8.5.14. <A -HREF="actions-file.html#FAST-REDIRECTS" ->fast-redirects</A -></DT -><DT ->8.5.15. <A -HREF="actions-file.html#FILTER" ->filter</A -></DT -><DT ->8.5.16. <A -HREF="actions-file.html#FORCE-TEXT-MODE" ->force-text-mode</A -></DT -><DT ->8.5.17. <A -HREF="actions-file.html#FORWARD-OVERRIDE" ->forward-override</A -></DT -><DT ->8.5.18. <A -HREF="actions-file.html#HANDLE-AS-EMPTY-DOCUMENT" ->handle-as-empty-document</A -></DT -><DT ->8.5.19. <A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></DT -><DT ->8.5.20. <A -HREF="actions-file.html#HIDE-ACCEPT-LANGUAGE" ->hide-accept-language</A -></DT -><DT ->8.5.21. <A -HREF="actions-file.html#HIDE-CONTENT-DISPOSITION" ->hide-content-disposition</A -></DT -><DT ->8.5.22. <A -HREF="actions-file.html#HIDE-IF-MODIFIED-SINCE" ->hide-if-modified-since</A -></DT -><DT ->8.5.23. <A -HREF="actions-file.html#HIDE-FROM-HEADER" ->hide-from-header</A -></DT -><DT ->8.5.24. <A -HREF="actions-file.html#HIDE-REFERRER" ->hide-referrer</A -></DT -><DT ->8.5.25. <A -HREF="actions-file.html#HIDE-USER-AGENT" ->hide-user-agent</A -></DT -><DT ->8.5.26. <A -HREF="actions-file.html#LIMIT-CONNECT" ->limit-connect</A -></DT -><DT ->8.5.27. <A -HREF="actions-file.html#PREVENT-COMPRESSION" ->prevent-compression</A -></DT -><DT ->8.5.28. <A -HREF="actions-file.html#OVERWRITE-LAST-MODIFIED" ->overwrite-last-modified</A -></DT -><DT ->8.5.29. <A -HREF="actions-file.html#REDIRECT" ->redirect</A -></DT -><DT ->8.5.30. <A -HREF="actions-file.html#SERVER-HEADER-FILTER" ->server-header-filter</A -></DT -><DT ->8.5.31. <A -HREF="actions-file.html#SERVER-HEADER-TAGGER" ->server-header-tagger</A -></DT -><DT ->8.5.32. <A -HREF="actions-file.html#SESSION-COOKIES-ONLY" ->session-cookies-only</A -></DT -><DT ->8.5.33. <A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A -></DT -><DT ->8.5.34. <A -HREF="actions-file.html#AEN4093" ->Summary</A -></DT -></DL -></DD -><DT ->8.6. <A -HREF="actions-file.html#ALIASES" ->Aliases</A -></DT -><DT ->8.7. <A -HREF="actions-file.html#ACT-EXAMPLES" ->Actions Files Tutorial</A -></DT -><DD -><DL -><DT ->8.7.1. <A -HREF="actions-file.html#AEN4157" ->match-all.action</A -></DT -><DT ->8.7.2. <A -HREF="actions-file.html#AEN4179" ->default.action</A -></DT -><DT ->8.7.3. <A -HREF="actions-file.html#AEN4292" ->user.action</A -></DT -></DL -></DD -></DL -></DD -><DT ->9. <A -HREF="filter-file.html" ->Filter Files</A -></DT -><DD -><DL -><DT ->9.1. <A -HREF="filter-file.html#AEN4447" ->Filter File Tutorial</A -></DT -><DT ->9.2. <A -HREF="filter-file.html#PREDEFINED-FILTERS" ->The Pre-defined Filters</A -></DT -></DL -></DD -><DT ->10. <A -HREF="templates.html" ->Privoxy's Template Files</A -></DT -><DT ->11. <A -HREF="contact.html" ->Contacting the Developers, Bug Reporting and Feature -Requests</A -></DT -><DD -><DL -><DT ->11.1. <A -HREF="contact.html#CONTACT-SUPPORT" ->Get Support</A -></DT -><DT ->11.2. <A -HREF="contact.html#REPORTING" ->Reporting Problems</A -></DT -><DD -><DL -><DT ->11.2.1. <A -HREF="contact.html#CONTACT-ADS" ->Reporting Ads or Other Configuration Problems</A -></DT -><DT ->11.2.2. <A -HREF="contact.html#CONTACT-BUGS" ->Reporting Bugs</A -></DT -></DL -></DD -><DT ->11.3. <A -HREF="contact.html#CONTACT-FEATURE" ->Request New Features</A -></DT -><DT ->11.4. <A -HREF="contact.html#CONTACT-OTHER" ->Other</A -></DT -></DL -></DD -><DT ->12. <A -HREF="copyright.html" ->Privoxy Copyright, License and History</A -></DT -><DD -><DL -><DT ->12.1. <A -HREF="copyright.html#AEN4921" ->License</A -></DT -><DT ->12.2. <A -HREF="copyright.html#HISTORY" ->History</A -></DT -><DT ->12.3. <A -HREF="copyright.html#AUTHORS" ->Authors</A -></DT -></DL -></DD -><DT ->13. <A -HREF="seealso.html" ->See Also</A -></DT -><DT ->14. <A -HREF="appendix.html" ->Appendix</A -></DT -><DD -><DL -><DT ->14.1. <A -HREF="appendix.html#REGEX" ->Regular Expressions</A -></DT -><DT ->14.2. <A -HREF="appendix.html#AEN5174" ->Privoxy's Internal Pages</A -></DT -><DD -><DL -><DT ->14.2.1. <A -HREF="appendix.html#BOOKMARKLETS" ->Bookmarklets</A -></DT -></DL -></DD -><DT ->14.3. <A -HREF="appendix.html#CHAIN" ->Chain of Events</A -></DT -><DT ->14.4. <A -HREF="appendix.html#ACTIONSANAT" ->Troubleshooting: Anatomy of an Action</A -></DT -></DL -></DD -></DL -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -> </TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="introduction.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -> </TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Introduction</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/installation.html b/external/privoxy/doc/webserver/user-manual/installation.html deleted file mode 100644 index f5fefc2..0000000 --- a/external/privoxy/doc/webserver/user-manual/installation.html +++ /dev/null @@ -1,1082 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Installation</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Introduction" -HREF="introduction.html"><LINK -REL="NEXT" -TITLE="What's New in this Release" -HREF="whatsnew.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="introduction.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="whatsnew.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="INSTALLATION" ->2. Installation</A -></H1 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is available both in convenient pre-compiled - packages for a wide range of operating systems, and as raw source code. - For most users, we recommend using the packages, which can be downloaded from our - <A -HREF="http://sourceforge.net/projects/ijbswa/" -TARGET="_top" ->Privoxy Project - Page</A ->.</P -><P -> Note: - On some platforms, the installer may remove previously installed versions, if - found. (See below for your platform). In any case <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->be sure to backup - your old configuration if it is valuable to you.</I -></SPAN -> See the <A -HREF="whatsnew.html#UPGRADERSNOTE" ->note to upgraders</A -> section below.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="INSTALLATION-PACKAGES" ->2.1. Binary Packages</A -></H2 -><P ->How to install the binary packages depends on your operating system:</P -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-PACK-RPM" ->2.1.1. Red Hat and Fedora RPMs</A -></H3 -><P -> RPMs can be installed with <TT -CLASS="LITERAL" ->rpm -Uvh privoxy-3.0.12-1.rpm</TT ->, - and will use <TT -CLASS="FILENAME" ->/etc/privoxy</TT -> for the location - of configuration files.</P -><P -> Note that on Red Hat, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->not</I -></SPAN -> be automatically started on system boot. You will - need to enable that using <B -CLASS="COMMAND" ->chkconfig</B ->, - <B -CLASS="COMMAND" ->ntsysv</B ->, or similar methods. </P -><P -> If you have problems with failed dependencies, try rebuilding the SRC RPM: - <TT -CLASS="LITERAL" ->rpm --rebuild privoxy-3.0.12-1.src.rpm</TT ->. This - will use your locally installed libraries and RPM version. </P -><P -> Also note that if you have a <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> RPM installed - on your system, you need to remove it first, because the packages conflict. - Otherwise, RPM will try to remove <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> - automatically if found, before installing <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-DEB" ->2.1.2. Debian and Ubuntu</A -></H3 -><P -> DEBs can be installed with <TT -CLASS="LITERAL" ->apt-get install privoxy</TT ->, - and will use <TT -CLASS="FILENAME" ->/etc/privoxy</TT -> for the location of - configuration files.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-PACK-WIN" ->2.1.3. Windows</A -></H3 -><P -> Just double-click the installer, which will guide you through - the installation process. You will find the configuration files - in the same directory as you installed <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> in. </P -><P -> Version 3.0.5 beta introduced full <SPAN -CLASS="APPLICATION" ->Windows</SPAN -> service - functionality. On Windows only, the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - program has two new command line arguments to install and uninstall - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> as a <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->service</I -></SPAN ->.</P -><P -></P -><DIV -CLASS="VARIABLELIST" -><DL -><DT ->Arguments:</DT -><DD -><P -> <TT -CLASS="REPLACEABLE" -><I ->--install</I -></TT ->[:<TT -CLASS="REPLACEABLE" -><I ->service_name</I -></TT ->] - </P -><P -> <TT -CLASS="REPLACEABLE" -><I ->--uninstall</I -></TT ->[:<TT -CLASS="REPLACEABLE" -><I ->service_name</I -></TT ->] - </P -></DD -></DL -></DIV -><P -> After invoking <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> with - <B -CLASS="COMMAND" ->--install</B ->, you will need to bring up the - <SPAN -CLASS="APPLICATION" ->Windows</SPAN -> service console to assign the user you - want <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to run under, and whether or not you - want it to run whenever the system starts. You can start the - <SPAN -CLASS="APPLICATION" ->Windows</SPAN -> services console with the following - command: <B -CLASS="COMMAND" ->services.msc</B ->. If you do not take the manual step - of modifying <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> service settings, it will - not start. Note too that you will need to give Privoxy a user account that - actually exists, or it will not be permitted to - write to its log and configuration files.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-PACK-BINTGZ" ->2.1.4. Solaris</A -></H3 -><P -> Create a new directory, <TT -CLASS="LITERAL" ->cd</TT -> to it, then unzip and - untar the archive. For the most part, you'll have to figure out where - things go. </P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-OS2" ->2.1.5. OS/2</A -></H3 -><P -> First, make sure that no previous installations of - <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> and / or - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> are left on your - system. Check that no <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> - or <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> objects are in - your startup folder. </P -><P -> Then, just double-click the WarpIN self-installing archive, which will - guide you through the installation process. A shadow of the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> executable will be placed in your - startup folder so it will start automatically whenever OS/2 starts.</P -><P -> The directory you choose to install <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - into will contain all of the configuration files.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-MAC" ->2.1.6. Mac OS X</A -></H3 -><P -> Unzip the downloaded file (you can either double-click on the zip file - icon from the Finder, or from the desktop if you downloaded it there). - Then, double-click on the package installer icon and follow the - installation process.</P -><P -> The privoxy service will automatically start after a successful - installation (in addition to every time your computer starts up). To - prevent the privoxy service from automatically starting when your - computer starts up, remove or rename the folder named - <TT -CLASS="LITERAL" ->/Library/StartupItems/Privoxy</TT ->. </P -><P -> To manually start or stop the privoxy service, use the Privoxy Utility - for Mac OS X. This application controls the privoxy service (e.g. - starting and stopping the service as well as uninstalling the software).</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-AMIGA" ->2.1.7. AmigaOS</A -></H3 -><P -> Copy and then unpack the <TT -CLASS="FILENAME" ->lha</TT -> archive to a suitable location. - All necessary files will be installed into <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - directory, including all configuration and log files. To uninstall, just - remove this directory.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATION-TBZ" ->2.1.8. FreeBSD</A -></H3 -><P -> Privoxy is part of FreeBSD's Ports Collection, you can build and install - it with <TT -CLASS="LITERAL" ->cd /usr/ports/www/privoxy; make install clean</TT ->.</P -><P -> If you don't use the ports, you can fetch and install - the package with <TT -CLASS="LITERAL" ->pkg_add -r privoxy</TT ->.</P -><P -> The port skeleton and the package can also be downloaded from the - <A -HREF="https://sourceforge.net/project/showfiles.php?group_id=11118" -TARGET="_top" ->File Release - Page</A ->, but there's no reason to use them unless you're interested in the - beta releases which are only available there.</P -></DIV -><DIV -CLASS="SECT3" -><H3 -CLASS="SECT3" -><A -NAME="INSTALLATTION-GENTOO" ->2.1.9. Gentoo</A -></H3 -><P -> Gentoo source packages (Ebuilds) for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> are - contained in the Gentoo Portage Tree (they are not on the download page, - but there is a Gentoo section, where you can see when a new - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Version is added to the Portage Tree).</P -><P -> Before installing <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> under Gentoo just do - first <TT -CLASS="LITERAL" ->emerge --sync</TT -> to get the latest changes from the - Portage tree. With <TT -CLASS="LITERAL" ->emerge privoxy</TT -> you install the latest - version.</P -><P -> Configuration files are in <TT -CLASS="FILENAME" ->/etc/privoxy</TT ->, the - documentation is in <TT -CLASS="FILENAME" ->/usr/share/doc/privoxy-3.0.12</TT -> - and the Log directory is in <TT -CLASS="FILENAME" ->/var/log/privoxy</TT ->.</P -></DIV -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="INSTALLATION-SOURCE" ->2.2. Building from Source</A -></H2 -><P -> The most convenient way to obtain the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> sources - is to download the source tarball from our - <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118&package_id=1..." -TARGET="_top" ->project download - page</A ->.</P -><P -> If you like to live on the bleeding edge and are not afraid of using - possibly unstable development versions, you can check out the up-to-the-minute - version directly from <A -HREF="http://sourceforge.net/cvs/?group_id=11118" -TARGET="_top" ->the - CVS repository</A ->. </P -><P -> To build <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> from source, - <A -HREF="http://www.gnu.org/software/autoconf/autoconf.html" -TARGET="_top" ->autoconf</A ->, - <A -HREF="http://www.gnu.org/software/make/make.html" -TARGET="_top" ->GNU make - (gmake)</A ->, and, of course, a C compiler like <A -HREF="http://www.gnu.org/software/gcc/gcc.html" -TARGET="_top" ->gcc</A -> are required.</P -><P -> When building from a source tarball, - first unpack the source: </P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> tar xzvf privoxy-3.0.12-stable-src.tar.gz - cd privoxy-3.0.12-stable</PRE -></TD -></TR -></TABLE -></P -><P -> For retrieving the current CVS sources, you'll need a CVS client installed. - Note that sources from CVS are typically development quality, and may not be - stable, or well tested. To download CVS source, check the Sourceforge - documentation, which might give commands like:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> cvs -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co current - cd current</PRE -></TD -></TR -></TABLE -></P -><P -> This will create a directory named <TT -CLASS="FILENAME" ->current/</TT ->, which will - contain the source tree.</P -><P -> You can also check out any <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - <SPAN -CLASS="QUOTE" ->"branch"</SPAN ->, just exchange the <SPAN -CLASS="APPLICATION" ->current</SPAN -> - name with the wanted branch name (Example: v_3_0_branch for the 3.0 cvs - tree).</P -><P -> It is also strongly recommended to not run <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - as root. You should configure/install/run <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> as - an unprivileged user, preferably by creating a <SPAN -CLASS="QUOTE" ->"privoxy"</SPAN -> user - and group just for this purpose. See your local documentation for the correct - command line to do add new users and groups (something like - <B -CLASS="COMMAND" ->adduser</B ->, but the command syntax may vary from platform - to platform). </P -><P -> <TT -CLASS="FILENAME" ->/etc/passwd</TT -> might then look like:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> privoxy:*:7777:7777:privoxy proxy:/no/home:/no/shell</PRE -></TD -></TR -></TABLE -></P -><P -> And then <TT -CLASS="FILENAME" ->/etc/group</TT ->, like:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> privoxy:*:7777:</PRE -></TD -></TR -></TABLE -></P -><P -> Some binary packages may do this for you.</P -><P -> Then, to build from either unpacked tarball or CVS source:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> autoheader - autoconf - ./configure # (--help to see options) - make # (the make from GNU, sometimes called gmake) - su # Possibly required - make -n install # (to see where all the files will go) - make -s install # (to really install, -s to silence output)</PRE -></TD -></TR -></TABLE -></P -><P -> Using GNU <B -CLASS="COMMAND" ->make</B ->, you can have the first four steps - automatically done for you by just typing:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> make</PRE -></TD -></TR -></TABLE -></P -><P -> in the freshly downloaded or unpacked source directory.</P -><P -> To build an executable with security enhanced features so that - users cannot easily bypass the proxy (e.g. <SPAN -CLASS="QUOTE" ->"Go There Anyway"</SPAN ->), or - alter their own configurations, <B -CLASS="COMMAND" ->configure</B -> like this:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> ./configure --disable-toggle --disable-editor --disable-force</PRE -></TD -></TR -></TABLE -></P -><P ->Then build as above. In Privoxy 3.0.7 and later, all of these options -can also be disabled through the configuration file.</P -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->WARNING:</I -></SPAN -> If installing as root, the install will fail - unless a non-root user or group is specified, or a <TT -CLASS="LITERAL" ->privoxy</TT -> - user and group already exist on the system. If a non-root user is specified, - and no group, then the installation will try to also use a group of the same name - as <SPAN -CLASS="QUOTE" ->"user"</SPAN ->. If a group is specified (and no user), then the - support files will be installed as writable by that group, and owned by the - user running the installation.</P -><P -> <B -CLASS="COMMAND" ->configure</B -> accepts <TT -CLASS="LITERAL" ->--with-user</TT -> and - <TT -CLASS="LITERAL" ->--with-group</TT -> options for setting user and group ownership - of the configuration files (which need to be writable by the daemon). The - specified <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->user must already exist</I -></SPAN ->. When starting - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, it must be run as this same user to - insure write access to configuration and log files!</P -><P -> Alternately, you can specify <TT -CLASS="LITERAL" ->user</TT -> and <TT -CLASS="LITERAL" ->group</TT -> - on the <B -CLASS="COMMAND" ->make</B -> command line, but be sure both already exist:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> make -s install USER=privoxy GROUP=privoxy</PRE -></TD -></TR -></TABLE -></P -><P -> The default installation path for <B -CLASS="COMMAND" ->make install</B -> is - <TT -CLASS="FILENAME" ->/usr/local</TT ->. This may of course be customized with - the various <B -CLASS="COMMAND" ->./configure</B -> path options. If you are doing - an install to anywhere besides <TT -CLASS="FILENAME" ->/usr/local</TT ->, be - sure to set the appropriate paths with the correct configure options - (<B -CLASS="COMMAND" ->./configure --help</B ->). Non-privileged users must of course - have write access permissions to wherever the target installation is going.</P -><P -> If you do install to <TT -CLASS="FILENAME" ->/usr/local</TT ->, the install will use - <TT -CLASS="LITERAL" ->sysconfdir=$prefix/etc/privoxy</TT -> by default. All other - destinations, and the direct usage of <TT -CLASS="LITERAL" ->--sysconfdir</TT -> flag - behave like normal, i.e. will not add the extra <TT -CLASS="FILENAME" ->privoxy</TT -> - directory. This is for a safer install, as there may already exist another - program that uses a file with the <SPAN -CLASS="QUOTE" ->"config"</SPAN -> name, and thus makes - <TT -CLASS="FILENAME" ->/usr/local/etc</TT -> cleaner.</P -><P -> If installing to <TT -CLASS="FILENAME" ->/usr/local</TT ->, the documentation will go - by default to <TT -CLASS="FILENAME" ->$prefix/share/doc</TT ->. But if this directory - doesn't exist, it will then try <TT -CLASS="FILENAME" ->$prefix/doc</TT -> and install - there before creating a new <TT -CLASS="FILENAME" ->$prefix/share/doc</TT -> just for - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->.</P -><P -> Again, if the installs goes to <TT -CLASS="FILENAME" ->/usr/local</TT ->, the - <TT -CLASS="LITERAL" ->localstatedir</TT -> (ie: <TT -CLASS="FILENAME" ->var/</TT ->) will default - to <TT -CLASS="FILENAME" ->/var</TT -> instead of <TT -CLASS="LITERAL" ->$prefix/var</TT -> so - the logs will go to <TT -CLASS="FILENAME" ->/var/log/privoxy/</TT ->, and the pid file - will be created in <TT -CLASS="FILENAME" ->/var/run/privoxy.pid</TT ->. </P -><P -> <B -CLASS="COMMAND" ->make install</B -> will attempt to set the correct values - in <TT -CLASS="FILENAME" ->config</TT -> (main configuration file). You should - check this to make sure all values are correct. If appropriate, - an init script will be installed, but it is up to the user to determine - how and where to start <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. The init - script should be checked for correct paths and values, if anything other than - a default install is done.</P -><P -> If install finds previous versions of local configuration files, most of - these will not be overwritten, and the new ones will be installed with a - <SPAN -CLASS="QUOTE" ->"new"</SPAN -> extension. default.action and default.filter - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->will be overwritten</I -></SPAN ->. You will then need - to manually update the other installed configuration files as needed. The - default template files <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->will</I -></SPAN -> be overwritten. If you have - customized, local templates, these should be stored safely in a separate - directory and defined in <TT -CLASS="FILENAME" ->config</TT -> by the - <SPAN -CLASS="QUOTE" ->"templdir"</SPAN -> directive. It is of course wise to always back-up any - important configuration files <SPAN -CLASS="QUOTE" ->"just in case"</SPAN ->. If a previous - version of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is already running, you will - have to restart it manually.</P -><P -> For more detailed instructions on how to build Redhat RPMs, - Windows self-extracting installers, building on platforms with - special requirements etc, please consult the <A -HREF="http://www.privoxy.org/developer-manual/newrelease.html" -TARGET="_top" ->developer manual</A ->.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="INSTALLATION-KEEPUPDATED" ->2.3. Keeping your Installation Up-to-Date</A -></H2 -><P -> As user feedback comes in and development continues, we will make updated versions - of both the main <A -HREF="actions-file.html" ->actions file</A -> (as a <A -HREF="http://sourceforge.net/project/showfiles.php?group_id=11118&release_id=1..." -TARGET="_top" ->separate - package</A ->) and the software itself (including the actions file) available for - download.</P -><P -> If you wish to receive an email notification whenever we release updates of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> or the actions file, <A -HREF="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce/" -TARGET="_top" ->subscribe - to our announce mailing list</A ->, ijbswa-announce@lists.sourceforge.net.</P -><P -> In order not to lose your personal changes and adjustments when updating - to the latest <TT -CLASS="LITERAL" ->default.action</TT -> file we <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->strongly - recommend</I -></SPAN -> that you use <TT -CLASS="LITERAL" ->user.action</TT -> and - <TT -CLASS="LITERAL" ->user.filter</TT -> for your local - customizations of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. See the <A -HREF="actions-file.html" ->Chapter on actions files</A -> for details.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="introduction.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="whatsnew.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Introduction</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->What's New in this Release</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/introduction.html b/external/privoxy/doc/webserver/user-manual/introduction.html deleted file mode 100644 index aad9cc0..0000000 --- a/external/privoxy/doc/webserver/user-manual/introduction.html +++ /dev/null @@ -1,292 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Introduction</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="NEXT" -TITLE="Installation" -HREF="installation.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="index.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="installation.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="INTRODUCTION" ->1. Introduction</A -></H1 -><P -> This documentation is included with the current stable version of - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, v.3.0.12.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="FEATURES" ->1.1. Features</A -></H2 -><P -> In addition to the core - features of ad blocking and - <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookie</A -> management, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> provides many supplemental - features, - that give the end-user more control, more privacy and more freedom:</P -><P -> <P -></P -><UL -><LI -><P -> Can keep outgoing connections alive and reuse them later on. - </P -></LI -><LI -><P -> Supports tagging which allows to change the behaviour - based on client and server headers. - </P -></LI -><LI -><P -> Can be run as an "intercepting" proxy, which obviates the need to - configure browsers individually. - </P -></LI -><LI -><P -> Sophisticated actions and filters for manipulating both server and client - headers. - </P -></LI -><LI -><P -> Can be chained with other proxies. - </P -></LI -><LI -><P -> Integrated browser based configuration and control utility at <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> - (shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->). Browser-based - tracing of rule and filter effects. Remote toggling. - </P -></LI -><LI -><P -> Web page filtering (text replacements, removes banners based on size, - invisible <SPAN -CLASS="QUOTE" ->"web-bugs"</SPAN ->, JavaScript and HTML annoyances, - pop-up windows, etc.) - </P -></LI -><LI -><P -> Modularized configuration that allows for standard settings and - user settings to reside in separate files, so that installing updated - actions files won't overwrite individual user settings. - </P -></LI -><LI -><P -> Support for Perl Compatible Regular Expressions in the configuration files, and - a more sophisticated and flexible configuration syntax. - </P -></LI -><LI -><P -> Improved cookie management features (e.g. session based cookies). - </P -></LI -><LI -><P -> GIF de-animation. - </P -></LI -><LI -><P -> Bypass many click-tracking scripts (avoids script redirection). - </P -></LI -><LI -><P -> Multi-threaded (POSIX and native threads). - </P -></LI -><LI -><P -> User-customizable HTML templates for most proxy-generated pages (e.g. "blocked" page). - </P -></LI -><LI -><P -> Auto-detection and re-reading of config file changes. - </P -></LI -><LI -><P -> Improved signal handling, and a true daemon mode (Unix). - </P -></LI -><LI -><P -> Every feature now controllable on a per-site or per-location basis, configuration - more powerful and versatile over-all. - </P -></LI -><LI -><P -> Many smaller new features added, limitations and bugs removed. - </P -></LI -></UL -></P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="installation.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Privoxy 3.0.12 User Manual</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Installation</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/proxy2.jpg b/external/privoxy/doc/webserver/user-manual/proxy2.jpg deleted file mode 100644 index e6c50dc..0000000 Binary files a/external/privoxy/doc/webserver/user-manual/proxy2.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/user-manual/proxy_setup.jpg b/external/privoxy/doc/webserver/user-manual/proxy_setup.jpg deleted file mode 100644 index 9e80f97..0000000 Binary files a/external/privoxy/doc/webserver/user-manual/proxy_setup.jpg and /dev/null differ diff --git a/external/privoxy/doc/webserver/user-manual/quickstart.html b/external/privoxy/doc/webserver/user-manual/quickstart.html deleted file mode 100644 index 0393689..0000000 --- a/external/privoxy/doc/webserver/user-manual/quickstart.html +++ /dev/null @@ -1,943 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Quickstart to Using Privoxy</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="What's New in this Release" -HREF="whatsnew.html"><LINK -REL="NEXT" -TITLE="Starting Privoxy" -HREF="startup.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="whatsnew.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="startup.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="QUICKSTART" ->4. Quickstart to Using Privoxy</A -></H1 -><P -> <P -></P -><UL -><LI -><P -> Install <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. See the <A -HREF="installation.html" ->Installation Section</A -> below for platform specific - information. - </P -></LI -><LI -><P -> Advanced users and those who want to offer <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - service to more than just their local machine should check the <A -HREF="config.html" ->main config file</A ->, especially the <A -HREF="config.html#ACCESS-CONTROL" ->security-relevant</A -> options. These are - off by default. - </P -></LI -><LI -><P -> Start <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->, if the installation program has - not done this already (may vary according to platform). See the section - <A -HREF="startup.html" ->Starting <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -></A ->. - </P -></LI -><LI -><P -> Set your browser to use <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> as HTTP and - HTTPS (SSL) <A -HREF="http://en.wikipedia.org/wiki/Proxy_server" -TARGET="_top" ->proxy</A -> - by setting the proxy configuration for address of - <TT -CLASS="LITERAL" ->127.0.0.1</TT -> and port <TT -CLASS="LITERAL" ->8118</TT ->. - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->DO NOT</I -></SPAN -> activate proxying for <TT -CLASS="LITERAL" ->FTP</TT -> or - any protocols besides HTTP and HTTPS (SSL) unless you intend to prevent your - browser from using these protocols. - </P -></LI -><LI -><P -> Flush your browser's disk and memory caches, to remove any cached ad images. - If using <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to manage - <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookies</A ->, - you should remove any currently stored cookies too. - </P -></LI -><LI -><P -> A default installation should provide a reasonable starting point for - most. There will undoubtedly be occasions where you will want to adjust the - configuration, but that can be dealt with as the need arises. Little - to no initial configuration is required in most cases, you may want - to enable the - <A -HREF="config.html#ENABLE-EDIT-ACTIONS" -TARGET="_top" ->web-based action editor</A -> though. - Be sure to read the warnings first. - </P -><P -> See the <A -HREF="configuration.html" ->Configuration section</A -> for more - configuration options, and how to customize your installation. - You might also want to look at the <A -HREF="quickstart.html#QUICKSTART-AD-BLOCKING" ->next section</A -> for a quick - introduction to how <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> blocks ads and - banners.</P -></LI -><LI -><P -> If you experience ads that slip through, innocent images that are - blocked, or otherwise feel the need to fine-tune - <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> behavior, take a look at the <A -HREF="actions-file.html" ->actions files</A ->. As a quick start, you might - find the <A -HREF="actions-file.html#ACT-EXAMPLES" ->richly commented examples</A -> - helpful. You can also view and edit the actions files through the <A -HREF="http://config.privoxy.org" -TARGET="_top" ->web-based user interface</A ->. The - Appendix <SPAN -CLASS="QUOTE" ->"<A -HREF="appendix.html#ACTIONSANAT" ->Troubleshooting: Anatomy of an - Action</A ->"</SPAN -> has hints on how to understand and debug actions that - <SPAN -CLASS="QUOTE" ->"misbehave"</SPAN ->. - </P -></LI -><LI -><P -> Please see the section <A -HREF="contact.html" ->Contacting the - Developers</A -> on how to report bugs, problems with websites or to get - help. - </P -></LI -><LI -><P -> Now enjoy surfing with enhanced control, comfort and privacy! - </P -></LI -></UL -></P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="QUICKSTART-AD-BLOCKING" ->4.1. Quickstart to Ad Blocking</A -></H2 -><P -> Ad blocking is but one of <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - array of features. Many of these features are for the technically minded advanced - user. But, ad and banner blocking is surely common ground for everybody.</P -><P -> - This section will provide a quick summary of ad blocking so - you can get up to speed quickly without having to read the more extensive - information provided below, though this is highly recommended.</P -><P -> First a bit of a warning ... blocking ads is much like blocking SPAM: the - more aggressive you are about it, the more likely you are to block - things that were not intended. And the more likely that some things - may not work as intended. So there is a trade off here. If you want - extreme ad free browsing, be prepared to deal with more - <SPAN -CLASS="QUOTE" ->"problem"</SPAN -> sites, and to spend more time adjusting the - configuration to solve these unintended consequences. In short, there is - not an easy way to eliminate <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->all</I -></SPAN -> ads. Either take - the easy way and settle for <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->most</I -></SPAN -> ads blocked with the - default configuration, or jump in and tweak it for your personal surfing - habits and preferences.</P -><P -> Secondly, a brief explanation of <SPAN -CLASS="APPLICATION" ->Privoxy's </SPAN -> - <SPAN -CLASS="QUOTE" ->"actions"</SPAN ->. <SPAN -CLASS="QUOTE" ->"Actions"</SPAN -> in this context, are - the directives we use to tell <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to perform - some task relating to HTTP transactions (i.e. web browsing). We tell - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to take some <SPAN -CLASS="QUOTE" ->"action"</SPAN ->. Each - action has a unique name and function. While there are many potential - <SPAN -CLASS="APPLICATION" ->actions</SPAN -> in <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - arsenal, only a few are used for ad blocking. <A -HREF="actions-file.html#ACTIONS" ->Actions</A ->, and <A -HREF="actions-file.html" ->action - configuration files</A ->, are explained in depth below.</P -><P -> Actions are specified in <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> configuration, - followed by one or more URLs to which the action should apply. URLs - can actually be URL type <A -HREF="actions-file.html#AF-PATTERNS" ->patterns</A -> that use - wildcards so they can apply potentially to a range of similar URLs. The - actions, together with the URL patterns are called a section.</P -><P -> When you connect to a website, the full URL will either match one or more - of the sections as defined in <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> configuration, - or not. If so, then <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will perform the - respective actions. If not, then nothing special happens. Furthermore, web - pages may contain embedded, secondary URLs that your web browser will - use to load additional components of the page, as it parses the - original page's HTML content. An ad image for instance, is just an URL - embedded in the page somewhere. The image itself may be on the same server, - or a server somewhere else on the Internet. Complex web pages will have many - such embedded URLs. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can deal with each URL individually, so, for - instance, the main page text is not touched, but images from such-and-such - server are blocked.</P -><P -> The most important actions for basic ad blocking are: <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT ->, <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT ->, - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-EMPTY-DOCUMENT" ->handle-as-empty-document</A -></TT ->,and - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A -></TT ->:</P -><P -> <P -></P -><UL -><LI -><P -> <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> - this is perhaps - the single most used action, and is particularly important for ad blocking. - This action stops any contact between your browser and any URL patterns - that match this action's configuration. It can be used for blocking ads, - but also anything that is determined to be unwanted. By itself, it simply - stops any communication with the remote server and sends - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s own built-in BLOCKED page instead to - let you now what has happened (with some exceptions, see below). - </P -></LI -><LI -><P -> <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT -> - - tells <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to treat this URL as an image. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->'s default configuration already does this - for all common image types (e.g. GIF), but there are many situations where this - is not so easy to determine. So we'll force it in these cases. This is particularly - important for ad blocking, since only if we know that it's an image of - some kind, can we replace it with an image of our choosing, instead of the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> BLOCKED page (which would only result in - a <SPAN -CLASS="QUOTE" ->"broken image"</SPAN -> icon). There are some limitations to this - though. For instance, you can't just brute-force an image substitution for - an entire HTML page in most situations. - </P -></LI -><LI -><P -> <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-EMPTY-DOCUMENT" ->handle-as-empty-document</A -></TT -> - - sends an empty document instead of <SPAN -CLASS="APPLICATION" ->Privoxy's</SPAN -> - normal BLOCKED HTML page. This is useful for file types that are neither - HTML nor images, such as blocking JavaScript files. - </P -></LI -><LI -><P -> <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#SET-IMAGE-BLOCKER" ->set-image-blocker</A -></TT -> - tells - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> what to display in place of an ad image that - has hit a block rule. For this to come into play, the URL must match a - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> action somewhere in the - configuration, <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->and</I -></SPAN ->, it must also match an - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#HANDLE-AS-IMAGE" ->handle-as-image</A -></TT -> action. - </P -><P -> The configuration options on what to display instead of the ad are: - </P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->pattern</I -></SPAN -> - a checkerboard pattern, so that an ad - replacement is obvious. This is the default. - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->blank</I -></SPAN -> - A very small empty GIF image is displayed. - This is the so-called <SPAN -CLASS="QUOTE" ->"invisible"</SPAN -> configuration option. - </TD -></TR -></TBODY -></TABLE -><P -></P -><P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->http://%3CURL%3E;</I -></SPAN -> - A redirect to any image anywhere - of the user's choosing (advanced usage). - </TD -></TR -></TBODY -></TABLE -><P -></P -></LI -></UL -></P -><P -> Advanced users will eventually want to explore <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#FILTER" ->filters</A -></TT -> as well. Filters - are very different from <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->blocks</A -></TT ->. - A <SPAN -CLASS="QUOTE" ->"block"</SPAN -> blocks a site, page, or unwanted contented. Filters - are a way of filtering or modifying what is actually on the page. An example - filter usage: a text replacement of <SPAN -CLASS="QUOTE" ->"no-no"</SPAN -> for - <SPAN -CLASS="QUOTE" ->"nasty-word"</SPAN ->. That is a very simple example. This process can be - used for ad blocking, but it is more in the realm of advanced usage and has - some pitfalls to be wary off.</P -><P -> The quickest way to adjust any of these settings is with your browser through - the special <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> editor at <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A -> - (shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/show-status</A ->). This - is an internal page, and does not require Internet access.</P -><P -> Note that as of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> 3.0.7 beta the - action editor is disabled by default. Check the - <A -HREF="config.html#ENABLE-EDIT-ACTIONS" -TARGET="_top" ->enable-edit-actions - section in the configuration file</A -> to learn why and in which - cases it's safe to enable again.</P -><P -> If you decided to enable the action editor, select the appropriate - <SPAN -CLASS="QUOTE" ->"actions"</SPAN -> file, and click - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Edit</SPAN ->"</SPAN ->. It is best to put personal or - local preferences in <TT -CLASS="FILENAME" ->user.action</TT -> since this is not - meant to be overwritten during upgrades, and will over-ride the settings in - other files. Here you can insert new <SPAN -CLASS="QUOTE" ->"actions"</SPAN ->, and URLs for ad - blocking or other purposes, and make other adjustments to the configuration. - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will detect these changes automatically.</P -><P -> A quick and simple step by step example:</P -><P -> <P -></P -><UL -><LI -><P -> Right click on the ad image to be blocked, then select - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIMENUITEM" ->Copy Link Location</SPAN ->"</SPAN -> from the - pop-up menu. - </P -></LI -><LI -><P -> Set your browser to - <A -HREF="http://config.privoxy.org/show-status" -TARGET="_top" ->http://config.privoxy.org/show-status</A -> - </P -></LI -><LI -><P -> Find <TT -CLASS="FILENAME" ->user.action</TT -> in the top section, and click - on <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Edit</SPAN ->"</SPAN ->: - </P -><P -> <DIV -CLASS="FIGURE" -><A -NAME="AEN530" -></A -><P -><B ->Figure 1. Actions Files in Use</B -></P -><DIV -CLASS="MEDIAOBJECT" -><P -><IMG -SRC="files-in-use.jpg"></P -></DIV -></DIV -> - </P -></LI -><LI -><P -> You should have a section with only - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> listed under - <SPAN -CLASS="QUOTE" ->"Actions:"</SPAN ->. - If not, click a <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Insert new section below</SPAN ->"</SPAN -> - button, and in the new section that just appeared, click the - <SPAN -CLASS="GUIBUTTON" ->Edit</SPAN -> button right under the word <SPAN -CLASS="QUOTE" ->"Actions:"</SPAN ->. - This will bring up a list of all actions. Find - <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> near the top, and click - in the <SPAN -CLASS="QUOTE" ->"Enabled"</SPAN -> column, then <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Submit</SPAN ->"</SPAN -> - just below the list. - </P -></LI -><LI -><P -> Now, in the <TT -CLASS="LITERAL" -><A -HREF="actions-file.html#BLOCK" ->block</A -></TT -> actions section, - click the <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Add</SPAN ->"</SPAN -> button, and paste the URL the - browser got from <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIMENUITEM" ->Copy Link Location</SPAN ->"</SPAN ->. - Remove the <TT -CLASS="LITERAL" ->http://</TT -> at the beginning of the URL. Then, click - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->Submit</SPAN ->"</SPAN -> (or - <SPAN -CLASS="QUOTE" ->"<SPAN -CLASS="GUIBUTTON" ->OK</SPAN ->"</SPAN -> if in a pop-up window). - </P -></LI -><LI -><P -> Now go back to the original page, and press <B -CLASS="KEYCAP" ->SHIFT-Reload</B -> - (or flush all browser caches). The image should be gone now. - </P -></LI -></UL -></P -><P -> This is a very crude and simple example. There might be good reasons to use a - wildcard pattern match to include potentially similar images from the same - site. For a more extensive explanation of <SPAN -CLASS="QUOTE" ->"patterns"</SPAN ->, and - the entire actions concept, see <A -HREF="actions-file.html" ->the Actions - section</A ->.</P -><P -> For advanced users who want to hand edit their config files, you might want - to now go to the <A -HREF="actions-file.html#ACT-EXAMPLES" ->Actions Files Tutorial</A ->. - The ideas explained therein also apply to the web-based editor.</P -><P -> There are also various - <A -HREF="actions-file.html#FILTER" ->filters</A -> that can be used for ad blocking - (filters are a special subset of actions). These - fall into the <SPAN -CLASS="QUOTE" ->"advanced"</SPAN -> usage category, and are explained in - depth in later sections. </P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="whatsnew.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="startup.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->What's New in this Release</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Starting Privoxy</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/seealso.html b/external/privoxy/doc/webserver/user-manual/seealso.html deleted file mode 100644 index 93a8b2d..0000000 --- a/external/privoxy/doc/webserver/user-manual/seealso.html +++ /dev/null @@ -1,418 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->See Also</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Privoxy Copyright, License and History" -HREF="copyright.html"><LINK -REL="NEXT" -TITLE="Appendix" -HREF="appendix.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="copyright.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="appendix.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="SEEALSO" ->13. See Also</A -></H1 -><P -> Other references and sites of interest to <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - users:</P -><P -> <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/" -TARGET="_top" ->http://www.privoxy.org/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Home page. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/faq/" -TARGET="_top" ->http://www.privoxy.org/faq/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> FAQ. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.privoxy.org/developer-manual/" -TARGET="_top" ->http://www.privoxy.org/developer-manual/</A ->, - the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> developer manual. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://sourceforge.net/projects/ijbswa/" -TARGET="_top" ->https://sourceforge.net/projects/ijbswa/</A ->, - the Project Page for <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> on - <A -HREF="http://sourceforge.net" -TARGET="_top" ->SourceForge</A ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A ->, - the web-based user interface. <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> must be - running for this to work. Shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A -> - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://sourceforge.net/tracker/?group_id=11118&atid=460288" -TARGET="_top" ->https://sourceforge.net/tracker/?group_id=11118&atid=460288</A ->, to submit <SPAN -CLASS="QUOTE" ->"misses"</SPAN -> and other - configuration related suggestions to the developers. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - - - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.junkbusters.com/ht/en/cookies.html" -TARGET="_top" ->http://www.junkbusters.com/ht/en/cookies.html</A ->, - an explanation how cookies are used to track web users. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.junkbusters.com/ijb.html" -TARGET="_top" ->http://www.junkbusters.com/ijb.html</A ->, - the original Internet Junkbuster. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.squid-cache.org/" -TARGET="_top" ->http://www.squid-cache.org/</A ->, a popular - caching proxy, which is often used together with <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="http://www.pps.jussieu.fr/~jch/software/polipo/" -TARGET="_top" ->http://www.pps.jussieu.fr/~jch/software/polipo/</A ->, - <SPAN -CLASS="APPLICATION" ->Polipo</SPAN -> is a caching proxy with advanced features - like pipelining, multiplexing and caching of partial instances. In many setups - it can be used as <SPAN -CLASS="APPLICATION" ->Squid</SPAN -> replacement. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD -> <A -HREF="https://www.torproject.org/" -TARGET="_top" ->https://www.torproject.org/</A ->, - <SPAN -CLASS="APPLICATION" ->Tor</SPAN -> can help anonymize web browsing, - web publishing, instant messaging, IRC, SSH, and other applications. - </TD -></TR -></TBODY -></TABLE -><P -></P -> - </P -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="copyright.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="appendix.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Privoxy Copyright, License and History</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Appendix</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/startup.html b/external/privoxy/doc/webserver/user-manual/startup.html deleted file mode 100644 index e4f0c23..0000000 --- a/external/privoxy/doc/webserver/user-manual/startup.html +++ /dev/null @@ -1,902 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Starting Privoxy</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Quickstart to Using Privoxy" -HREF="quickstart.html"><LINK -REL="NEXT" -TITLE="Privoxy Configuration" -HREF="configuration.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="quickstart.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="configuration.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="STARTUP" ->5. Starting Privoxy</A -></H1 -><P -> Before launching <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> for the first time, you - will want to configure your browser(s) to use - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> as a HTTP and HTTPS (SSL) - <A -HREF="http://en.wikipedia.org/wiki/Proxy_server" -TARGET="_top" ->proxy</A ->. The default is - 127.0.0.1 (or localhost) for the proxy address, and port 8118 (earlier versions - used port 8000). This is the one configuration step <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->that must be done</I -></SPAN ->!</P -><P -> Please note that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can only proxy HTTP and - HTTPS traffic. It will not work with FTP or other protocols.</P -><P -> <DIV -CLASS="FIGURE" -><A -NAME="AEN585" -></A -><P -><B ->Figure 2. Proxy Configuration Showing - Mozilla/Netscape HTTP and HTTPS (SSL) Settings</B -></P -><DIV -CLASS="MEDIAOBJECT" -><P -><IMG -SRC="proxy_setup.jpg"></P -></DIV -></DIV -> - </P -><P -> - With <SPAN -CLASS="APPLICATION" ->Firefox</SPAN ->, this is typically set under:</P -><P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="GUIBUTTON" ->Tools</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Options</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Advanced</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Network</SPAN -> -><SPAN -CLASS="GUIBUTTON" ->Connection</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Settings</SPAN -><br> </P -><P -> - Or optionally on some platforms:</P -><P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="GUIBUTTON" ->Edit</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Preferences</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->General</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Connection Settings</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Manual Proxy Configuration</SPAN -><br> </P -><P -> - With <SPAN -CLASS="APPLICATION" ->Netscape</SPAN -> (and - <SPAN -CLASS="APPLICATION" ->Mozilla</SPAN ->), this can be set under:</P -><P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="GUIBUTTON" ->Edit</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Preferences</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Advanced</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Proxies</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->HTTP Proxy</SPAN -><br> </P -><P -> For <SPAN -CLASS="APPLICATION" ->Internet Explorer v.5-7</SPAN ->: </P -><P -CLASS="LITERALLAYOUT" -> <SPAN -CLASS="GUIBUTTON" ->Tools</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Internet Options</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->Connections</SPAN -> -> <SPAN -CLASS="GUIBUTTON" ->LAN Settings</SPAN -></P -><P -> Then, check <SPAN -CLASS="QUOTE" ->"Use Proxy"</SPAN -> and fill in the appropriate info - (Address: 127.0.0.1, Port: 8118). Include HTTPS (SSL), if you want HTTPS - proxy support too (sometimes labeled <SPAN -CLASS="QUOTE" ->"Secure"</SPAN ->). Make sure any - checkboxes like <SPAN -CLASS="QUOTE" ->"Use the same proxy server for all protocols"</SPAN -> is - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->UNCHECKED</I -></SPAN ->. You want only HTTP and HTTPS (SSL)!</P -><P -> <DIV -CLASS="FIGURE" -><A -NAME="AEN630" -></A -><P -><B ->Figure 3. Proxy Configuration Showing - Internet Explorer HTTP and HTTPS (Secure) Settings</B -></P -><DIV -CLASS="MEDIAOBJECT" -><P -><IMG -SRC="proxy2.jpg"></P -></DIV -></DIV -> - </P -><P -> After doing this, flush your browser's disk and memory caches to force a - re-reading of all pages and to get rid of any ads that may be cached. Remove - any <A -HREF="http://en.wikipedia.org/wiki/Browser_cookie" -TARGET="_top" ->cookies</A ->, - if you want <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to manage that. You are now - ready to start enjoying the benefits of using - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->!</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> itself is typically started by specifying the - main configuration file to be used on the command line. If no configuration - file is specified on the command line, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - will look for a file named <TT -CLASS="FILENAME" ->config</TT -> in the current - directory. Except on Win32 where it will try <TT -CLASS="FILENAME" ->config.txt</TT ->.</P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-REDHAT" ->5.1. Red Hat and Fedora</A -></H2 -><P -> A default Red Hat installation may not start <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> upon boot. It will use - the file <TT -CLASS="FILENAME" ->/etc/privoxy/config</TT -> as its main configuration - file.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # /etc/rc.d/init.d/privoxy start</PRE -></TD -></TR -></TABLE -></P -><P -> Or ...</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # service privoxy start</PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-DEBIAN" ->5.2. Debian</A -></H2 -><P -> We use a script. Note that Debian typically starts <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> upon booting per - default. It will use the file - <TT -CLASS="FILENAME" ->/etc/privoxy/config</TT -> as its main configuration - file.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # /etc/init.d/privoxy start</PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-WINDOWS" ->5.3. Windows</A -></H2 -><P ->Click on the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> Icon to start <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. If no configuration file is - specified on the command line, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will look - for a file named <TT -CLASS="FILENAME" ->config.txt</TT ->. Note that Windows will - automatically start <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> when the system starts if you chose that option - when installing.</P -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> can run with full Windows service functionality. - On Windows only, the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> program has two new command line arguments - to install and uninstall <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> as a service. See the - <A -HREF="installation.html#INSTALLATION-PACK-WIN" ->Windows Installation - instructions</A -> for details.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-UNICES" ->5.4. Solaris, NetBSD, FreeBSD, HP-UX and others</A -></H2 -><P ->Example Unix startup command:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> # /usr/sbin/privoxy /etc/privoxy/config</PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-OS2" ->5.5. OS/2</A -></H2 -><P -> During installation, <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is configured to - start automatically when the system restarts. You can start it manually by - double-clicking on the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> icon in the - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> folder.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-MACOSX" ->5.6. Mac OS X</A -></H2 -><P -> After downloading the privoxy software, unzip the downloaded file by - double-clicking on the zip file icon. Then, double-click on the - installer package icon and follow the installation process.</P -><P -> The privoxy service will automatically start after a successful - installation. In addition, the privoxy service will automatically - start every time your computer starts up.</P -><P -> To prevent the privoxy service from automatically starting when your - computer starts up, remove or rename the folder named - /Library/StartupItems/Privoxy.</P -><P -> A simple application named Privoxy Utility has been created which - enables administrators to easily start and stop the privoxy service.</P -><P -> In addition, the Privoxy Utility presents a simple way for - administrators to edit the various privoxy config files. A method - to uninstall the software is also available.</P -><P -> An administrator username and password must be supplied in order for - the Privoxy Utility to perform any of the tasks.</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-AMIGAOS" ->5.7. AmigaOS</A -></H2 -><P -> Start <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> (with RUN <>NIL:) in your - <TT -CLASS="FILENAME" ->startnet</TT -> script (AmiTCP), in - <TT -CLASS="FILENAME" ->s:user-startup</TT -> (RoadShow), as startup program in your - startup script (Genesis), or as startup action (Miami and MiamiDx). - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will automatically quit when you quit your - TCP/IP stack (just ignore the harmless warning your TCP/IP stack may display that - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is still running).</P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="START-GENTOO" ->5.8. Gentoo</A -></H2 -><P -> A script is again used. It will use the file <TT -CLASS="FILENAME" ->/etc/privoxy/config - </TT -> as its main configuration file.</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> /etc/init.d/privoxy start - </PRE -></TD -></TR -></TABLE -></P -><P -> Note that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is not automatically started at - boot time by default. You can change this with the <TT -CLASS="LITERAL" ->rc-update</TT -> - command.</P -><P -> - <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -> rc-update add privoxy default - </PRE -></TD -></TR -></TABLE -></P -></DIV -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="CMDOPTIONS" ->5.9. Command Line Options</A -></H2 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> may be invoked with the following - command-line options:</P -><P -> <P -></P -><UL -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--version</I -></SPAN -> - </P -><P -> Print version info and exit. Unix only. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--help</I -></SPAN -> - </P -><P -> Print short usage info and exit. Unix only. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--no-daemon</I -></SPAN -> - </P -><P -> Don't become a daemon, i.e. don't fork and become process group - leader, and don't detach from controlling tty. Unix only. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--pidfile FILE</I -></SPAN -> - </P -><P -> On startup, write the process ID to <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->FILE</I -></SPAN ->. Delete the - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->FILE</I -></SPAN -> on exit. Failure to create or delete the - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->FILE</I -></SPAN -> is non-fatal. If no <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->FILE</I -></SPAN -> - option is given, no PID file will be used. Unix only. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--user USER[.GROUP]</I -></SPAN -> - </P -><P -> After (optionally) writing the PID file, assume the user ID of - <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->USER</I -></SPAN ->, and if included the GID of GROUP. Exit if the - privileges are not sufficient to do so. Unix only. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--chroot</I -></SPAN -> - </P -><P -> Before changing to the user ID given in the <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--user</I -></SPAN -> option, - chroot to that user's home directory, i.e. make the kernel pretend to the <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - process that the directory tree starts there. If set up carefully, this can limit - the impact of possible vulnerabilities in <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to the files contained in that hierarchy. - Unix only. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->--pre-chroot-nslookup hostname</I -></SPAN -> - </P -><P -> Specifies a hostname to look up before doing a chroot. On some systems, initializing the - resolver library involves reading config files from /etc and/or loading additional shared - libraries from /lib. On these systems, doing a hostname lookup before the chroot reduces - the number of files that must be copied into the chroot tree. - </P -><P -> For fastest startup speed, a good value is a hostname that is not in /etc/hosts but that - your local name server (listed in /etc/resolv.conf) can resolve without recursion - (that is, without having to ask any other name servers). The hostname need not exist, - but if it doesn't, an error message (which can be ignored) will be output. - </P -></LI -><LI -><P -> <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->configfile</I -></SPAN -> - </P -><P -> If no <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->configfile</I -></SPAN -> is included on the command line, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will look for a file named - <SPAN -CLASS="QUOTE" ->"config"</SPAN -> in the current directory (except on Win32 - where it will look for <SPAN -CLASS="QUOTE" ->"config.txt"</SPAN -> instead). Specify - full path to avoid confusion. If no config file is found, - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> will fail to start. - </P -></LI -></UL -></P -><P -> On <SPAN -CLASS="APPLICATION" ->MS Windows</SPAN -> only there are two additional - command-line options to allow <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> to install and - run as a <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->service</I -></SPAN ->. See the -<A -HREF="installation.html#INSTALLATION-PACK-WIN" ->Window Installation section</A -> -for details.</P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="quickstart.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="configuration.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Quickstart to Using Privoxy</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Privoxy Configuration</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/templates.html b/external/privoxy/doc/webserver/user-manual/templates.html deleted file mode 100644 index 7e31c75..0000000 --- a/external/privoxy/doc/webserver/user-manual/templates.html +++ /dev/null @@ -1,321 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->Privoxy's Template Files</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Filter Files" -HREF="filter-file.html"><LINK -REL="NEXT" -TITLE="Contacting the Developers, Bug Reporting and Feature -Requests" -HREF="contact.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="filter-file.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="contact.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="TEMPLATES" ->10. Privoxy's Template Files</A -></H1 -><P -> All <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> built-in pages, i.e. error pages such as the - <A -HREF="http://show-the-404-error.page" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"404 - No Such Domain"</SPAN -> - error page</A ->, the <A -HREF="http://ads.bannerserver.example.com/nasty-ads/sponsor.html" -TARGET="_top" -><SPAN -CLASS="QUOTE" ->"BLOCKED"</SPAN -> - page</A -> - and all pages of its <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->web-based - user interface</A ->, are generated from <SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->templates</I -></SPAN ->. - (<SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> must be running for the above links to work as - intended.)</P -><P -> These templates are stored in a subdirectory of the <A -HREF="config.html#CONFDIR" ->configuration - directory</A -> called <TT -CLASS="FILENAME" ->templates</TT ->. On Unixish platforms, - this is typically - <A -HREF="file:///etc/privoxy/templates/" -TARGET="_top" -><TT -CLASS="FILENAME" ->/etc/privoxy/templates/</TT -></A ->.</P -><P -> The templates are basically normal HTML files, but with place-holders (called symbols - or exports), which <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> fills at run time. It - is possible to edit the templates with a normal text editor, should you want - to customize them. (<SPAN -CLASS="emphasis" -><I -CLASS="EMPHASIS" ->Not recommended for the casual - user</I -></SPAN ->). Should you create your own custom templates, you should use - the <TT -CLASS="FILENAME" ->config</TT -> setting <A -HREF="config.html#TEMPLDIR" ->templdir</A -> - to specify an alternate location, so your templates do not get overwritten - during upgrades. - </P -><P -> Note that just like in configuration files, lines starting - with <TT -CLASS="LITERAL" ->#</TT -> are ignored when the templates are filled in.</P -><P -> The place-holders are of the form <TT -CLASS="LITERAL" ->@name@</TT ->, and you will - find a list of available symbols, which vary from template to template, - in the comments at the start of each file. Note that these comments are not - always accurate, and that it's probably best to look at the existing HTML - code to find out which symbols are supported and what they are filled in with.</P -><P -> A special application of this substitution mechanism is to make whole - blocks of HTML code disappear when a specific symbol is set. We use this - for many purposes, one of them being to include the beta warning in all - our user interface (CGI) pages when <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is in an alpha or beta development stage:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -><!-- @if-unstable-start --> - - ... beta warning HTML code goes here ... - -<!-- if-unstable-end@ --></PRE -></TD -></TR -></TABLE -></P -><P -> If the "unstable" symbol is set, everything in between and including - <TT -CLASS="LITERAL" ->@if-unstable-start</TT -> and <TT -CLASS="LITERAL" ->if-unstable-end@</TT -> - will disappear, leaving nothing but an empty comment:</P -><P -> <TABLE -BORDER="0" -BGCOLOR="#E0E0E0" -WIDTH="100%" -><TR -><TD -><PRE -CLASS="SCREEN" -><!-- --></PRE -></TD -></TR -></TABLE -></P -><P -> There's also an if-then-else construct and an <TT -CLASS="LITERAL" ->#include</TT -> - mechanism, but you'll sure find out if you are inclined to edit the - templates ;-)</P -><P -> All templates refer to a style located at - <A -HREF="http://config.privoxy.org/send-stylesheet" -TARGET="_top" -><TT -CLASS="LITERAL" ->http://config.privoxy.org/send-stylesheet</TT -></A ->. - This is, of course, locally served by <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - and the source for it can be found and edited in the - <TT -CLASS="FILENAME" ->cgi-style.css</TT -> template.</P -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="filter-file.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="contact.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Filter Files</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Contacting the Developers, Bug Reporting and Feature -Requests</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/upgradersnote.html b/external/privoxy/doc/webserver/user-manual/upgradersnote.html deleted file mode 100644 index 36be7bc..0000000 --- a/external/privoxy/doc/webserver/user-manual/upgradersnote.html +++ /dev/null @@ -1,296 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<HTML -><HEAD -><TITLE ->Note to Upgraders</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK -REL="HOME" -TITLE="Privoxy 3.0.3 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Installation" -HREF="installation.html"><LINK -REL="NEXT" -TITLE="Quickstart to Using Privoxy" -HREF="quickstart.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"></HEAD -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.3 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="installation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="quickstart.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="UPGRADERSNOTE" ->3. Note to Upgraders</A -></H1 -><P -> There are very significant changes from earlier - <SPAN -CLASS="APPLICATION" ->Junkbuster</SPAN -> versions to the current - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. The number, names, syntax, and - purposes of configuration files have substantially changed. - <SPAN -CLASS="APPLICATION" ->Junkbuster 2.0.x</SPAN -> configuration - files will not migrate, <SPAN -CLASS="APPLICATION" ->Junkbuster 2.9.x</SPAN -> - and <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> configurations will need to be - ported. The functionalities of the old <TT -CLASS="FILENAME" ->blockfile</TT ->, - <TT -CLASS="FILENAME" ->cookiefile</TT -> and <TT -CLASS="FILENAME" ->imagelist</TT -> - are now combined into the <A -HREF="actions-file.html" -><SPAN -CLASS="QUOTE" ->"actions - files"</SPAN -></A ->. - <TT -CLASS="FILENAME" ->default.action</TT ->, is the main actions file. Local - exceptions should best be put into <TT -CLASS="FILENAME" ->user.action</TT ->.</P -><P -> A <A -HREF="filter-file.html" -><SPAN -CLASS="QUOTE" ->"filter file"</SPAN -></A -> (typically - <TT -CLASS="FILENAME" ->default.filter</TT ->) is new as of <SPAN -CLASS="APPLICATION" ->Privoxy - 2.9.x</SPAN ->, and provides some of the new sophistication (explained - below). <TT -CLASS="FILENAME" ->config</TT -> is much the same as before.</P -><P -> If upgrading from a 2.0.x version, you will have to use the new config - files, and possibly adapt any personal rules from your older files. - When porting personal rules over from the old <TT -CLASS="FILENAME" ->blockfile</TT -> - to the new actions files, please note that even the pattern syntax has - changed. If upgrading from 2.9.x development versions, it is still - recommended to use the new configuration files.</P -><P -> A quick list of things to be aware of before upgrading: </P -><P -> <P -></P -><UL -><LI -><P -> The default listening port is now 8118 due to a conflict with another - service (NAS). - </P -></LI -><LI -><P -> - Some installers may remove earlier versions completely. Save any - important configuration files! - </P -></LI -><LI -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is controllable with a web browser - at the special URL: <A -HREF="http://config.privoxy.org/" -TARGET="_top" ->http://config.privoxy.org/</A -> - (Shortcut: <A -HREF="http://p.p/" -TARGET="_top" ->http://p.p/</A ->). Many - aspects of configuration can be done here, including temporarily disabling - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->. - </P -></LI -><LI -><P -> The primary configuration files for cookie management, ad and banner - blocking, and many other aspects of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - configuration are the <A -HREF="actions-file.html" ->actions - files</A ->. It is strongly recommended to become familiar with the new - actions concept below, before modifying these files. Locally defined rules - should go into <TT -CLASS="FILENAME" ->user.action</TT ->. - </P -></LI -><LI -><P -> - Some installers may not automatically start - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> after installation. - </P -></LI -></UL -></P -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="installation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="quickstart.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Installation</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Quickstart to Using <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -></TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/doc/webserver/user-manual/whatsnew.html b/external/privoxy/doc/webserver/user-manual/whatsnew.html deleted file mode 100644 index 5d7c0b2..0000000 --- a/external/privoxy/doc/webserver/user-manual/whatsnew.html +++ /dev/null @@ -1,351 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> -<HTML -><HEAD -><TITLE ->What's New in this Release</TITLE -><META -NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK -REL="HOME" -TITLE="Privoxy 3.0.12 User Manual" -HREF="index.html"><LINK -REL="PREVIOUS" -TITLE="Installation" -HREF="installation.html"><LINK -REL="NEXT" -TITLE="Quickstart to Using Privoxy" -HREF="quickstart.html"><LINK -REL="STYLESHEET" -TYPE="text/css" -HREF="../p_doc.css"><META -HTTP-EQUIV="Content-Type" -CONTENT="text/html; -charset=ISO-8859-1"> -<LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css"> -</head -><BODY -CLASS="SECT1" -BGCOLOR="#EEEEEE" -TEXT="#000000" -LINK="#0000FF" -VLINK="#840084" -ALINK="#0000FF" -><DIV -CLASS="NAVHEADER" -><TABLE -SUMMARY="Header navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TH -COLSPAN="3" -ALIGN="center" ->Privoxy 3.0.12 User Manual</TH -></TR -><TR -><TD -WIDTH="10%" -ALIGN="left" -VALIGN="bottom" -><A -HREF="installation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="80%" -ALIGN="center" -VALIGN="bottom" -></TD -><TD -WIDTH="10%" -ALIGN="right" -VALIGN="bottom" -><A -HREF="quickstart.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -></TABLE -><HR -ALIGN="LEFT" -WIDTH="100%"></DIV -><DIV -CLASS="SECT1" -><H1 -CLASS="SECT1" -><A -NAME="WHATSNEW" ->3. What's New in this Release</A -></H1 -><P -> <SPAN -CLASS="APPLICATION" ->Privoxy 3.0.12</SPAN -> is mainly a bugfix release:</P -><P -> <P -></P -><UL -><LI -><P -> The socket-timeout option now also works on platforms whose - select() implementation modifies the timeout structure. - Previously the timeout was triggered even if the connection - didn't stall. Reported by cyberpatrol. - </P -></LI -><LI -><P -> The Connection: keep-alive code properly deals with files - larger than 2GB. Previously the connection was closed too - early. - </P -></LI -><LI -><P -> The content length for files above 2GB is logged correctly. - </P -></LI -><LI -><P -> The user-manual directive on the show-status page links to - the documentation location specified with the directive, - not to the Privoxy website. - </P -></LI -><LI -><P -> When running in daemon mode, Privoxy doesn't log anything - to the console unless there are errors before the logfile - has been opened. - </P -></LI -><LI -><P -> The show-status page prints warnings about invalid directives - on the same line as the directives themselves. - </P -></LI -><LI -><P -> Fixed several justified (but harmless) compiler warnings, - mostly on 64 bit platforms. - </P -></LI -><LI -><P -> The mingw32 version explicitly requests the default charset - to prevent display problems with some fonts available on more - recent Windows versions. Patch by Burberry. - </P -></LI -><LI -><P -> The mingw32 version uses the Privoxy icon in the alt-tab - windows. Patch by Burberry. - </P -></LI -><LI -><P -> The timestamp and the thread id is omitted in the "Fatal error" - message box on mingw32. - </P -></LI -><LI -><P -> Fixed two related mingw32-only buffer overflows. Triggering - them required control over the configuration file, therefore - this isn't seen as a security issue. - </P -></LI -><LI -><P -> In verbose mode, or if the new option --show-skipped-tests - is used, Privoxy-Regression-Test logs skipped tests and the - skip reason. - </P -></LI -></UL -></P -><DIV -CLASS="SECT2" -><H2 -CLASS="SECT2" -><A -NAME="UPGRADERSNOTE" ->3.1. Note to Upgraders</A -></H2 -><P -> A quick list of things to be aware of before upgrading from earlier - versions of <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN ->:</P -><P -> <P -></P -><UL -><LI -><P -> The recommended way to upgrade <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> is to backup your old - configuration files, install the new ones, verify that <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> - is working correctly and finally merge back your changes using - <SPAN -CLASS="APPLICATION" ->diff</SPAN -> and maybe <SPAN -CLASS="APPLICATION" ->patch</SPAN ->. - </P -><P -> There are a number of new features in each <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> release and - most of them have to be explicitly enabled in the configuration - files. Old configuration files obviously don't do that and due - to syntax changes using old configuration files with a new - <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> isn't always possible anyway. - </P -></LI -><LI -><P -> - Note that some installers remove earlier versions completely, - including configuration files, therefore you should really save - any important configuration files! - </P -></LI -><LI -><P -> - On the other hand, other installers don't overwrite existing configuration - files, thinking you will want to do that yourself. - </P -></LI -><LI -><P -> - <TT -CLASS="FILENAME" ->standard.action</TT -> has been merged into - the <TT -CLASS="FILENAME" ->default.action</TT -> file. - </P -></LI -><LI -><P -> In the default configuration only fatal errors are logged now. - You can change that in the <A -HREF="config.html#DEBUG" ->debug section</A -> - of the configuration file. You may also want to enable more verbose - logging until you verified that the new <SPAN -CLASS="APPLICATION" ->Privoxy</SPAN -> version is working - as expected. - </P -></LI -><LI -><P -> Three other config file settings are now off by default: - <A -HREF="config.html#ENABLE-REMOTE-TOGGLE" ->enable-remote-toggle</A ->, - <A -HREF="config.html#ENABLE-REMOTE-HTTP-TOGGLE" ->enable-remote-http-toggle</A ->, - and <A -HREF="config.html#ENABLE-EDIT-ACTIONS" ->enable-edit-actions</A ->. - If you use or want these, you will need to explicitly enable them, and - be aware of the security issues involved. - </P -></LI -></UL -></P -></DIV -></DIV -><DIV -CLASS="NAVFOOTER" -><HR -ALIGN="LEFT" -WIDTH="100%"><TABLE -SUMMARY="Footer navigation table" -WIDTH="100%" -BORDER="0" -CELLPADDING="0" -CELLSPACING="0" -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" -><A -HREF="installation.html" -ACCESSKEY="P" ->Prev</A -></TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -><A -HREF="index.html" -ACCESSKEY="H" ->Home</A -></TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" -><A -HREF="quickstart.html" -ACCESSKEY="N" ->Next</A -></TD -></TR -><TR -><TD -WIDTH="33%" -ALIGN="left" -VALIGN="top" ->Installation</TD -><TD -WIDTH="34%" -ALIGN="center" -VALIGN="top" -> </TD -><TD -WIDTH="33%" -ALIGN="right" -VALIGN="top" ->Quickstart to Using Privoxy</TD -></TR -></TABLE -></DIV -></BODY -></HTML -> \ No newline at end of file diff --git a/external/privoxy/encode.c b/external/privoxy/encode.c deleted file mode 100644 index d4bb1ce..0000000 --- a/external/privoxy/encode.c +++ /dev/null @@ -1,430 +0,0 @@ -const char encode_rcs[] = "$Id: encode.c,v 1.14 2008/05/21 15:38:13 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/encode.c,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/ - * - * 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: encode.c,v $ - * Revision 1.14 2008/05/21 15:38:13 fabiankeil - * Garbage-collect cookie_encode(). - * - * Revision 1.13 2007/08/18 14:34:27 fabiankeil - * Make xtoi() extern so it can be used in pcrs.c. - * - * Revision 1.12 2007/08/04 10:15:51 fabiankeil - * Use strlcpy() instead of strcpy(). - * - * Revision 1.11 2006/12/28 18:25:53 fabiankeil - * Fixed gcc43 compiler warning. - * - * Revision 1.10 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.8 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.5 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.4 2002/01/22 23:28:07 jongfoster - * Adding convenience function html_encode_and_free_original() - * Making all functions accept NULL paramaters - in this case, they - * simply return NULL. This allows error-checking to be deferred. - * - * Revision 1.3 2001/11/13 00:16:40 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.2 2001/05/17 22:52:35 oes - * - Cleaned CRLF's from the sources and related files - * - * Revision 1.1.1.1 2001/05/15 13:58:51 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include "miscutil.h" -#include "encode.h" - -const char encode_h_rcs[] = ENCODE_H_VERSION; - -/* Maps special characters in a URL to their equivalent % codes. */ -static const char * const url_code_map[256] = { - NULL, "%01", "%02", "%03", "%04", "%05", "%06", "%07", "%08", "%09", - "%0A", "%0B", "%0C", "%0D", "%0E", "%0F", "%10", "%11", "%12", "%13", - "%14", "%15", "%16", "%17", "%18", "%19", "%1A", "%1B", "%1C", "%1D", - "%1E", "%1F", "+", "%21", "%22", "%23", "%24", "%25", "%26", "%27", - "%28", "%29", NULL, "%2B", "%2C", NULL, NULL, "%2F", NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "%3A", "%3B", - "%3C", "%3D", "%3E", "%3F", NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, "%5B", "%5C", "%5D", "%5E", NULL, "%60", NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, "%7B", "%7C", "%7D", "%7E", "%7F", "%80", "%81", - "%82", "%83", "%84", "%85", "%86", "%87", "%88", "%89", "%8A", "%8B", - "%8C", "%8D", "%8E", "%8F", "%90", "%91", "%92", "%93", "%94", "%95", - "%96", "%97", "%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F", - "%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7", "%A8", "%A9", - "%AA", "%AB", "%AC", "%AD", "%AE", "%AF", "%B0", "%B1", "%B2", "%B3", - "%B4", "%B5", "%B6", "%B7", "%B8", "%B9", "%BA", "%BB", "%BC", "%BD", - "%BE", "%BF", "%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7", - "%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF", "%D0", "%D1", - "%D2", "%D3", "%D4", "%D5", "%D6", "%D7", "%D8", "%D9", "%DA", "%DB", - "%DC", "%DD", "%DE", "%DF", "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", - "%E6", "%E7", "%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF", - "%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7", "%F8", "%F9", - "%FA", "%FB", "%FC", "%FD", "%FE", "%FF" -}; - -/* Maps special characters in HTML to their equivalent entites. */ -static const char * const html_code_map[256] = { - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL,""",NULL,NULL,NULL,"&",NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - "<",NULL,">",NULL,NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL -}; - - -/********************************************************************* - * - * Function : html_encode - * - * Description : Encodes a string so it's not interpreted as - * containing HTML tags or entities. - * Replaces <, >, &, and " with the appropriate HTML - * entities. - * - * 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(const char *s) -{ - char * buf; - size_t buf_size; - - if (s == NULL) - { - return NULL; - } - - /* each input char can expand to at most 6 chars */ - buf_size = (strlen(s) * 6) + 1; - buf = (char *) malloc(buf_size); - - if (buf) - { - char c; - char * p = buf; - while ( (c = *s++) != '\0') - { - const char * replace_with = html_code_map[(unsigned char) c]; - if(replace_with != NULL) - { - const size_t bytes_written = (size_t)(p - buf); - assert(bytes_written < buf_size); - p += strlcpy(p, replace_with, buf_size - bytes_written); - } - else - { - *p++ = c; - } - } - - *p = '\0'; - } - - assert(strlen(buf) < buf_size); - 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 : url_encode - * - * Description : Encodes a string so it can be used in a URL - * query string. Replaces special characters with - * the appropriate %xx codes. - * - * 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 * url_encode(const char *s) -{ - char * buf; - size_t buf_size; - - if (s == NULL) - { - return NULL; - } - - /* each input char can expand to at most 3 chars */ - buf_size = (strlen(s) * 3) + 1; - buf = (char *) malloc(buf_size); - - if (buf) - { - char c; - char * p = buf; - while( (c = *s++) != '\0') - { - const char * replace_with = url_code_map[(unsigned char) c]; - if (replace_with != NULL) - { - const size_t bytes_written = (size_t)(p - buf); - assert(bytes_written < buf_size); - p += strlcpy(p, replace_with, buf_size - bytes_written); - } - else - { - *p++ = c; - } - } - - *p = '\0'; - - } - - assert(strlen(buf) < buf_size); - return(buf); -} - - -/********************************************************************* - * - * Function : xdtoi - * - * Description : Converts a single hex digit to an integer. - * - * Parameters : - * 1 : d = in the range of ['0'..'9', 'A'..'F', 'a'..'f'] - * - * Returns : The integer value, or -1 for non-hex characters. - * - *********************************************************************/ -static int xdtoi(const int d) -{ - if ((d >= '0') && (d <= '9')) - { - return(d - '0'); - } - else if ((d >= 'a') && (d <= 'f')) - { - return(d - 'a' + 10); - } - else if ((d >= 'A') && (d <= 'F')) - { - return(d - 'A' + 10); - } - else - { - return(-1); - } -} - - -/********************************************************************* - * - * Function : xtoi - * - * Description : Hex string to integer conversion. - * - * Parameters : - * 1 : s = a 2 digit hex string (e.g. "1f"). Only the - * first two characters will be looked at. - * - * Returns : The integer value, or 0 for non-hex strings. - * - *********************************************************************/ -int xtoi(const char *s) -{ - int d1, d2; - - d1 = xdtoi(*s); - if(d1 >= 0) - { - d2 = xdtoi(*(s+1)); - if(d2 >= 0) - { - return (d1 << 4) + d2; - } - } - - return 0; -} - - -/********************************************************************* - * - * Function : url_decode - * - * Description : Decodes a URL query string, replacing %xx codes - * with their decoded form. - * - * Parameters : - * 1 : s = String to decode. Null-terminated. - * - * Returns : Decoded string, newly allocated on the heap. - * Caller is responsible for freeing it with free(). - * - *********************************************************************/ -char *url_decode(const char * s) -{ - char *buf = malloc(strlen(s) + 1); - char *q = buf; - - if (buf) - { - while (*s) - { - switch (*s) - { - case '+': - s++; - *q++ = ' '; - break; - - case '%': - if ((*q = (char)xtoi(s + 1)) != '\0') - { - s += 3; - q++; - } - else - { - /* malformed, just use it */ - *q++ = *s++; - } - break; - - default: - *q++ = *s++; - break; - } - } - *q = '\0'; - } - - return(buf); - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/encode.h b/external/privoxy/encode.h deleted file mode 100644 index 728746b..0000000 --- a/external/privoxy/encode.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef ENCODE_H_INCLUDED -#define ENCODE_H_INCLUDED -#define ENCODE_H_VERSION "$Id: encode.h,v 1.9 2008/05/21 15:38:13 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/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/ - * - * 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: encode.h,v $ - * Revision 1.9 2008/05/21 15:38:13 fabiankeil - * Garbage-collect cookie_encode(). - * - * Revision 1.8 2007/08/18 14:34:27 fabiankeil - * Make xtoi() extern so it can be used in pcrs.c. - * - * Revision 1.7 2006/07/18 14:48:45 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.5 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern char * html_encode(const char *s); -extern char * url_encode(const char *s); -extern char * url_decode(const char *str); -extern int xtoi(const char *s); -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[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef ENCODE_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/errlog.c b/external/privoxy/errlog.c deleted file mode 100644 index ca12d7f..0000000 --- a/external/privoxy/errlog.c +++ /dev/null @@ -1,1547 +0,0 @@ -const char errlog_rcs[] = "$Id: errlog.c,v 1.92 2009/03/20 03:39:31 ler762 Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/errlog.c,v $ - * - * Purpose : Log errors to a designated destination in an elegant, - * printf-like fashion. - * - * Copyright : Written by and Copyright (C) 2001-2009 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: errlog.c,v $ - * Revision 1.92 2009/03/20 03:39:31 ler762 - * I like having the version logged at startup and the Windows GUI stopped logging - * it after LOG_LEVEL_INFO was removed from - * static int debug = (LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO); - * - * Revision 1.91 2009/03/18 21:56:30 fabiankeil - * In init_error_log(), suppress the "(Re-)Opening logfile" message if - * we're still logging to stderr. This restores the "silent mode", but - * with LOG_LEVEL_INFO enabled, the show_version() info is written to - * the logfile as intended. - * - * Revision 1.90 2009/03/18 20:43:19 fabiankeil - * Don't enable LOG_LEVEL_INFO by default and don't apply the user's - * debug settings until the logfile has been opened (if there is one). - * Patch submitted by Roland in #2624120. - * - * Revision 1.89 2009/03/07 12:56:12 fabiankeil - * Add log_error() support for unsigned long long (%lld). - * - * Revision 1.88 2009/03/07 11:34:36 fabiankeil - * Omit timestamp and thread id in the mingw32 message box. - * - * Revision 1.87 2009/03/01 18:28:24 fabiankeil - * Help clang understand that we aren't dereferencing - * NULL pointers here. - * - * Revision 1.86 2009/02/09 21:21:15 fabiankeil - * Now that init_log_module() is called earlier, call show_version() - * later on from main() directly so it doesn't get called for --help - * or --version. - * - * Revision 1.85 2009/02/06 17:51:38 fabiankeil - * Be prepared if I break the log module initialization again. - * - * Revision 1.84 2008/12/14 15:46:22 fabiankeil - * Give crunched requests their own log level. - * - * Revision 1.83 2008/12/04 18:14:32 fabiankeil - * Fix some cparser warnings. - * - * Revision 1.82 2008/11/23 16:06:58 fabiankeil - * Update a log message I missed in 1.80. - * - * Revision 1.81 2008/11/23 15:59:27 fabiankeil - * - Update copyright range. - * - Remove stray line breaks in a log message - * nobody is supposed to see anyway. - * - * Revision 1.80 2008/11/23 15:49:49 fabiankeil - * In log_error(), don't surround the thread id with "Privoxy(" and ")". - * - * Revision 1.79 2008/10/20 17:09:25 fabiankeil - * Update init_error_log() description to match reality. - * - * Revision 1.78 2008/09/07 16:59:31 fabiankeil - * Update a comment to reflect that we - * have mutex support on mingw32 now. - * - * Revision 1.77 2008/09/07 12:43:44 fabiankeil - * Move the LogPutString() call in log_error() into the locked - * region so the Windows GUI log is consistent with the logfile. - * - * Revision 1.76 2008/09/07 12:35:05 fabiankeil - * Add mutex lock support for _WIN32. - * - * Revision 1.75 2008/09/04 08:13:58 fabiankeil - * Prepare for critical sections on Windows by adding a - * layer of indirection before the pthread mutex functions. - * - * Revision 1.74 2008/08/06 18:33:36 fabiankeil - * If the "close fd first" workaround doesn't work, - * the fatal error message will be lost, so we better - * explain the consequences while we still can. - * - * Revision 1.73 2008/08/04 19:06:55 fabiankeil - * Add a lame workaround for the "can't open an already open - * logfile on OS/2" problem reported by Maynard in #2028842 - * and describe what a real solution would look like. - * - * Revision 1.72 2008/07/27 12:04:28 fabiankeil - * Fix a comment typo. - * - * Revision 1.71 2008/06/28 17:17:15 fabiankeil - * Remove another stray semicolon. - * - * Revision 1.70 2008/06/28 17:10:29 fabiankeil - * Remove stray semicolon in get_log_timestamp(). - * Reported by Jochen Voss in #2005221. - * - * Revision 1.69 2008/05/30 15:55:25 fabiankeil - * Declare variable "debug" static and complain about its name. - * - * Revision 1.68 2008/04/27 16:50:46 fabiankeil - * Remove an incorrect assertion. The value of debug may change if - * the configuration is reloaded in another thread. While we could - * cache the initial value, the assertion doesn't seem worth it. - * - * Revision 1.67 2008/03/27 18:27:23 fabiankeil - * Remove kill-popups action. - * - * Revision 1.66 2008/01/31 15:38:14 fabiankeil - * - Make the logfp assertion more strict. As of 1.63, the "||" could - * have been an "&&", which means we can use two separate assertions - * and skip on of them on Windows. - * - Break a long commit message line in two. - * - * Revision 1.65 2008/01/31 14:44:33 fabiankeil - * Use (a != b) instead of !(a == b) so the sanity check looks less insane. - * - * Revision 1.64 2008/01/21 18:56:46 david__schmidt - * Swap #def from negative to positive, re-joined it so it didn't - * span an assertion (compilation failure on OS/2) - * - * Revision 1.63 2007/12/15 19:49:32 fabiankeil - * Stop overloading logfile to control the mingw32 log window as well. - * It's no longer necessary now that we disable all debug lines by default - * and at least one user perceived it as a regression (added in 1.55). - * - * Revision 1.62 2007/11/30 15:33:46 fabiankeil - * Unbreak LOG_LEVEL_FATAL. It wasn't fatal with logging disabled - * and on mingw32 fatal log messages didn't end up in the log file. - * - * Revision 1.61 2007/11/04 19:03:01 fabiankeil - * Fix another deadlock Hal spotted and that mysteriously didn't affect FreeBSD. - * - * Revision 1.60 2007/11/03 19:03:31 fabiankeil - * - Prevent the Windows GUI from showing the version two times in a row. - * - Stop using the imperative in the "(Re-)Open logfile" message. - * - Ditch the "Switching to daemon mode" message as the detection - * whether or not we're already in daemon mode doesn't actually work. - * - * Revision 1.59 2007/11/01 12:50:56 fabiankeil - * Here's looking at you, deadlock. - * - * Revision 1.58 2007/10/28 19:04:21 fabiankeil - * Don't mention daemon mode in "Logging disabled" message. Some - * platforms call it differently and it's not really relevant anyway. - * - * Revision 1.57 2007/10/27 13:02:26 fabiankeil - * Relocate daemon-mode-related log messages to make sure - * they aren't shown again in case of configuration reloads. - * - * Revision 1.56 2007/10/14 14:26:56 fabiankeil - * Remove the old log_error() version. - * - * Revision 1.55 2007/10/14 14:12:41 fabiankeil - * When in daemon mode, close stderr after the configuration file has been - * parsed the first time. If logfile isn't set, stop logging. Fixes BR#897436. - * - * Revision 1.54 2007/09/22 16:15:34 fabiankeil - * - Let it compile with pcc. - * - Move our includes below system includes to prevent macro conflicts. - * - * Revision 1.53 2007/08/05 13:53:14 fabiankeil - * #1763173 from Stefan Huehner: declare some more functions - * static and use void instead of empty parameter lists. - * - * Revision 1.52 2007/07/14 07:28:47 fabiankeil - * Add translation function for JB_ERR_FOO codes. - * - * Revision 1.51 2007/05/11 11:51:34 fabiankeil - * Fix a type mismatch warning. - * - * Revision 1.50 2007/04/11 10:55:44 fabiankeil - * Enforce some assertions that could be triggered - * on mingw32 and other systems where we use threads - * but no locks. - * - * Revision 1.49 2007/04/08 16:44:15 fabiankeil - * We need <sys/time.h> for gettimeofday(), not <time.h>. - * - * Revision 1.48 2007/03/31 13:33:28 fabiankeil - * Add alternative log_error() with timestamps - * that contain milliseconds and without using - * strcpy(), strcat() or sprintf(). - * - * Revision 1.47 2006/11/28 15:25:15 fabiankeil - * Only unlink the pidfile if it's actually used. - * - * Revision 1.46 2006/11/13 19:05:51 fabiankeil - * Make pthread mutex locking more generic. Instead of - * checking for OSX and OpenBSD, check for FEATURE_PTHREAD - * and use mutex locking unless there is an _r function - * available. Better safe than sorry. - * - * Fixes "./configure --disable-pthread" and should result - * in less threading-related problems on pthread-using platforms, - * but it still doesn't fix BR#1122404. - * - * Revision 1.45 2006/08/21 11:15:54 david__schmidt - * MS Visual C++ build updates - * - * Revision 1.44 2006/08/18 16:03:16 david__schmidt - * Tweak for OS/2 build happiness. - * - * Revision 1.43 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work: - * http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.42 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.40.2.4 2005/04/03 20:10:50 david__schmidt - * Thanks to Jindrich Makovicka for a race condition fix for the log - * file. The race condition remains for non-pthread implementations. - * Reference patch #1175720. - * - * Revision 1.40.2.3 2003/03/07 03:41:04 david__schmidt - * Wrapping all *_r functions (the non-_r versions of them) with mutex - * semaphores for OSX. Hopefully this will take care of all of those pesky - * crash reports. - * - * Revision 1.40.2.2 2002/09/28 00:30:57 david__schmidt - * Update error logging to give sane values for thread IDs on Mach kernels. - * It's still a hack, but at least it looks farily normal. We print the - * absolute value of the first 4 bytes of the pthread_t modded with 1000. - * - * Revision 1.40.2.1 2002/09/25 12:47:42 oes - * Make log_error safe against NULL string arguments - * - * Revision 1.40 2002/05/22 01:27:27 david__schmidt - * - * Add os2_socket_strerr mirroring w32_socket_strerr. - * - * Revision 1.39 2002/04/03 17:15:27 gliptak - * zero padding thread ids in log - * - * Revision 1.38 2002/03/31 17:18:59 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.37 2002/03/27 14:32:43 david__schmidt - * More compiler warning message maintenance - * - * 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. - * - * Revision 1.10 2001/05/29 11:52:21 oes - * Conditional compilation of w32_socket_error - * - * Revision 1.9 2001/05/28 16:15:17 jongfoster - * Improved reporting of errors under Win32. - * - * Revision 1.8 2001/05/26 17:25:14 jongfoster - * Added support for CLF (Common Log Format) and fixed LOG_LEVEL_LOG - * - * Revision 1.7 2001/05/26 15:21:28 jongfoster - * Activity animation in Win32 GUI now works even if debug==0 - * - * Revision 1.6 2001/05/25 21:55:08 jongfoster - * Now cleans up properly on FATAL (removes taskbar icon etc) - * - * Revision 1.5 2001/05/22 18:46:04 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/21 19:32:54 jongfoster - * Added another #ifdef _WIN_CONSOLE - * - * Revision 1.3 2001/05/20 01:11:40 jongfoster - * Added support for LOG_LEVEL_FATAL - * Renamed LOG_LEVEL_FRC to LOG_LEVEL_FORCE, - * and LOG_LEVEL_REF to LOG_LEVEL_RE_FILTER - * - * Revision 1.2 2001/05/17 22:42:01 oes - * - Cleaned CRLF's from the sources and related files - * - Repaired logging for REF and FRC - * - * Revision 1.1.1.1 2001/05/15 13:58:51 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> -#include <string.h> - -#include "config.h" -#include "miscutil.h" - -/* For gettimeofday() */ -#include <sys/time.h> - -#if !defined(_WIN32) && !defined(__OS2__) -#include <unistd.h> -#endif /* !defined(_WIN32) && !defined(__OS2__) */ - -#include <errno.h> -#include <assert.h> - -#ifdef _WIN32 -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> -#ifndef _WIN_CONSOLE -#include "w32log.h" -#endif /* ndef _WIN_CONSOLE */ -#endif /* def _WIN32 */ -#ifdef _MSC_VER -#define inline __inline -#endif /* def _MSC_VER */ - -#ifdef __OS2__ -#include <sys/socket.h> /* For sock_errno */ -#define INCL_DOS -#include <os2.h> -#endif - -#include "errlog.h" -#include "project.h" -#include "jcc.h" - -const char errlog_h_rcs[] = ERRLOG_H_VERSION; - - -/* - * LOG_LEVEL_FATAL cannot be turned off. (There are - * some exceptional situations where we need to get a - * message to the user). - */ -#define LOG_LEVEL_MINIMUM LOG_LEVEL_FATAL - -/* where to log (default: stderr) */ -static FILE *logfp = NULL; - -/* logging detail level. XXX: stupid name. */ -static int debug = (LOG_LEVEL_FATAL | LOG_LEVEL_ERROR); - -/* static functions */ -static void fatal_error(const char * error_message); -#ifdef _WIN32 -static char *w32_socket_strerr(int errcode, char *tmp_buf); -#endif -#ifdef __OS2__ -static char *os2_socket_strerr(int errcode, char *tmp_buf); -#endif - -#ifdef MUTEX_LOCKS_AVAILABLE -static inline void lock_logfile(void) -{ - privoxy_mutex_lock(&log_mutex); -} -static inline void unlock_logfile(void) -{ - privoxy_mutex_unlock(&log_mutex); -} -static inline void lock_loginit(void) -{ - privoxy_mutex_lock(&log_init_mutex); -} -static inline void unlock_loginit(void) -{ - privoxy_mutex_unlock(&log_init_mutex); -} -#else /* ! MUTEX_LOCKS_AVAILABLE */ -/* - * FIXME we need a cross-platform locking mechanism. - * The locking/unlocking functions below should be - * fleshed out for non-pthread implementations. - */ -static inline void lock_logfile() {} -static inline void unlock_logfile() {} -static inline void lock_loginit() {} -static inline void unlock_loginit() {} -#endif - -/********************************************************************* - * - * Function : fatal_error - * - * Description : Displays a fatal error to standard error (or, on - * a WIN32 GUI, to a dialog box), and exits Privoxy - * with status code 1. - * - * Parameters : - * 1 : error_message = The error message to display. - * - * Returns : Does not return. - * - *********************************************************************/ -static void fatal_error(const char *error_message) -{ -#if defined(_WIN32) && !defined(_WIN_CONSOLE) - /* Skip timestamp and thread id for the message box. */ - const char *box_message = strstr(error_message, "Fatal error"); - if (NULL == box_message) - { - /* Shouldn't happen but ... */ - box_message = error_message; - } - MessageBox(g_hwndLogFrame, box_message, "Privoxy Error", - MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); - - /* Cleanup - remove taskbar icon etc. */ - TermLogWindow(); -#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ - - if (logfp != NULL) - { - fputs(error_message, logfp); - } - -#if defined(unix) - if (pidfile) - { - unlink(pidfile); - } -#endif /* unix */ - - exit(1); -} - - -/********************************************************************* - * - * Function : show_version - * - * Description : Logs the Privoxy version and the program name. - * - * Parameters : - * 1 : prog_name = The program name. - * - * Returns : Nothing. - * - *********************************************************************/ -void show_version(const char *prog_name) -{ - log_error(LOG_LEVEL_INFO, "Privoxy version " VERSION); - if (prog_name != NULL) - { - log_error(LOG_LEVEL_INFO, "Program name: %s", prog_name); - } -} - - -/********************************************************************* - * - * Function : init_log_module - * - * Description : Initializes the logging module to log to stderr. - * Can only be called while stderr hasn't been closed - * yet and is only supposed to be called once. - * - * Parameters : - * 1 : prog_name = The program name. - * - * Returns : Nothing. - * - *********************************************************************/ -void init_log_module(void) -{ - lock_logfile(); - logfp = stderr; - unlock_logfile(); - set_debug_level(debug); -} - - -/********************************************************************* - * - * Function : set_debug_level - * - * Description : Sets the debug level to the provided value - * plus LOG_LEVEL_MINIMUM. - * - * XXX: we should only use the LOG_LEVEL_MINIMUM - * until the first time the configuration file has - * been parsed. - * - * Parameters : 1: debug_level = The debug level to set. - * - * Returns : Nothing. - * - *********************************************************************/ -void set_debug_level(int debug_level) -{ - debug = debug_level | LOG_LEVEL_MINIMUM; -} - - -/********************************************************************* - * - * Function : disable_logging - * - * Description : Disables logging. - * - * Parameters : None. - * - * Returns : Nothing. - * - *********************************************************************/ -void disable_logging(void) -{ - if (logfp != NULL) - { - log_error(LOG_LEVEL_INFO, - "No logfile configured. Please enable it before reporting any problems."); - lock_logfile(); - fclose(logfp); - logfp = NULL; - unlock_logfile(); - } -} - - -/********************************************************************* - * - * Function : init_error_log - * - * Description : Initializes the logging module to log to a file. - * - * XXX: should be renamed. - * - * Parameters : - * 1 : prog_name = The program name. - * 2 : logfname = The logfile to (re)open. - * - * Returns : N/A - * - *********************************************************************/ -void init_error_log(const char *prog_name, const char *logfname) -{ - FILE *fp; - - assert(NULL != logfname); - - lock_loginit(); - - if ((logfp != NULL) && (logfp != stderr)) - { - log_error(LOG_LEVEL_INFO, "(Re-)Opening logfile '%s'", logfname); - } - - /* set the designated log file */ - fp = fopen(logfname, "a"); - if ((NULL == fp) && (logfp != NULL)) - { - /* - * Some platforms (like OS/2) don't allow us to open - * the same file twice, therefore we give it another - * shot after closing the old file descriptor first. - * - * We don't do it right away because it prevents us - * from logging the "can't open logfile" message to - * the old logfile. - * - * XXX: this is a lame workaround and once the next - * release is out we should stop bothering reopening - * the logfile unless we have to. - * - * Currently we reopen it every time the config file - * has been reloaded, but actually we only have to - * reopen it if the file name changed or if the - * configuration reloas was caused by a SIGHUP. - */ - log_error(LOG_LEVEL_INFO, "Failed to reopen logfile: '%s'. " - "Retrying after closing the old file descriptor first. If that " - "doesn't work, Privoxy will exit without being able to log a message.", - logfname); - lock_logfile(); - fclose(logfp); - logfp = NULL; - unlock_logfile(); - fp = fopen(logfname, "a"); - } - - if (NULL == fp) - { - log_error(LOG_LEVEL_FATAL, "init_error_log(): can't open logfile: '%s'", logfname); - } - - /* set logging to be completely unbuffered */ - setbuf(fp, NULL); - - lock_logfile(); - if (logfp != NULL) - { - fclose(logfp); - } - logfp = fp; - unlock_logfile(); - - show_version(prog_name); - - unlock_loginit(); - -} /* init_error_log */ - - -/********************************************************************* - * - * Function : get_thread_id - * - * Description : Returns a number that is different for each thread. - * - * XXX: Should be moved elsewhere (miscutil.c?) - * - * Parameters : None - * - * Returns : thread_id - * - *********************************************************************/ -static long get_thread_id(void) -{ - long this_thread = 1; /* was: pthread_t this_thread;*/ - -#ifdef __OS2__ - PTIB ptib; - APIRET ulrc; /* XXX: I have no clue what this does */ -#endif /* __OS2__ */ - - /* FIXME get current thread id */ -#ifdef FEATURE_PTHREAD - this_thread = (long)pthread_self(); -#ifdef __MACH__ - /* - * Mac OSX (and perhaps other Mach instances) doesn't have a debuggable - * value at the first 4 bytes of pthread_self()'s return value, a pthread_t. - * pthread_t is supposed to be opaque... but it's fairly random, though, so - * we make it mostly presentable. - */ - this_thread = abs(this_thread % 1000); -#endif /* def __MACH__ */ -#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 */ - - return this_thread; -} - - -/********************************************************************* - * - * Function : get_log_timestamp - * - * Description : Generates the time stamp for the log message prefix. - * - * Parameters : - * 1 : buffer = Storage buffer - * 2 : buffer_size = Size of storage buffer - * - * Returns : Number of written characters or 0 for error. - * - *********************************************************************/ -static inline size_t get_log_timestamp(char *buffer, size_t buffer_size) -{ - size_t length; - time_t now; - struct tm tm_now; - struct timeval tv_now; /* XXX: stupid name */ - long msecs; - int msecs_length = 0; - - gettimeofday(&tv_now, NULL); - msecs = tv_now.tv_usec / 1000; - - time(&now); - -#ifdef HAVE_LOCALTIME_R - tm_now = *localtime_r(&now, &tm_now); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&localtime_mutex); - tm_now = *localtime(&now); - privoxy_mutex_unlock(&localtime_mutex); -#else - tm_now = *localtime(&now); -#endif - - length = strftime(buffer, buffer_size, "%b %d %H:%M:%S", &tm_now); - if (length > (size_t)0) - { - msecs_length = snprintf(buffer+length, buffer_size - length, ".%.3ld", msecs); - } - if (msecs_length > 0) - { - length += (size_t)msecs_length; - } - else - { - length = 0; - } - - return length; -} - - -/********************************************************************* - * - * Function : get_clf_timestamp - * - * Description : Generates a Common Log Format time string. - * - * Parameters : - * 1 : buffer = Storage buffer - * 2 : buffer_size = Size of storage buffer - * - * Returns : Number of written characters or 0 for error. - * - *********************************************************************/ -static inline size_t get_clf_timestamp(char *buffer, size_t buffer_size) -{ - /* - * Complex because not all OSs have tm_gmtoff or - * the %z field in strftime() - */ - time_t now; - struct tm *tm_now; - struct tm gmt; -#ifdef HAVE_LOCALTIME_R - struct tm dummy; -#endif - int days, hrs, mins; - size_t length; - int tz_length = 0; - - time (&now); -#ifdef HAVE_GMTIME_R - gmt = *gmtime_r(&now, &gmt); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&gmtime_mutex); - gmt = *gmtime(&now); - privoxy_mutex_unlock(&gmtime_mutex); -#else - gmt = *gmtime(&now); -#endif -#ifdef HAVE_LOCALTIME_R - tm_now = localtime_r(&now, &dummy); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&localtime_mutex); - tm_now = localtime(&now); - privoxy_mutex_unlock(&localtime_mutex); -#else - 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; - - length = strftime(buffer, buffer_size, "%d/%b/%Y:%H:%M:%S ", tm_now); - - if (length > (size_t)0) - { - tz_length = snprintf(buffer+length, buffer_size-length, - "%+03d%02d", mins / 60, abs(mins) % 60); - } - if (tz_length > 0) - { - length += (size_t)tz_length; - } - else - { - length = 0; - } - - return length; -} - - -/********************************************************************* - * - * Function : get_log_level_string - * - * Description : Translates a numerical loglevel into a string. - * - * Parameters : - * 1 : loglevel = LOG_LEVEL_FOO - * - * Returns : Log level string. - * - *********************************************************************/ -static inline const char *get_log_level_string(int loglevel) -{ - char *log_level_string = NULL; - - assert(0 < loglevel); - - switch (loglevel) - { - case LOG_LEVEL_ERROR: - log_level_string = "Error"; - break; - case LOG_LEVEL_FATAL: - log_level_string = "Fatal error"; - break; - case LOG_LEVEL_GPC: - log_level_string = "Request"; - break; - case LOG_LEVEL_CONNECT: - log_level_string = "Connect"; - break; - case LOG_LEVEL_LOG: - log_level_string = "Writing"; - break; - case LOG_LEVEL_HEADER: - log_level_string = "Header"; - break; - case LOG_LEVEL_INFO: - log_level_string = "Info"; - break; - case LOG_LEVEL_RE_FILTER: - log_level_string = "Re-Filter"; - break; -#ifdef FEATURE_FORCE_LOAD - case LOG_LEVEL_FORCE: - log_level_string = "Force"; - break; -#endif /* def FEATURE_FORCE_LOAD */ -#ifdef FEATURE_FAST_REDIRECTS - case LOG_LEVEL_REDIRECTS: - log_level_string = "Redirect"; - break; -#endif /* def FEATURE_FAST_REDIRECTS */ - case LOG_LEVEL_DEANIMATE: - log_level_string = "Gif-Deanimate"; - break; - case LOG_LEVEL_CRUNCH: - log_level_string = "Crunch"; - break; - case LOG_LEVEL_CGI: - log_level_string = "CGI"; - break; - default: - log_level_string = "Unknown log level"; - break; - } - assert(NULL != log_level_string); - - return log_level_string; -} - - -/********************************************************************* - * - * Function : log_error - * - * Description : This is the error-reporting and logging function. - * - * Parameters : - * 1 : loglevel = the type of message to be logged - * 2 : fmt = the main string we want logged, printf-like - * 3 : ... = arguments to be inserted in fmt (printf-like). - * - * Returns : N/A - * - *********************************************************************/ -void log_error(int loglevel, const char *fmt, ...) -{ - va_list ap; - char *outbuf = NULL; - static char *outbuf_save = NULL; - char tempbuf[BUFFER_SIZE]; - size_t length = 0; - const char * src = fmt; - long thread_id; - char timestamp[30]; - /* - * XXX: Make this a config option, - * why else do we allocate instead of using - * an array? - */ - size_t log_buffer_size = BUFFER_SIZE; - -#if defined(_WIN32) && !defined(_WIN_CONSOLE) - /* - * Irrespective of debug setting, a GET/POST/CONNECT makes - * the taskbar icon animate. (There is an option to disable - * this but checking that is handled inside LogShowActivity()). - */ - if ((loglevel == LOG_LEVEL_GPC) || (loglevel == LOG_LEVEL_CRUNCH)) - { - LogShowActivity(); - } -#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ - - /* - * verify that the loglevel applies to current - * settings and that logging is enabled. - * Bail out otherwise. - */ - if ((0 == (loglevel & debug)) -#ifndef _WIN32 - || (logfp == NULL) -#endif - ) - { - if (loglevel == LOG_LEVEL_FATAL) - { - fatal_error("Fatal error. You're not supposed to" - "see this message. Please file a bug report."); - } - return; - } - - thread_id = get_thread_id(); - get_log_timestamp(timestamp, sizeof(timestamp)); - - /* protect the whole function because of the static buffer (outbuf) */ - lock_logfile(); - - if (NULL == outbuf_save) - { - outbuf_save = (char*)zalloc(log_buffer_size + 1); /* +1 for paranoia */ - if (NULL == outbuf_save) - { - snprintf(tempbuf, sizeof(tempbuf), - "%s %08lx Fatal error: Out of memory in log_error().", - timestamp, thread_id); - fatal_error(tempbuf); /* Exit */ - return; - } - } - outbuf = outbuf_save; - - /* - * Memsetting the whole buffer to zero (in theory) - * makes things easier later on. - */ - memset(outbuf, 0, log_buffer_size); - - /* Add prefix for everything but Common Log Format messages */ - if (loglevel != LOG_LEVEL_CLF) - { - length = (size_t)snprintf(outbuf, log_buffer_size, "%s %08lx %s: ", - timestamp, thread_id, get_log_level_string(loglevel)); - } - - /* get ready to scan var. args. */ - va_start(ap, fmt); - - /* build formatted message from fmt and var-args */ - while ((*src) && (length < log_buffer_size-2)) - { - const char *sval = NULL; /* %N string */ - int ival; /* %N string length or an error code */ - unsigned uval; /* %u value */ - long lval; /* %l value */ - unsigned long ulval; /* %ul value */ - char ch; - const char *format_string = tempbuf; - - ch = *src++; - if (ch != '%') - { - outbuf[length++] = ch; - /* - * XXX: Only necessary on platforms where multiple threads - * can write to the buffer at the same time because we - * don't support mutexes (OS/2 for example). - */ - outbuf[length] = '\0'; - continue; - } - outbuf[length] = '\0'; - ch = *src++; - switch (ch) { - case '%': - tempbuf[0] = '%'; - tempbuf[1] = '\0'; - break; - case 'd': - ival = va_arg( ap, int ); - snprintf(tempbuf, sizeof(tempbuf), "%d", ival); - break; - case 'u': - uval = va_arg( ap, unsigned ); - snprintf(tempbuf, sizeof(tempbuf), "%u", uval); - break; - case 'l': - /* this is a modifier that must be followed by u, lu, or d */ - ch = *src++; - if (ch == 'd') - { - lval = va_arg( ap, long ); - snprintf(tempbuf, sizeof(tempbuf), "%ld", lval); - } - else if (ch == 'u') - { - ulval = va_arg( ap, unsigned long ); - snprintf(tempbuf, sizeof(tempbuf), "%lu", ulval); - } - else if ((ch == 'l') && (*src == 'u')) - { - unsigned long long lluval = va_arg(ap, unsigned long long); - snprintf(tempbuf, sizeof(tempbuf), "%llu", lluval); - ch = *src++; - } - else - { - snprintf(tempbuf, sizeof(tempbuf), "Bad format string: "%s"", fmt); - loglevel = LOG_LEVEL_FATAL; - } - break; - case 'c': - /* - * Note that char paramaters are converted to int, so we need to - * pass "int" to va_arg. (See K&R, 2nd ed, section A7.3.2, page 202) - */ - tempbuf[0] = (char) va_arg(ap, int); - tempbuf[1] = '\0'; - break; - case 's': - format_string = va_arg(ap, char *); - if (format_string == NULL) - { - format_string = "[null]"; - } - break; - case 'N': - /* - * Non-standard: Print a counted unterminated string. - * Takes 2 parameters: int length, const char * string. - */ - ival = va_arg(ap, int); - sval = va_arg(ap, char *); - if (sval == NULL) - { - format_string = "[null]"; - } - else if (ival <= 0) - { - if (0 == ival) - { - /* That's ok (but stupid) */ - tempbuf[0] = '\0'; - } - else - { - /* - * That's not ok (and even more stupid) - */ - assert(ival >= 0); - format_string = "[counted string lenght < 0]"; - } - } - else if ((size_t)ival >= sizeof(tempbuf)) - { - /* - * String is too long, copy as much as possible. - * It will be further truncated later. - */ - memcpy(tempbuf, sval, sizeof(tempbuf)-1); - tempbuf[sizeof(tempbuf)-1] = '\0'; - } - else - { - memcpy(tempbuf, sval, (size_t) ival); - tempbuf[ival] = '\0'; - } - break; - case 'E': - /* Non-standard: Print error code from errno */ -#ifdef _WIN32 - ival = WSAGetLastError(); - format_string = w32_socket_strerr(ival, tempbuf); -#elif __OS2__ - ival = sock_errno(); - if (ival != 0) - { - format_string = os2_socket_strerr(ival, tempbuf); - } - else - { - ival = errno; - format_string = strerror(ival); - } -#else /* ifndef _WIN32 */ - ival = errno; -#ifdef HAVE_STRERROR - format_string = strerror(ival); -#else /* ifndef HAVE_STRERROR */ - format_string = NULL; -#endif /* ndef HAVE_STRERROR */ - if (sval == NULL) - { - snprintf(tempbuf, sizeof(tempbuf), "(errno = %d)", ival); - } -#endif /* ndef _WIN32 */ - break; - case 'T': - /* Non-standard: Print a Common Log File timestamp */ - get_clf_timestamp(tempbuf, sizeof(tempbuf)); - break; - default: - snprintf(tempbuf, sizeof(tempbuf), "Bad format string: "%s"", fmt); - loglevel = LOG_LEVEL_FATAL; - break; - } /* switch( p ) */ - - assert(length < log_buffer_size); - length += strlcpy(outbuf + length, format_string, log_buffer_size - length); - - if (length >= log_buffer_size-2) - { - static char warning[] = "... [too long, truncated]"; - - length = log_buffer_size - sizeof(warning) - 1; - length += strlcpy(outbuf + length, warning, log_buffer_size - length); - assert(length < log_buffer_size); - - break; - } - } /* for( p ... ) */ - - /* done with var. args */ - va_end(ap); - - assert(length < log_buffer_size); - length += strlcpy(outbuf + length, "\n", log_buffer_size - length); - - /* Some sanity checks */ - if ((length >= log_buffer_size) - || (outbuf[log_buffer_size-1] != '\0') - || (outbuf[log_buffer_size] != '\0') - ) - { - /* Repeat as assertions */ - assert(length < log_buffer_size); - assert(outbuf[log_buffer_size-1] == '\0'); - /* - * outbuf's real size is log_buffer_size+1, - * so while this looks like an off-by-one, - * we're only checking our paranoia byte. - */ - assert(outbuf[log_buffer_size] == '\0'); - - snprintf(outbuf, log_buffer_size, - "%s %08lx Fatal error: log_error()'s sanity checks failed." - "length: %d. Exiting.", - timestamp, thread_id, (int)length); - loglevel = LOG_LEVEL_FATAL; - } - -#ifndef _WIN32 - /* - * On Windows this is acceptable in case - * we are logging to the GUI window only. - */ - assert(NULL != logfp); -#endif - - if (loglevel == LOG_LEVEL_FATAL) - { - fatal_error(outbuf_save); - /* Never get here */ - } - if (logfp != NULL) - { - fputs(outbuf_save, logfp); - } - -#if defined(_WIN32) && !defined(_WIN_CONSOLE) - /* Write to display */ - LogPutString(outbuf_save); -#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ - - unlock_logfile(); - -} - - -/********************************************************************* - * - * Function : jb_err_to_string - * - * Description : Translates JB_ERR_FOO codes into strings. - * - * XXX: the type of error codes is jb_err - * but the typedef'inition is currently not - * visible to all files that include errlog.h. - * - * Parameters : - * 1 : error = a valid jb_err code - * - * Returns : A string with the jb_err translation - * - *********************************************************************/ -const char *jb_err_to_string(int error) -{ - switch (error) - { - case JB_ERR_OK: - return "Success, no error"; - case JB_ERR_MEMORY: - return "Out of memory"; - case JB_ERR_CGI_PARAMS: - return "Missing or corrupt CGI parameters"; - case JB_ERR_FILE: - return "Error opening, reading or writing a file"; - case JB_ERR_PARSE: - return "Parse error"; - case JB_ERR_MODIFIED: - return "File has been modified outside of the CGI actions editor."; - case JB_ERR_COMPRESS: - return "(De)compression failure"; - default: - assert(0); - return "Unknown error"; - } - assert(0); - return "Internal error"; -} - -#ifdef _WIN32 -/********************************************************************* - * - * Function : w32_socket_strerr - * - * Description : Translate the return value from WSAGetLastError() - * into a string. - * - * Parameters : - * 1 : errcode = The return value from WSAGetLastError(). - * 2 : tmp_buf = A temporary buffer that might be used to - * store the string. - * - * Returns : String representing the error code. This may be - * a global string constant or a string stored in - * tmp_buf. - * - *********************************************************************/ -static char *w32_socket_strerr(int errcode, char *tmp_buf) -{ -#define TEXT_FOR_ERROR(code,text) \ - if (errcode == code) \ - { \ - return #code " - " text; \ - } - - TEXT_FOR_ERROR(WSAEACCES, "Permission denied") - TEXT_FOR_ERROR(WSAEADDRINUSE, "Address already in use.") - TEXT_FOR_ERROR(WSAEADDRNOTAVAIL, "Cannot assign requested address."); - TEXT_FOR_ERROR(WSAEAFNOSUPPORT, "Address family not supported by protocol family."); - TEXT_FOR_ERROR(WSAEALREADY, "Operation already in progress."); - TEXT_FOR_ERROR(WSAECONNABORTED, "Software caused connection abort."); - TEXT_FOR_ERROR(WSAECONNREFUSED, "Connection refused."); - TEXT_FOR_ERROR(WSAECONNRESET, "Connection reset by peer."); - TEXT_FOR_ERROR(WSAEDESTADDRREQ, "Destination address required."); - TEXT_FOR_ERROR(WSAEFAULT, "Bad address."); - TEXT_FOR_ERROR(WSAEHOSTDOWN, "Host is down."); - TEXT_FOR_ERROR(WSAEHOSTUNREACH, "No route to host."); - TEXT_FOR_ERROR(WSAEINPROGRESS, "Operation now in progress."); - TEXT_FOR_ERROR(WSAEINTR, "Interrupted function call."); - TEXT_FOR_ERROR(WSAEINVAL, "Invalid argument."); - TEXT_FOR_ERROR(WSAEISCONN, "Socket is already connected."); - TEXT_FOR_ERROR(WSAEMFILE, "Too many open sockets."); - TEXT_FOR_ERROR(WSAEMSGSIZE, "Message too long."); - TEXT_FOR_ERROR(WSAENETDOWN, "Network is down."); - TEXT_FOR_ERROR(WSAENETRESET, "Network dropped connection on reset."); - TEXT_FOR_ERROR(WSAENETUNREACH, "Network is unreachable."); - TEXT_FOR_ERROR(WSAENOBUFS, "No buffer space available."); - TEXT_FOR_ERROR(WSAENOPROTOOPT, "Bad protocol option."); - TEXT_FOR_ERROR(WSAENOTCONN, "Socket is not connected."); - TEXT_FOR_ERROR(WSAENOTSOCK, "Socket operation on non-socket."); - TEXT_FOR_ERROR(WSAEOPNOTSUPP, "Operation not supported."); - TEXT_FOR_ERROR(WSAEPFNOSUPPORT, "Protocol family not supported."); - TEXT_FOR_ERROR(WSAEPROCLIM, "Too many processes."); - TEXT_FOR_ERROR(WSAEPROTONOSUPPORT, "Protocol not supported."); - TEXT_FOR_ERROR(WSAEPROTOTYPE, "Protocol wrong type for socket."); - TEXT_FOR_ERROR(WSAESHUTDOWN, "Cannot send after socket shutdown."); - TEXT_FOR_ERROR(WSAESOCKTNOSUPPORT, "Socket type not supported."); - TEXT_FOR_ERROR(WSAETIMEDOUT, "Connection timed out."); - TEXT_FOR_ERROR(WSAEWOULDBLOCK, "Resource temporarily unavailable."); - TEXT_FOR_ERROR(WSAHOST_NOT_FOUND, "Host not found."); - TEXT_FOR_ERROR(WSANOTINITIALISED, "Successful WSAStartup not yet performed."); - TEXT_FOR_ERROR(WSANO_DATA, "Valid name, no data record of requested type."); - TEXT_FOR_ERROR(WSANO_RECOVERY, "This is a non-recoverable error."); - TEXT_FOR_ERROR(WSASYSNOTREADY, "Network subsystem is unavailable."); - TEXT_FOR_ERROR(WSATRY_AGAIN, "Non-authoritative host not found."); - TEXT_FOR_ERROR(WSAVERNOTSUPPORTED, "WINSOCK.DLL version out of range."); - TEXT_FOR_ERROR(WSAEDISCON, "Graceful shutdown in progress."); - /* - * The following error codes are documented in the Microsoft WinSock - * reference guide, but don't actually exist. - * - * TEXT_FOR_ERROR(WSA_INVALID_HANDLE, "Specified event object handle is invalid."); - * TEXT_FOR_ERROR(WSA_INVALID_PARAMETER, "One or more parameters are invalid."); - * TEXT_FOR_ERROR(WSAINVALIDPROCTABLE, "Invalid procedure table from service provider."); - * TEXT_FOR_ERROR(WSAINVALIDPROVIDER, "Invalid service provider version number."); - * TEXT_FOR_ERROR(WSA_IO_PENDING, "Overlapped operations will complete later."); - * TEXT_FOR_ERROR(WSA_IO_INCOMPLETE, "Overlapped I/O event object not in signaled state."); - * TEXT_FOR_ERROR(WSA_NOT_ENOUGH_MEMORY, "Insufficient memory available."); - * TEXT_FOR_ERROR(WSAPROVIDERFAILEDINIT, "Unable to initialize a service provider."); - * TEXT_FOR_ERROR(WSASYSCALLFAILURE, "System call failure."); - * TEXT_FOR_ERROR(WSA_OPERATION_ABORTED, "Overlapped operation aborted."); - */ - - sprintf(tmp_buf, "(error number %d)", errcode); - return tmp_buf; -} -#endif /* def _WIN32 */ - - -#ifdef __OS2__ -/********************************************************************* - * - * Function : os2_socket_strerr - * - * Description : Translate the return value from sock_errno() - * into a string. - * - * Parameters : - * 1 : errcode = The return value from sock_errno(). - * 2 : tmp_buf = A temporary buffer that might be used to - * store the string. - * - * Returns : String representing the error code. This may be - * a global string constant or a string stored in - * tmp_buf. - * - *********************************************************************/ -static char *os2_socket_strerr(int errcode, char *tmp_buf) -{ -#define TEXT_FOR_ERROR(code,text) \ - if (errcode == code) \ - { \ - return #code " - " text; \ - } - - TEXT_FOR_ERROR(SOCEPERM , "Not owner.") - TEXT_FOR_ERROR(SOCESRCH , "No such process.") - TEXT_FOR_ERROR(SOCEINTR , "Interrupted system call.") - TEXT_FOR_ERROR(SOCENXIO , "No such device or address.") - TEXT_FOR_ERROR(SOCEBADF , "Bad file number.") - TEXT_FOR_ERROR(SOCEACCES , "Permission denied.") - TEXT_FOR_ERROR(SOCEFAULT , "Bad address.") - TEXT_FOR_ERROR(SOCEINVAL , "Invalid argument.") - TEXT_FOR_ERROR(SOCEMFILE , "Too many open files.") - TEXT_FOR_ERROR(SOCEPIPE , "Broken pipe.") - TEXT_FOR_ERROR(SOCEWOULDBLOCK , "Operation would block.") - TEXT_FOR_ERROR(SOCEINPROGRESS , "Operation now in progress.") - TEXT_FOR_ERROR(SOCEALREADY , "Operation already in progress.") - TEXT_FOR_ERROR(SOCENOTSOCK , "Socket operation on non-socket.") - TEXT_FOR_ERROR(SOCEDESTADDRREQ , "Destination address required.") - TEXT_FOR_ERROR(SOCEMSGSIZE , "Message too long.") - TEXT_FOR_ERROR(SOCEPROTOTYPE , "Protocol wrong type for socket.") - TEXT_FOR_ERROR(SOCENOPROTOOPT , "Protocol not available.") - TEXT_FOR_ERROR(SOCEPROTONOSUPPORT, "Protocol not supported.") - TEXT_FOR_ERROR(SOCESOCKTNOSUPPORT, "Socket type not supported.") - TEXT_FOR_ERROR(SOCEOPNOTSUPP , "Operation not supported.") - TEXT_FOR_ERROR(SOCEPFNOSUPPORT , "Protocol family not supported.") - TEXT_FOR_ERROR(SOCEAFNOSUPPORT , "Address family not supported by protocol family.") - TEXT_FOR_ERROR(SOCEADDRINUSE , "Address already in use.") - TEXT_FOR_ERROR(SOCEADDRNOTAVAIL , "Can't assign requested address.") - TEXT_FOR_ERROR(SOCENETDOWN , "Network is down.") - TEXT_FOR_ERROR(SOCENETUNREACH , "Network is unreachable.") - TEXT_FOR_ERROR(SOCENETRESET , "Network dropped connection on reset.") - TEXT_FOR_ERROR(SOCECONNABORTED , "Software caused connection abort.") - TEXT_FOR_ERROR(SOCECONNRESET , "Connection reset by peer.") - TEXT_FOR_ERROR(SOCENOBUFS , "No buffer space available.") - TEXT_FOR_ERROR(SOCEISCONN , "Socket is already connected.") - TEXT_FOR_ERROR(SOCENOTCONN , "Socket is not connected.") - TEXT_FOR_ERROR(SOCESHUTDOWN , "Can't send after socket shutdown.") - TEXT_FOR_ERROR(SOCETOOMANYREFS , "Too many references: can't splice.") - TEXT_FOR_ERROR(SOCETIMEDOUT , "Operation timed out.") - TEXT_FOR_ERROR(SOCECONNREFUSED , "Connection refused.") - TEXT_FOR_ERROR(SOCELOOP , "Too many levels of symbolic links.") - TEXT_FOR_ERROR(SOCENAMETOOLONG , "File name too long.") - TEXT_FOR_ERROR(SOCEHOSTDOWN , "Host is down.") - TEXT_FOR_ERROR(SOCEHOSTUNREACH , "No route to host.") - TEXT_FOR_ERROR(SOCENOTEMPTY , "Directory not empty.") - TEXT_FOR_ERROR(SOCEOS2ERR , "OS/2 Error.") - - sprintf(tmp_buf, "(error number %d)", errcode); - return tmp_buf; -} -#endif /* def __OS2__ */ - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/errlog.h b/external/privoxy/errlog.h deleted file mode 100644 index 4906331..0000000 --- a/external/privoxy/errlog.h +++ /dev/null @@ -1,215 +0,0 @@ -#ifndef ERRLOG_H_INCLUDED -#define ERRLOG_H_INCLUDED -#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.22 2009/02/09 21:21:15 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/errlog.h,v $ - * - * Purpose : Log errors to a designated destination in an elegant, - * printf-like fashion. - * - * Copyright : Written by and Copyright (C) 2001-2009 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: errlog.h,v $ - * Revision 1.22 2009/02/09 21:21:15 fabiankeil - * Now that init_log_module() is called earlier, call show_version() - * later on from main() directly so it doesn't get called for --help - * or --version. - * - * Revision 1.21 2008/12/14 15:46:22 fabiankeil - * Give crunched requests their own log level. - * - * Revision 1.20 2008/03/27 18:27:23 fabiankeil - * Remove kill-popups action. - * - * Revision 1.19 2007/10/14 14:12:41 fabiankeil - * When in daemon mode, close stderr after the configuration file has been - * parsed the first time. If logfile isn't set, stop logging. Fixes BR#897436. - * - * Revision 1.18 2007/07/14 07:28:47 fabiankeil - * Add translation function for JB_ERR_FOO codes. - * - * Revision 1.17 2007/03/31 13:33:28 fabiankeil - * Add alternative log_error() with timestamps - * that contain milliseconds and without using - * strcpy(), strcat() or sprintf(). - * - * Revision 1.16 2006/11/28 15:29:50 fabiankeil - * Define LOG_LEVEL_REDIRECTS independently of - * FEATURE_FAST_REDIRECTS. It is used by redirect{} - * as well. - * - * Revision 1.15 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.13.2.1 2002/08/05 17:57:06 oes - * Cosmetic change - * - * Revision 1.13 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.3 2001/05/22 18:46:04 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.2 2001/05/20 01:11:40 jongfoster - * Added support for LOG_LEVEL_FATAL - * Renamed LOG_LEVEL_FRC to LOG_LEVEL_FORCE, - * and LOG_LEVEL_REF to LOG_LEVEL_RE_FILTER - * - * Revision 1.1.1.1 2001/05/15 13:58:51 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Debug level for errors */ - -/* XXX: Should be renamed. */ -#define LOG_LEVEL_GPC 0x0001 -#define LOG_LEVEL_CONNECT 0x0002 -#define LOG_LEVEL_IO 0x0004 -#define LOG_LEVEL_HEADER 0x0008 -#define LOG_LEVEL_LOG 0x0010 -#ifdef FEATURE_FORCE_LOAD -#define LOG_LEVEL_FORCE 0x0020 -#endif /* def FEATURE_FORCE_LOAD */ -#define LOG_LEVEL_RE_FILTER 0x0040 -#define LOG_LEVEL_REDIRECTS 0x0080 -#define LOG_LEVEL_DEANIMATE 0x0100 -#define LOG_LEVEL_CLF 0x0200 /* Common Log File format */ -#define LOG_LEVEL_CRUNCH 0x0400 -#define LOG_LEVEL_CGI 0x0800 /* CGI / templates */ - -/* Following are always on: */ -#define LOG_LEVEL_INFO 0x1000 -#define LOG_LEVEL_ERROR 0x2000 -#define LOG_LEVEL_FATAL 0x4000 /* Exits after writing log */ - -extern void init_error_log(const char *prog_name, const char *logfname); -extern void set_debug_level(int debuglevel); -extern void disable_logging(void); -extern void init_log_module(void); -extern void show_version(const char *prog_name); -extern void log_error(int loglevel, const char *fmt, ...); -extern const char *jb_err_to_string(int error); - -/* Revision control strings from this header and associated .c file */ -extern const char errlog_rcs[]; -extern const char errlog_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef ERRLOG_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ - diff --git a/external/privoxy/filters.c b/external/privoxy/filters.c deleted file mode 100644 index 8fa1d4e..0000000 --- a/external/privoxy/filters.c +++ /dev/null @@ -1,2709 +0,0 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.113 2009/03/08 14:19:23 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/filters.c,v $ - * - * Purpose : Declares functions to parse/crunch headers and pages. - * Functions declared include: - * `acl_addr', `add_stats', `block_acl', `block_imageurl', - * `block_url', `url_actions', `domain_split', - * `filter_popups', `forward_url', 'redirect_url', - * `ij_untrusted_url', `intercept_url', `pcrs_filter_respose', - * `ijb_send_banner', `trust_url', `gif_deanimate_response', - * `execute_single_pcrs_command', `rewrite_url', - * `get_last_url' - * - * Copyright : Written by and Copyright (C) 2001, 2004-2008 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: filters.c,v $ - * Revision 1.113 2009/03/08 14:19:23 fabiankeil - * Fix justified (but harmless) compiler warnings - * on platforms where sizeof(int) < sizeof(long). - * - * Revision 1.112 2009/03/01 18:28:23 fabiankeil - * Help clang understand that we aren't dereferencing - * NULL pointers here. - * - * Revision 1.111 2008/12/04 18:13:46 fabiankeil - * Fix a cparser warning. - * - * Revision 1.110 2008/11/10 16:40:25 fabiankeil - * Fix a gcc44 warning. - * - * Revision 1.109 2008/11/08 15:48:41 fabiankeil - * Mention actual values when complaining about - * the chunk size exceeding the buffer size. - * - * Revision 1.108 2008/05/21 15:35:08 fabiankeil - * - Mark csp as immutable for block_acl(). - * - Remove an obsolete complaint about filter_popups(). - * - * Revision 1.107 2008/05/04 17:52:56 fabiankeil - * Adjust parse_http_url() call to new prototype. - * - * Revision 1.106 2008/05/03 16:40:44 fabiankeil - * Change content_filters_enabled()'s parameter from - * csp->action to action so it can be also used in the - * CGI code. Don't bother checking if there are filters - * loaded, as that's somewhat besides the point. - * - * Revision 1.105 2008/03/28 15:13:39 fabiankeil - * Remove inspect-jpegs action. - * - * Revision 1.104 2008/03/27 18:27:24 fabiankeil - * Remove kill-popups action. - * - * Revision 1.103 2008/03/06 16:33:45 fabiankeil - * If limit-connect isn't used, don't limit CONNECT requests to port 443. - * - * Revision 1.102 2008/03/01 14:00:44 fabiankeil - * Let the block action take the reason for the block - * as argument and show it on the "blocked" page. - * - * Revision 1.101 2008/02/23 16:57:12 fabiankeil - * Rename url_actions() to get_url_actions() and let it - * use the standard parameter ordering. - * - * Revision 1.100 2008/02/23 16:33:43 fabiankeil - * Let forward_url() use the standard parameter ordering - * and mark its second parameter immutable. - * - * Revision 1.99 2008/02/03 13:57:58 fabiankeil - * Add SOCKS5 support for forward-override{}. - * - * Revision 1.98 2008/01/04 17:43:45 fabiankeil - * Improve the warning messages that get logged if the action files - * "enable" filters but no filters of that type have been loaded. - * - * Revision 1.97 2007/11/30 15:37:03 fabiankeil - * Use freez instead of free. - * - * Revision 1.96 2007/10/19 16:53:28 fabiankeil - * Add helper function to check if any content filters are enabled. - * - * Revision 1.95 2007/10/17 19:31:20 fabiankeil - * Omitting the zero chunk that ends the chunk transfer encoding seems - * to be the new black. Log the problem and continue filtering anyway. - * - * Revision 1.94 2007/09/29 13:20:20 fabiankeil - * Remove two redundant and one useless log messages. - * - * Revision 1.93 2007/09/29 10:21:16 fabiankeil - * - Move get_filter_function() from jcc.c to filters.c - * so the filter functions can be static. - * - Don't bother filtering body-less responses. - * - * Revision 1.92 2007/09/28 16:38:55 fabiankeil - * - Execute content filters through execute_content_filter(). - * - Add prepare_for_filtering() so filter functions don't have to - * care about de-chunking and decompression. As a side effect this enables - * decompression for gif_deanimate_response() and jpeg_inspect_response(). - * - Change remove_chunked_transfer_coding()'s return type to jb_err. - * Some clowns feel like chunking empty responses in which case - * (size == 0) is valid but previously would be interpreted as error. - * - * Revision 1.91 2007/09/02 15:31:20 fabiankeil - * Move match_portlist() from filter.c to urlmatch.c. - * It's used for url matching, not for filtering. - * - * Revision 1.90 2007/09/02 12:44:17 fabiankeil - * Remove newline at the end of a log_error() message. - * - * Revision 1.89 2007/08/05 13:42:23 fabiankeil - * #1763173 from Stefan Huehner: declare some more functions static. - * - * Revision 1.88 2007/06/01 16:41:11 fabiankeil - * Add forward-override{} to change the forwarding settings through - * action sections. This is mainly interesting to forward different - * clients differently (for example based on User-Agent or request - * origin). - * - * Revision 1.87 2007/04/30 15:53:10 fabiankeil - * Make sure filters with dynamic jobs actually use them. - * - * Revision 1.86 2007/04/30 15:03:28 fabiankeil - * - Introduce dynamic pcrs jobs that can resolve variables. - * - Don't run redirect functions more than once, - * unless they are activated more than once. - * - * Revision 1.85 2007/03/21 12:24:47 fabiankeil - * - Log the content size after decompression in decompress_iob() - * instead of pcrs_filter_response(). - * - * Revision 1.84 2007/03/20 15:16:34 fabiankeil - * Use dedicated header filter actions instead of abusing "filter". - * Replace "filter-client-headers" and "filter-client-headers" - * with "server-header-filter" and "client-header-filter". - * - * Revision 1.83 2007/03/17 15:20:05 fabiankeil - * New config option: enforce-blocks. - * - * Revision 1.82 2007/03/13 11:28:43 fabiankeil - * - Fix port handling in acl_addr() and use a temporary acl spec - * copy so error messages don't contain a truncated version. - * - Log size of iob before and after decompression. - * - * Revision 1.81 2007/03/05 14:40:53 fabiankeil - * - Cosmetical changes for LOG_LEVEL_RE_FILTER messages. - * - Hide the "Go there anyway" link for blocked CONNECT - * requests where going there anyway doesn't work anyway. - * - * Revision 1.80 2007/02/07 10:55:20 fabiankeil - * - Save the reason for generating http_responses. - * - Block (+block) with status code 403 instead of 404. - * - Use a different kludge to remember a failed decompression. - * - * Revision 1.79 2007/01/31 16:21:38 fabiankeil - * Search for Max-Forwards headers case-insensitive, - * don't generate the "501 unsupported" message for invalid - * Max-Forwards values and don't increase negative ones. - * - * Revision 1.78 2007/01/28 13:41:18 fabiankeil - * - Add HEAD support to finish_http_response. - * - Add error favicon to internal HTML error messages. - * - * Revision 1.77 2007/01/12 15:36:44 fabiankeil - * Mark *csp as immutable for is_untrusted_url() - * and is_imageurl(). Closes FR 1237736. - * - * Revision 1.76 2007/01/01 19:36:37 fabiankeil - * Integrate a modified version of Wil Mahan's - * zlib patch (PR #895531). - * - * Revision 1.75 2006/12/29 18:30:46 fabiankeil - * Fixed gcc43 conversion warnings, - * changed sprintf calls to snprintf. - * - * Revision 1.74 2006/12/24 17:37:38 fabiankeil - * Adjust comment in pcrs_filter_response() - * to recent pcrs changes. Hohoho. - * - * Revision 1.73 2006/12/23 16:01:02 fabiankeil - * Don't crash if pcre returns an error code - * that pcrs didn't expect. Fixes BR 1621173. - * - * Revision 1.72 2006/12/22 18:52:53 fabiankeil - * Modified is_untrusted_url to complain in case of - * write errors and to give a reason when adding new - * entries to the trustfile. Closes FR 1097611. - * - * Revision 1.71 2006/12/22 14:24:52 fabiankeil - * Skip empty filter files in pcrs_filter_response, - * but don't ignore the ones that come afterwards. - * Fixes parts of BR 1619208. - * - * Revision 1.70 2006/12/09 13:33:15 fabiankeil - * Added some sanity checks for get_last_url(). - * Fixed possible segfault caused by my last commit. - * - * Revision 1.69 2006/12/08 12:39:13 fabiankeil - * Let get_last_url() catch https URLs as well. - * - * Revision 1.68 2006/12/05 14:45:48 fabiankeil - * Make sure get_last_url() behaves like advertised - * and fast-redirects{} can be combined with redirect{}. - * - * Revision 1.67 2006/11/28 15:19:43 fabiankeil - * Implemented +redirect{s@foo@bar@} to generate - * a redirect based on a rewritten version of the - * original URL. - * - * Revision 1.66 2006/09/23 13:26:38 roro - * Replace TABs by spaces in source code. - * - * Revision 1.65 2006/09/21 12:54:43 fabiankeil - * Fix +redirect{}. Didn't work with -fast-redirects. - * - * Revision 1.64 2006/08/31 10:55:49 fabiankeil - * Block requests for untrusted URLs with status - * code 403 instead of 200. - * - * Revision 1.63 2006/08/31 10:11:28 fabiankeil - * Don't free p which is still in use and will be later - * freed by free_map(). Don't claim the referrer is unknown - * when the client didn't set one. - * - * Revision 1.62 2006/08/14 00:27:47 david__schmidt - * Feature request 595948: Re-Filter logging in single line - * - * Revision 1.61 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work:http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.60 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.58.2.9 2006/01/29 23:10:56 david__schmidt - * Multiple filter file support - * - * Revision 1.58.2.8 2005/05/07 21:50:55 david__schmidt - * A few memory leaks plugged (mostly on error paths) - * - * Revision 1.58.2.7 2004/10/03 12:53:32 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.58.2.6 2003/12/06 22:18:27 gliptak - * Correcting compile problem with FEATURE_IMAGE_BLOCKING - * - * Revision 1.58.2.5 2003/11/11 13:10:31 oes - * Fixed bug #839859: "See why" link URL now gets url-encoded. - * - * Revision 1.58.2.4 2003/02/28 12:52:45 oes - * Fixed a typo - * - * Revision 1.58.2.3 2002/09/25 14:51:51 oes - * Added basic support for OPTIONS and TRACE HTTP methods: - * New function direct_response which handles OPTIONS and - * TRACE requests whose Max-Forwards header field is zero. - * - * Revision 1.58.2.2 2002/08/01 17:18:28 oes - * Fixed BR 537651 / SR 579724 (MSIE image detect improper for IE/Mac) - * - * Revision 1.58.2.1 2002/07/26 15:18:53 oes - * - Bugfix: Executing a filters without jobs no longer results in - * turing off *all* filters. - * - Security fix: Malicious web servers can't cause a seg fault - * through bogus chunk sizes anymore - * - * Revision 1.58 2002/04/24 02:11:17 oes - * Jon's multiple AF patch: url_actions now evaluates rules - * from all AFs. - * - * Revision 1.57 2002/04/08 20:38:34 swa - * fixed JB spelling - * - * Revision 1.56 2002/04/05 15:51:24 oes - * - bugfix: error-pages now get correct request protocol - * - fix for invalid HTML in trust info - * - * Revision 1.55 2002/04/02 16:13:51 oes - * Fix: No "Go there anyway" for SSL - * - * Revision 1.54 2002/04/02 14:55:56 oes - * Bugfix: is_untrusted_url() now depends on FEATURE_TRUST, not FEATURE_COOKIE_JAR - * - * Revision 1.53 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * - block_url: - * - Ported to CGI platform. Now delivers - * http_response or NULL - * - Unified HTML and GIF generation (moved image detection - * and GIF generation here from jcc.c:chat()) - * - Fixed HTTP status to: - * - 403 (Forbidden) for the "blocked" HTML message - * - 200 (OK) for GIF answers - * - 302 (Redirect) for redirect to GIF - * - * - trust_url: - * - Ported to CGI platform. Now delivers - * http_response or NULL - * - Separated detection of untrusted URL into - * (bool)is_untrusted_url - * - Added enforcement of untrusted requests - * - * - Moved redirect_url() from cgi.c to here - * and ported it to the CGI platform - * - * - Removed logentry from cancelled commit - * - * Revision 1.17 2001/06/09 10:55:28 jongfoster - * Changing BUFSIZ ==> BUFFER_SIZE - * - * Revision 1.16 2001/06/07 23:10:26 jongfoster - * Allowing unanchored domain patterns to back off and retry - * if they partially match. Optimized right-anchored patterns. - * Moving ACL and forward files into config file. - * Replacing struct gateway with struct forward_spec - * - * Revision 1.15 2001/06/03 19:12:00 oes - * extracted-CGI relevant stuff - * - * Revision 1.14 2001/06/01 10:30:55 oes - * Added optional left-anchoring to domaincmp - * - * Revision 1.13 2001/05/31 21:21:30 jongfoster - * Permissionsfile / actions file changes: - * - Changed "permission" to "action" throughout - * - changes to file format to allow string parameters - * - Moved helper functions to actions.c - * - * Revision 1.12 2001/05/31 17:35:20 oes - * - * - Enhanced domain part globbing with infix and prefix asterisk - * matching and optional unanchored operation - * - * Revision 1.11 2001/05/29 11:53:23 oes - * "See why" link added to "blocked" page - * - * Revision 1.10 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.9 2001/05/27 22:17:04 oes - * - * - re_process_buffer no longer writes the modified buffer - * to the client, which was very ugly. It now returns the - * buffer, which it is then written by chat. - * - * - content_length now adjusts the Content-Length: header - * for modified documents rather than crunch()ing it. - * (Length info in csp->content_length, which is 0 for - * unmodified documents) - * - * - For this to work, sed() is called twice when filtering. - * - * Revision 1.8 2001/05/26 17:13:28 jongfoster - * Filled in a function comment. - * - * Revision 1.7 2001/05/26 15:26:15 jongfoster - * ACL feature now provides more security by immediately dropping - * connections from untrusted hosts. - * - * Revision 1.6 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.5 2001/05/25 22:34:30 jongfoster - * Hard tabs->Spaces - * - * Revision 1.4 2001/05/22 18:46:04 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.3 2001/05/20 16:44:47 jongfoster - * Removing last hardcoded Junkbusters.com URLs. - * - * 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:52 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> -#include <stdlib.h> -#include <ctype.h> -#include <string.h> -#include <assert.h> - -#ifndef _WIN32 -#ifndef __OS2__ -#include <unistd.h> -#endif /* ndef __OS2__ */ -#include <netinet/in.h> -#else -#include <winsock2.h> -#endif /* ndef _WIN32 */ - -#ifdef __OS2__ -#include <utils.h> -#endif /* def __OS2__ */ - -#include "project.h" -#include "filters.h" -#include "encode.h" -#include "parsers.h" -#include "ssplit.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" -#include "loaders.h" - -#ifdef _WIN32 -#include "win32.h" -#endif - -const char filters_h_rcs[] = FILTERS_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_isdigit(__X) isdigit((int)(unsigned char)(__X)) - -static jb_err remove_chunked_transfer_coding(char *buffer, size_t *size); -static jb_err prepare_for_filtering(struct client_state *csp); - -#ifdef FEATURE_ACL -/********************************************************************* - * - * Function : block_acl - * - * Description : Block this request? - * Decide yes or no based on ACL file. - * - * Parameters : - * 1 : dst = The proxy or gateway address this is going to. - * Or NULL to check all possible targets. - * 2 : csp = Current client state (buffers, headers, etc...) - * Also includes the client IP address. - * - * Returns : 0 = FALSE (don't block) and 1 = TRUE (do block) - * - *********************************************************************/ -int block_acl(const struct access_control_addr *dst, const struct client_state *csp) -{ - struct access_control_list *acl = csp->config->acl; - - /* if not using an access control list, then permit the connection */ - if (acl == NULL) - { - return(0); - } - - /* search the list */ - while (acl != NULL) - { - if ((csp->ip_addr_long & acl->src->mask) == acl->src->addr) - { - if (dst == NULL) - { - /* Just want to check if they have any access */ - if (acl->action == ACL_PERMIT) - { - return(0); - } - } - else if ( ((dst->addr & acl->dst->mask) == acl->dst->addr) - && ((dst->port == acl->dst->port) || (acl->dst->port == 0))) - { - if (acl->action == ACL_PERMIT) - { - return(0); - } - else - { - return(1); - } - } - } - acl = acl->next; - } - - return(1); - -} - - -/********************************************************************* - * - * Function : acl_addr - * - * Description : Called from `load_config' to parse an ACL address. - * - * Parameters : - * 1 : aspec = String specifying ACL address. - * 2 : aca = struct access_control_addr to fill in. - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int acl_addr(const char *aspec, struct access_control_addr *aca) -{ - int i, masklength; - long port; - char *p; - char *acl_spec = NULL; - - masklength = 32; - port = 0; - - /* - * Use a temporary acl spec copy so we can log - * the unmodified original in case of parse errors. - */ - acl_spec = strdup(aspec); - if (acl_spec == NULL) - { - /* XXX: This will be logged as parse error. */ - return(-1); - } - - if ((p = strchr(acl_spec, '/')) != NULL) - { - *p++ = '\0'; - if (ijb_isdigit(*p) == 0) - { - freez(acl_spec); - return(-1); - } - masklength = atoi(p); - } - - if ((masklength < 0) || (masklength > 32)) - { - freez(acl_spec); - return(-1); - } - - if ((p = strchr(acl_spec, ':')) != NULL) - { - char *endptr; - - *p++ = '\0'; - port = strtol(p, &endptr, 10); - - if (port <= 0 || port > 65535 || *endptr != '\0') - { - freez(acl_spec); - return(-1); - } - } - - aca->port = (unsigned long)port; - - aca->addr = ntohl(resolve_hostname_to_ip(acl_spec)); - freez(acl_spec); - - if (aca->addr == INADDR_NONE) - { - /* XXX: This will be logged as parse error. */ - return(-1); - } - - /* build the netmask */ - aca->mask = 0; - for (i=1; i <= masklength ; i++) - { - aca->mask |= (1U << (32 - i)); - } - - /* now mask off the host portion of the ip address - * (i.e. save on the network portion of the address). - */ - aca->addr = aca->addr & aca->mask; - - return(0); - -} -#endif /* def FEATURE_ACL */ - - -/********************************************************************* - * - * Function : connect_port_is_forbidden - * - * Description : Check to see if CONNECT requests to the destination - * port of this request are forbidden. The check is - * independend of the actual request method. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : True if yes, false otherwise. - * - *********************************************************************/ -int connect_port_is_forbidden(const struct client_state *csp) -{ - return ((csp->action->flags & ACTION_LIMIT_CONNECT) && - !match_portlist(csp->action->string[ACTION_STRING_LIMIT_CONNECT], - csp->http->port)); -} - - -/********************************************************************* - * - * Function : block_url - * - * Description : Called from `chat'. Check to see if we need to block this. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : NULL => unblocked, else HTTP block response - * - *********************************************************************/ -struct http_response *block_url(struct client_state *csp) -{ - struct http_response *rsp; - const char *new_content_type = NULL; - - /* - * If it's not blocked, don't block it ;-) - */ - if ((csp->action->flags & ACTION_BLOCK) == 0) - { - return NULL; - } - if (csp->action->flags & ACTION_REDIRECT) - { - log_error(LOG_LEVEL_ERROR, "redirect{} overruled by block."); - } - /* - * Else, prepare a response - */ - if (NULL == (rsp = alloc_http_response())) - { - return cgi_error_memory(); - } - - /* - * If it's an image-url, send back an image or redirect - * as specified by the relevant +image action - */ -#ifdef FEATURE_IMAGE_BLOCKING - if (((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0) - && is_imageurl(csp)) - { - char *p; - /* determine HOW images should be blocked */ - p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER]; - - if(csp->action->flags & ACTION_HANDLE_AS_EMPTY_DOCUMENT) - { - log_error(LOG_LEVEL_ERROR, "handle-as-empty-document overruled by handle-as-image."); - } -#if 1 /* Two alternative strategies, use this one for now: */ - - /* and handle accordingly: */ - if ((p == NULL) || (0 == strcmpic(p, "pattern"))) - { - rsp->status = strdup("403 Request blocked by Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - 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(); - } - } - - else if (0 == strcmpic(p, "blank")) - { - rsp->status = strdup("403 Request blocked by Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - 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(); - } - } - - 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(); - } - - if (enlist_unique_header(rsp->headers, "Location", p)) - { - free_http_response(rsp); - return cgi_error_memory(); - } -#endif /* Preceeding code is disabled for now */ - } - else if(csp->action->flags & ACTION_HANDLE_AS_EMPTY_DOCUMENT) - { - /* - * Send empty document. - */ - new_content_type = csp->action->string[ACTION_STRING_CONTENT_TYPE]; - - freez(rsp->body); - rsp->body = strdup(" "); - rsp->content_length = 1; - - rsp->status = strdup("403 Request blocked by Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - if (new_content_type != 0) - { - log_error(LOG_LEVEL_HEADER, "Overwriting Content-Type with %s", new_content_type); - if (enlist_unique_header(rsp->headers, "Content-Type", new_content_type)) - { - free_http_response(rsp); - return cgi_error_memory(); - } - } - } - else -#endif /* def FEATURE_IMAGE_BLOCKING */ - - /* - * Else, generate an HTML "blocked" message: - */ - { - jb_err err; - struct map * exports; - char *p; - - /* - * 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("403 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); - /* - * Export the force conditional block killer if - * - * - Privoxy was compiled without FEATURE_FORCE_LOAD, or - * - Privoxy is configured to enforce blocks, or - * - it's a CONNECT request and enforcing wouldn't work anyway. - */ - if ((csp->config->feature_flags & RUNTIME_FEATURE_ENFORCE_BLOCKS) - || (0 == strcmpic(csp->http->gpc, "connect"))) -#endif /* ndef FEATURE_FORCE_LOAD */ - { - err = map_block_killer(exports, "force-support"); - } - - if (!err) err = map(exports, "protocol", 1, csp->http->ssl ? "https://" : "http://", 1); - 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, "path-ue", 1, url_encode(csp->http->path), 0); - if (!err) - { - const char *block_reason; - if (csp->action->string[ACTION_STRING_BLOCK] != NULL) - { - block_reason = csp->action->string[ACTION_STRING_BLOCK]; - } - else - { - assert(connect_port_is_forbidden(csp)); - block_reason = "Forbidden CONNECT port."; - } - err = map(exports, "block-reason", 1, html_encode(block_reason), 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->reason = RSP_REASON_BLOCKED; - - return finish_http_response(csp, rsp); - -} - - -#ifdef FEATURE_TRUST -/********************************************************************* - * - * Function : trust_url FIXME: I should be called distrust_url - * - * Description : Calls is_untrusted_url to determine if the URL is trusted - * and if not, returns a HTTP 403 response with a reject message. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : NULL => trusted, else http_response. - * - *********************************************************************/ -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; - - /* - * Don't bother to work on trusted URLs - */ - if (!is_untrusted_url(csp)) - { - return NULL; - } - - /* - * Else, prepare a response: - */ - if (NULL == (rsp = alloc_http_response())) - { - return cgi_error_memory(); - } - - rsp->status = strdup("403 Request blocked by Privoxy"); - exports = default_exports(csp, NULL); - if (exports == NULL || rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - - /* - * Export the protocol, host, port, and referrer information - */ - err = map(exports, "hostport", 1, csp->http->hostport, 1); - if (!err) err = map(exports, "protocol", 1, csp->http->ssl ? "https://" : "http://", 1); - if (!err) err = map(exports, "path", 1, csp->http->path, 1); - - if (NULL != (p = get_header_value(csp->headers, "Referer:"))) - { - if (!err) err = map(exports, "referrer", 1, html_encode(p), 0); - } - else - { - if (!err) err = map(exports, "referrer", 1, "none set", 1); - } - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } - - /* - * Export the trust list - */ - p = strdup(""); - for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++) - { - snprintf(buf, sizeof(buf), "<li>%s</li>\n", t->spec); - string_append(&p, buf); - } - err = map(exports, "trusted-referrers", 1, p, 0); - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } - - /* - * Export the trust info, if available - */ - if (csp->config->trust_info->first) - { - struct list_entry *l; - - p = strdup(""); - for (l = csp->config->trust_info->first; l ; l = l->next) - { - snprintf(buf, sizeof(buf), "<li> <a href="%s">%s</a><br>\n", l->str, l->str); - string_append(&p, buf); - } - err = 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(); - } - - /* - * Export the force conditional block killer if - * - * - Privoxy was compiled without FEATURE_FORCE_LOAD, or - * - Privoxy is configured to enforce blocks, or - * - it's a CONNECT request and enforcing wouldn't work anyway. - */ -#ifdef FEATURE_FORCE_LOAD - if ((csp->config->feature_flags & RUNTIME_FEATURE_ENFORCE_BLOCKS) - || (0 == strcmpic(csp->http->gpc, "connect"))) - { - err = map_block_killer(exports, "force-support"); - } - else - { - 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(); - } - - /* - * Build the response - */ - err = template_fill_for_cgi(csp, "untrusted", exports, rsp); - if (err) - { - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->reason = RSP_REASON_UNTRUSTED; - - return finish_http_response(csp, rsp); -} -#endif /* def FEATURE_TRUST */ - - -/********************************************************************* - * - * Function : compile_dynamic_pcrs_job_list - * - * Description : Compiles a dynamic pcrs job list (one with variables - * resolved at request time) - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : b = The filter list to compile - * - * Returns : NULL in case of errors, otherwise the - * pcrs job list. - * - *********************************************************************/ -pcrs_job *compile_dynamic_pcrs_job_list(const struct client_state *csp, const struct re_filterfile_spec *b) -{ - struct list_entry *pattern; - pcrs_job *job_list = NULL; - pcrs_job *dummy = NULL; - pcrs_job *lastjob = NULL; - int error = 0; - - const struct pcrs_variable variables[] = - { - {"url", csp->http->url, 1}, - {"path", csp->http->path, 1}, - {"host", csp->http->host, 1}, - {"origin", csp->ip_addr_str, 1}, - {NULL, NULL, 1} - }; - - for (pattern = b->patterns->first; pattern != NULL; pattern = pattern->next) - { - assert(pattern->str != NULL); - - dummy = pcrs_compile_dynamic_command(pattern->str, variables, &error); - if (NULL == dummy) - { - assert(error < 0); - log_error(LOG_LEVEL_ERROR, - "Adding filter job '%s' to dynamic filter %s failed: %s", - pattern->str, b->name, pcrs_strerror(error)); - continue; - } - else - { - if (error == PCRS_WARN_TRUNCATION) - { - log_error(LOG_LEVEL_ERROR, - "At least one of the variables in '%s' had to " - "be truncated before compilation", pattern->str); - } - if (job_list == NULL) - { - job_list = dummy; - } - else - { - lastjob->next = dummy; - } - lastjob = dummy; - } - } - - return job_list; -} - - -/********************************************************************* - * - * Function : rewrite_url - * - * Description : Rewrites a URL with a single pcrs command - * and returns the result if it differs from the - * original and isn't obviously invalid. - * - * Parameters : - * 1 : old_url = URL to rewrite. - * 2 : pcrs_command = pcrs command formatted as string (s@foo@bar@) - * - * - * Returns : NULL if the pcrs_command didn't change the url, or - * the result of the modification. - * - *********************************************************************/ -char *rewrite_url(char *old_url, const char *pcrs_command) -{ - char *new_url = NULL; - int hits; - - assert(old_url); - assert(pcrs_command); - - new_url = pcrs_execute_single_command(old_url, pcrs_command, &hits); - - if (hits == 0) - { - log_error(LOG_LEVEL_REDIRECTS, - "pcrs command "%s" didn't change "%s".", - pcrs_command, old_url); - freez(new_url); - } - else if (hits < 0) - { - log_error(LOG_LEVEL_REDIRECTS, - "executing pcrs command "%s" to rewrite %s failed: %s", - pcrs_command, old_url, pcrs_strerror(hits)); - freez(new_url); - } - else if (strncmpic(new_url, "http://", 7) && strncmpic(new_url, "https://", 8)) - { - log_error(LOG_LEVEL_ERROR, - "pcrs command "%s" changed "%s" to "%s" (%u hi%s), " - "but the result doesn't look like a valid URL and will be ignored.", - pcrs_command, old_url, new_url, hits, (hits == 1) ? "t" : "ts"); - freez(new_url); - } - else - { - log_error(LOG_LEVEL_REDIRECTS, - "pcrs command "%s" changed "%s" to "%s" (%u hi%s).", - pcrs_command, old_url, new_url, hits, (hits == 1) ? "t" : "ts"); - } - - return new_url; - -} - - -#ifdef FEATURE_FAST_REDIRECTS -/********************************************************************* - * - * Function : get_last_url - * - * Description : Search for the last URL inside a string. - * If the string already is a URL, it will - * be the first URL found. - * - * Parameters : - * 1 : subject = the string to check - * 2 : redirect_mode = +fast-redirect{} mode - * - * Returns : NULL if no URL was found, or - * the last URL found. - * - *********************************************************************/ -char *get_last_url(char *subject, const char *redirect_mode) -{ - char *new_url = NULL; - char *tmp; - - assert(subject); - assert(redirect_mode); - - subject = strdup(subject); - if (subject == NULL) - { - log_error(LOG_LEVEL_ERROR, "Out of memory while searching for redirects."); - return NULL; - } - - if (0 == strcmpic(redirect_mode, "check-decoded-url")) - { - log_error(LOG_LEVEL_REDIRECTS, "Decoding "%s" if necessary.", subject); - new_url = url_decode(subject); - if (new_url != NULL) - { - freez(subject); - subject = new_url; - } - else - { - log_error(LOG_LEVEL_ERROR, "Unable to decode "%s".", subject); - } - } - - log_error(LOG_LEVEL_REDIRECTS, "Checking "%s" for redirects.", subject); - - /* - * Find the last URL encoded in the request - */ - tmp = subject; - while ((tmp = strstr(tmp, "http://")) != NULL) - { - new_url = tmp++; - } - tmp = (new_url != NULL) ? new_url : subject; - while ((tmp = strstr(tmp, "https://")) != NULL) - { - new_url = tmp++; - } - - if ((new_url != NULL) - && ( (new_url != subject) - || (0 == strncmpic(subject, "http://", 7)) - || (0 == strncmpic(subject, "https://", 8)) - )) - { - /* - * Return new URL if we found a redirect - * or if the subject already was a URL. - * - * The second case makes sure that we can - * chain get_last_url after another redirection check - * (like rewrite_url) without losing earlier redirects. - */ - new_url = strdup(new_url); - freez(subject); - return new_url; - } - - freez(subject); - return NULL; - -} -#endif /* def FEATURE_FAST_REDIRECTS */ - - -/********************************************************************* - * - * Function : redirect_url - * - * Description : Checks if Privoxy should answer the request with - * a HTTP redirect and generates the redirect if - * necessary. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : NULL if the request can pass, HTTP redirect otherwise. - * - *********************************************************************/ -struct http_response *redirect_url(struct client_state *csp) -{ - struct http_response *rsp; -#ifdef FEATURE_FAST_REDIRECTS - /* - * XXX: Do we still need FEATURE_FAST_REDIRECTS - * as compile-time option? The user can easily disable - * it in his action file. - */ - char * redirect_mode; -#endif /* def FEATURE_FAST_REDIRECTS */ - char *old_url = NULL; - char *new_url = NULL; - char *redirection_string; - - if ((csp->action->flags & ACTION_REDIRECT)) - { - redirection_string = csp->action->string[ACTION_STRING_REDIRECT]; - - /* - * If the redirection string begins with 's', - * assume it's a pcrs command, otherwise treat it as - * properly formatted URL and use it for the redirection - * directly. - * - * According to RFC 2616 section 14.30 the URL - * has to be absolute and if the user tries: - * +redirect{shit/this/will/be/parsed/as/pcrs_command.html} - * she would get undefined results anyway. - * - */ - - if (*redirection_string == 's') - { - old_url = csp->http->url; - new_url = rewrite_url(old_url, redirection_string); - } - else - { - log_error(LOG_LEVEL_REDIRECTS, - "No pcrs command recognized, assuming that "%s" is already properly formatted.", - redirection_string); - new_url = strdup(redirection_string); - } - } - -#ifdef FEATURE_FAST_REDIRECTS - if ((csp->action->flags & ACTION_FAST_REDIRECTS)) - { - redirect_mode = csp->action->string[ACTION_STRING_FAST_REDIRECTS]; - - /* - * If it exists, use the previously rewritten URL as input - * otherwise just use the old path. - */ - old_url = (new_url != NULL) ? new_url : strdup(csp->http->path); - new_url = get_last_url(old_url, redirect_mode); - freez(old_url); - } - - /* - * Disable redirect checkers, so that they - * will be only run more than once if the user - * also enables them through tags. - * - * From a performance point of view - * it doesn't matter, but the duplicated - * log messages are annoying. - */ - csp->action->flags &= ~ACTION_FAST_REDIRECTS; -#endif /* def FEATURE_FAST_REDIRECTS */ - csp->action->flags &= ~ACTION_REDIRECT; - - /* Did any redirect action trigger? */ - if (new_url) - { - if (0 == strcmpic(new_url, csp->http->url)) - { - log_error(LOG_LEVEL_ERROR, - "New URL "%s" and old URL "%s" are the same. Redirection loop prevented.", - csp->http->url, new_url); - freez(new_url); - } - else - { - log_error(LOG_LEVEL_REDIRECTS, "New URL is: %s", new_url); - - if (NULL == (rsp = alloc_http_response())) - { - freez(new_url); - return cgi_error_memory(); - } - - if ( enlist_unique_header(rsp->headers, "Location", new_url) - || (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy"))) ) - { - freez(new_url); - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->reason = RSP_REASON_REDIRECTED; - freez(new_url); - - return finish_http_response(csp, rsp); - } - } - - /* Only reached if no redirect is required */ - return NULL; - -} - - -#ifdef FEATURE_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, and the browser - * is MSIE and not on a Mac, tell from the browser's accept - * header. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : True (nonzero) if URL is an image, false (0) - * otherwise - * - *********************************************************************/ -int is_imageurl(const struct client_state *csp) -{ -#ifdef FEATURE_IMAGE_DETECT_MSIE - char *tmp; - - tmp = get_header_value(csp->headers, "User-Agent:"); - if (tmp && strstr(tmp, "MSIE") && !strstr(tmp, "Mac_")) - { - 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); - } - } -#endif /* def FEATURE_IMAGE_DETECT_MSIE */ - - return ((csp->action->flags & ACTION_IMAGE) != 0); - -} -#endif /* def FEATURE_IMAGE_BLOCKING */ - - -#ifdef FEATURE_TRUST -/********************************************************************* - * - * Function : is_untrusted_url - * - * Description : Should we "distrust" this URL (and block it)? - * - * Yes if it matches a line in the trustfile, or if the - * referrer matches a line starting with "+" in the - * trustfile. - * No otherwise. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : 0 => trusted, 1 => untrusted - * - *********************************************************************/ -int is_untrusted_url(const struct client_state *csp) -{ - struct file_list *fl; - struct block_spec *b; - struct url_spec **trusted_url; - struct http_request rhttp[1]; - const char * referer; - jb_err err; - - /* - * If we don't have a trustlist, we trust everybody - */ - if (((fl = csp->tlist) == NULL) || ((b = fl->f) == 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)) - { - return b->reject; - } - } - - if (NULL == (referer = get_header_value(csp->headers, "Referer:"))) - { - /* no referrer was supplied */ - return 1; - } - - - /* - * If not, do we maybe trust its referrer? - */ - err = parse_http_url(referer, rhttp, REQUIRE_PROTOCOL); - if (err) - { - 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 0 (which means it's OK). - */ - - FILE *fp; - - if (NULL != (fp = fopen(csp->config->trustfile, "a"))) - { - 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)) - { - /* since this path points into a user's home space - * be sure to include this spec in the trustfile. - */ - long path_len = path_end - path; /* save offset */ - path = strdup(path); /* Copy string */ - if (path != NULL) - { - path_end = path + path_len; /* regenerate ptr to new buffer */ - *(path_end + 1) = '\0'; /* Truncate path after '/' */ - } - string_join(&new_entry, path); - } - - /* - * Give a reason for generating this entry. - */ - string_append(&new_entry, " # Trusted referrer was: "); - string_append(&new_entry, referer); - - if (new_entry != NULL) - { - if (-1 == fprintf(fp, "%s\n", new_entry)) - { - log_error(LOG_LEVEL_ERROR, "Failed to append '%s' to trustfile '%s': %E", - new_entry, csp->config->trustfile); - } - freez(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"); - } - - fclose(fp); - } - else - { - log_error(LOG_LEVEL_ERROR, "Failed to append new entry for '%s' to trustfile '%s': %E", - csp->http->hostport, csp->config->trustfile); - } - return 0; - } - } - - return 1; -} -#endif /* def FEATURE_TRUST */ - - -/********************************************************************* - * - * Function : pcrs_filter_response - * - * Description : Execute all text substitutions from all applying - * +filter actions on the text buffer that's been - * accumulated in csp->iob->buf. - * - * 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 - * - *********************************************************************/ -static char *pcrs_filter_response(struct client_state *csp) -{ - int hits=0; - size_t size, prev_size; - - char *old = NULL; - char *new = NULL; - pcrs_job *job; - - struct file_list *fl; - struct re_filterfile_spec *b; - struct list_entry *filtername; - - int i, found_filters = 0; - - /* - * Sanity first - */ - if (csp->iob->cur >= csp->iob->eod) - { - return(NULL); - } - - /* - * Need to check the set of re_filterfiles... - */ - for (i = 0; i < MAX_AF_FILES; i++) - { - fl = csp->rlist[i]; - if (NULL != fl) - { - if (NULL != fl->f) - { - found_filters = 1; - break; - } - } - } - - if (0 == found_filters) - { - log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: " - "content filtering enabled, but no content filters available."); - return(NULL); - } - - size = (size_t)(csp->iob->eod - csp->iob->cur); - old = csp->iob->cur; - - for (i = 0; i < MAX_AF_FILES; i++) - { - fl = csp->rlist[i]; - if ((NULL == fl) || (NULL == fl->f)) - { - /* - * Either there are no filter files - * left, or this filter file just - * contains no valid filters. - * - * Continue to be sure we don't miss - * valid filter files that are chained - * after empty or invalid ones. - */ - continue; - } - /* - * 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) - { - if (b->type != FT_CONTENT_FILTER) - { - /* Skip header filters */ - continue; - } - - for (filtername = csp->action->multi[ACTION_MULTI_FILTER]->first; - filtername ; filtername = filtername->next) - { - if (strcmp(b->name, filtername->str) == 0) - { - int current_hits = 0; /* Number of hits caused by this filter */ - int job_number = 0; /* Which job we're currently executing */ - int job_hits = 0; /* How many hits the current job caused */ - pcrs_job *joblist = b->joblist; - - if (b->dynamic) joblist = compile_dynamic_pcrs_job_list(csp, b); - - if (NULL == joblist) - { - log_error(LOG_LEVEL_RE_FILTER, "Filter %s has empty joblist. Nothing to do.", b->name); - continue; - } - - prev_size = size; - /* Apply all jobs from the joblist */ - for (job = joblist; NULL != job; job = job->next) - { - job_number++; - job_hits = pcrs_execute(job, old, size, &new, &size); - - if (job_hits >= 0) - { - /* - * That went well. Continue filtering - * and use the result of this job as - * input for the next one. - */ - current_hits += job_hits; - if (old != csp->iob->cur) - { - freez(old); - } - old = new; - } - else - { - /* - * This job caused an unexpected error. Inform the user - * and skip the rest of the jobs in this filter. We could - * continue with the next job, but usually the jobs - * depend on each other or are similar enough to - * fail for the same reason. - * - * At the moment our pcrs expects the error codes of pcre 3.4, - * but newer pcre versions can return additional error codes. - * As a result pcrs_strerror()'s error message might be - * "Unknown error ...", therefore we print the numerical value - * as well. - * - * XXX: Is this important enough for LOG_LEVEL_ERROR or - * should we use LOG_LEVEL_RE_FILTER instead? - */ - log_error(LOG_LEVEL_ERROR, "Skipped filter '%s' after job number %u: %s (%d)", - b->name, job_number, pcrs_strerror(job_hits), job_hits); - break; - } - } - - if (b->dynamic) pcrs_free_joblist(joblist); - - log_error(LOG_LEVEL_RE_FILTER, - "filtering %s%s (size %d) with '%s' produced %d hits (new size %d).", - csp->http->hostport, csp->http->path, prev_size, b->name, current_hits, size); - - hits += current_hits; - } - } - } - } - - /* - * If there were no hits, destroy our copy and let - * chat() use the original in csp->iob - */ - if (!hits) - { - freez(new); - return(NULL); - } - - csp->flags |= CSP_FLAG_MODIFIED; - csp->content_length = size; - IOB_RESET(csp); - - return(new); - -} - - -/********************************************************************* - * - * Function : gif_deanimate_response - * - * Description : Deanimate the GIF image that has been accumulated in - * csp->iob->buf, set csp->content_length to the modified - * size and raise the CSP_FLAG_MODIFIED flag. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : a pointer to the (newly allocated) modified buffer. - * or NULL in case something went wrong. - * - *********************************************************************/ -static char *gif_deanimate_response(struct client_state *csp) -{ - struct binbuffer *in, *out; - char *p; - size_t size; - - size = (size_t)(csp->iob->eod - csp->iob->cur); - - if ( (NULL == (in = (struct binbuffer *)zalloc(sizeof *in ))) - || (NULL == (out = (struct binbuffer *)zalloc(sizeof *out))) ) - { - log_error(LOG_LEVEL_DEANIMATE, "failed! (no mem)"); - return NULL; - } - - in->buffer = csp->iob->cur; - in->size = size; - - if (gif_deanimate(in, out, strncmp("last", csp->action->string[ACTION_STRING_DEANIMATE], 4))) - { - log_error(LOG_LEVEL_DEANIMATE, "failed! (gif parsing)"); - freez(in); - buf_free(out); - return(NULL); - } - else - { - if ((int)size == out->offset) - { - log_error(LOG_LEVEL_DEANIMATE, "GIF not changed."); - } - else - { - log_error(LOG_LEVEL_DEANIMATE, "Success! GIF shrunk from %d bytes to %d.", size, out->offset); - } - csp->content_length = out->offset; - csp->flags |= CSP_FLAG_MODIFIED; - p = out->buffer; - freez(in); - freez(out); - return(p); - } - -} - - -/********************************************************************* - * - * Function : get_filter_function - * - * Description : Decides which content filter function has - * to be applied (if any). - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : The content filter function to run, or - * NULL if no content filter is active - * - *********************************************************************/ -filter_function_ptr get_filter_function(struct client_state *csp) -{ - filter_function_ptr filter_function = NULL; - - /* - * Are we enabling text mode by force? - */ - if (csp->action->flags & ACTION_FORCE_TEXT_MODE) - { - /* - * Do we really have to? - */ - if (csp->content_type & CT_TEXT) - { - log_error(LOG_LEVEL_HEADER, "Text mode is already enabled."); - } - else - { - csp->content_type |= CT_TEXT; - log_error(LOG_LEVEL_HEADER, "Text mode enabled by force. Take cover!"); - } - } - - if (!(csp->content_type & CT_DECLARED)) - { - /* - * The server didn't bother to declare a MIME-Type. - * Assume it's text that can be filtered. - * - * This also regulary happens with 304 responses, - * therefore logging anything here would cause - * too much noise. - */ - csp->content_type |= CT_TEXT; - } - - /* - * Choose the applying filter function based on - * the content type and action settings. - */ - if ((csp->content_type & CT_TEXT) && - (csp->rlist != NULL) && - (!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER]))) - { - filter_function = pcrs_filter_response; - } - else if ((csp->content_type & CT_GIF) && - (csp->action->flags & ACTION_DEANIMATE)) - { - filter_function = gif_deanimate_response; - } - - return filter_function; -} - - -/********************************************************************* - * - * Function : remove_chunked_transfer_coding - * - * Description : In-situ remove the "chunked" transfer coding as defined - * in rfc2616 from a buffer. - * - * Parameters : - * 1 : buffer = Pointer to the text buffer - * 2 : size = In: Number of bytes to be processed, - * Out: Number of bytes after de-chunking. - * (undefined in case of errors) - * - * Returns : JB_ERR_OK for success, - * JB_ERR_PARSE otherwise - * - *********************************************************************/ -static jb_err remove_chunked_transfer_coding(char *buffer, size_t *size) -{ - size_t newsize = 0; - unsigned int chunksize = 0; - char *from_p, *to_p; - - assert(buffer); - from_p = to_p = buffer; - - if (sscanf(buffer, "%x", &chunksize) != 1) - { - log_error(LOG_LEVEL_ERROR, "Invalid first chunksize while stripping "chunked" transfer coding"); - return JB_ERR_PARSE; - } - - while (chunksize > 0U) - { - if (NULL == (from_p = strstr(from_p, "\r\n"))) - { - log_error(LOG_LEVEL_ERROR, "Parse error while stripping "chunked" transfer coding"); - return JB_ERR_PARSE; - } - - if ((newsize += chunksize) >= *size) - { - log_error(LOG_LEVEL_ERROR, - "Chunk size %d exceeds buffer size %d in "chunked" transfer coding", - chunksize, *size); - return JB_ERR_PARSE; - } - from_p += 2; - - memmove(to_p, from_p, (size_t) chunksize); - to_p = buffer + newsize; - from_p += chunksize + 2; - - if (sscanf(from_p, "%x", &chunksize) != 1) - { - log_error(LOG_LEVEL_INFO, "Invalid "chunked" transfer encoding detected and ignored."); - break; - } - } - - /* XXX: Should get its own loglevel. */ - log_error(LOG_LEVEL_RE_FILTER, "De-chunking successful. Shrunk from %d to %d", *size, newsize); - - *size = newsize; - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : prepare_for_filtering - * - * Description : If necessary, de-chunks and decompresses - * the content so it can get filterd. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK for success, - * JB_ERR_PARSE otherwise - * - *********************************************************************/ -static jb_err prepare_for_filtering(struct client_state *csp) -{ - jb_err err = JB_ERR_OK; - - /* - * If the body has a "chunked" transfer-encoding, - * get rid of it, adjusting size and iob->eod - */ - if (csp->flags & CSP_FLAG_CHUNKED) - { - size_t size = (size_t)(csp->iob->eod - csp->iob->cur); - - log_error(LOG_LEVEL_RE_FILTER, "Need to de-chunk first"); - err = remove_chunked_transfer_coding(csp->iob->cur, &size); - if (JB_ERR_OK == err) - { - csp->iob->eod = csp->iob->cur + size; - csp->flags |= CSP_FLAG_MODIFIED; - } - else - { - return JB_ERR_PARSE; - } - } - -#ifdef FEATURE_ZLIB - /* - * If the body has a supported transfer-encoding, - * decompress it, adjusting size and iob->eod. - */ - if (csp->content_type & (CT_GZIP|CT_DEFLATE)) - { - if (0 == csp->iob->eod - csp->iob->cur) - { - /* Nothing left after de-chunking. */ - return JB_ERR_OK; - } - - err = decompress_iob(csp); - - if (JB_ERR_OK == err) - { - csp->flags |= CSP_FLAG_MODIFIED; - csp->content_type &= ~CT_TABOO; - } - else - { - /* - * Unset CT_GZIP and CT_DEFLATE to remember not - * to modify the Content-Encoding header later. - */ - csp->content_type &= ~CT_GZIP; - csp->content_type &= ~CT_DEFLATE; - } - } -#endif - - return err; -} - - -/********************************************************************* - * - * Function : execute_content_filter - * - * Description : Executes a given content filter. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : content_filter = The filter function to execute - * - * Returns : Pointer to the modified buffer, or - * NULL if filtering failed or wasn't necessary. - * - *********************************************************************/ -char *execute_content_filter(struct client_state *csp, filter_function_ptr content_filter) -{ - if (0 == csp->iob->eod - csp->iob->cur) - { - /* - * No content (probably status code 301, 302 ...), - * no filtering necessary. - */ - return NULL; - } - - if (JB_ERR_OK != prepare_for_filtering(csp)) - { - /* - * failed to de-chunk or decompress. - */ - return NULL; - } - - if (0 == csp->iob->eod - csp->iob->cur) - { - /* - * Clown alarm: chunked and/or compressed nothing delivered. - */ - return NULL; - } - - return ((*content_filter)(csp)); -} - - -/********************************************************************* - * - * Function : get_url_actions - * - * Description : Gets the actions for this URL. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : http = http_request request for blocked URLs - * - * Returns : N/A - * - *********************************************************************/ -void get_url_actions(struct client_state *csp, struct http_request *http) -{ - struct file_list *fl; - struct url_actions *b; - int i; - - init_current_action(csp->action); - - for (i = 0; i < MAX_AF_FILES; i++) - { - if (((fl = csp->actions_list[i]) == NULL) || ((b = fl->f) == NULL)) - { - return; - } - - apply_url_actions(csp->action, http, b); - } - - return; -} - - -/********************************************************************* - * - * 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) -{ - if (b == NULL) - { - /* Should never happen */ - return; - } - - for (b = b->next; NULL != b; b = b->next) - { - if (url_match(b->url, http)) - { - merge_current_action(action, b->action); - } - } -} - - -/********************************************************************* - * - * Function : get_forward_override_settings - * - * Description : Returns forward settings as specified with the - * forward-override{} action. forward-override accepts - * forward lines similar to the one used in the - * configuration file, but without the URL pattern. - * - * For example: - * - * forward / . - * - * in the configuration file can be replaced with - * the action section: - * - * {+forward-override{forward .}} - * / - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : Pointer to forwarding structure in case of success. - * Invalid syntax is fatal. - * - *********************************************************************/ -const static struct forward_spec *get_forward_override_settings(struct client_state *csp) -{ - const char *forward_override_line = csp->action->string[ACTION_STRING_FORWARD_OVERRIDE]; - char forward_settings[BUFFER_SIZE]; - char *http_parent = NULL; - /* variable names were chosen for consistency reasons. */ - struct forward_spec *fwd = NULL; - int vec_count; - char *vec[3]; - - assert(csp->action->flags & ACTION_FORWARD_OVERRIDE); - /* Should be enforced by load_one_actions_file() */ - assert(strlen(forward_override_line) < sizeof(forward_settings) - 1); - - /* Create a copy ssplit can modify */ - strlcpy(forward_settings, forward_override_line, sizeof(forward_settings)); - - if (NULL != csp->fwd) - { - /* - * XXX: Currently necessary to prevent memory - * leaks when the show-url-info cgi page is visited. - */ - unload_forward_spec(csp->fwd); - } - - /* - * allocate a new forward node, valid only for - * the lifetime of this request. Save its location - * in csp as well, so sweep() can free it later on. - */ - fwd = csp->fwd = zalloc(sizeof(*fwd)); - if (NULL == fwd) - { - log_error(LOG_LEVEL_FATAL, - "can't allocate memory for forward-override{%s}", forward_override_line); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - return NULL; - } - - vec_count = ssplit(forward_settings, " \t", vec, SZ(vec), 1, 1); - if ((vec_count == 2) && !strcasecmp(vec[0], "forward")) - { - fwd->type = SOCKS_NONE; - - /* Parse the parent HTTP proxy host:port */ - http_parent = vec[1]; - - } - else if (vec_count == 3) - { - char *socks_proxy = NULL; - - if (!strcasecmp(vec[0], "forward-socks4")) - { - fwd->type = SOCKS_4; - socks_proxy = vec[1]; - } - else if (!strcasecmp(vec[0], "forward-socks4a")) - { - fwd->type = SOCKS_4A; - socks_proxy = vec[1]; - } - else if (!strcasecmp(vec[0], "forward-socks5")) - { - fwd->type = SOCKS_5; - socks_proxy = vec[1]; - } - - if (NULL != socks_proxy) - { - /* Parse the SOCKS proxy host[:port] */ - fwd->gateway_host = strdup(socks_proxy); - - if (NULL != (socks_proxy = strchr(fwd->gateway_host, ':'))) - { - *socks_proxy++ = '\0'; - fwd->gateway_port = (int)strtol(socks_proxy, NULL, 0); - } - - if (fwd->gateway_port <= 0) - { - fwd->gateway_port = 1080; - } - - http_parent = vec[2]; - } - } - - if (NULL == http_parent) - { - log_error(LOG_LEVEL_FATAL, - "Invalid forward-override syntax in: %s", forward_override_line); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - - /* Parse http forwarding settings */ - if (strcmp(http_parent, ".") != 0) - { - fwd->forward_host = strdup(http_parent); - - if (NULL != (http_parent = strchr(fwd->forward_host, ':'))) - { - *http_parent++ = '\0'; - fwd->forward_port = (int)strtol(http_parent, NULL, 0); - } - - if (fwd->forward_port <= 0) - { - fwd->forward_port = 8000; - } - } - - assert (NULL != fwd); - - log_error(LOG_LEVEL_CONNECT, - "Overriding forwarding settings based on '%s'", forward_override_line); - - return fwd; -} - - -/********************************************************************* - * - * Function : forward_url - * - * Description : Should we forward this to another proxy? - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : http = http_request request for current URL - * - * Returns : Pointer to forwarding information. - * - *********************************************************************/ -const struct forward_spec *forward_url(struct client_state *csp, - const struct http_request *http) -{ - static const struct forward_spec fwd_default[1] = { FORWARD_SPEC_INITIALIZER }; - struct forward_spec *fwd = csp->config->forward; - - if (csp->action->flags & ACTION_FORWARD_OVERRIDE) - { - return get_forward_override_settings(csp); - } - - if (fwd == NULL) - { - return fwd_default; - } - - while (fwd != NULL) - { - if (url_match(fwd->url, http)) - { - return fwd; - } - fwd = fwd->next; - } - - return fwd_default; -} - - -/********************************************************************* - * - * Function : direct_response - * - * Description : Check if Max-Forwards == 0 for an OPTIONS or TRACE - * request and if so, return a HTTP 501 to the client. - * - * FIXME: I have a stupid name and I should handle the - * requests properly. Still, what we do here is rfc- - * compliant, whereas ignoring or forwarding are not. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : http_response if , NULL if nonmatch or handler fail - * - *********************************************************************/ -struct http_response *direct_response(struct client_state *csp) -{ - struct http_response *rsp; - struct list_entry *p; - - if ((0 == strcmpic(csp->http->gpc, "trace")) - || (0 == strcmpic(csp->http->gpc, "options"))) - { - for (p = csp->headers->first; (p != NULL) ; p = p->next) - { - if (!strncmpic("Max-Forwards:", p->str, 13)) - { - unsigned int max_forwards; - - /* - * If it's a Max-Forwards value of zero, - * we have to intercept the request. - */ - if (1 == sscanf(p->str+12, ": %u", &max_forwards) && max_forwards == 0) - { - /* - * FIXME: We could handle at least TRACE here, - * but that would require a verbatim copy of - * the request which we don't have anymore - */ - log_error(LOG_LEVEL_HEADER, - "Detected header '%s' in OPTIONS or TRACE request. Returning 501.", - p->str); - - /* Get mem for response or fail*/ - if (NULL == (rsp = alloc_http_response())) - { - return cgi_error_memory(); - } - - if (NULL == (rsp->status = strdup("501 Not Implemented"))) - { - free_http_response(rsp); - return cgi_error_memory(); - } - - rsp->is_static = 1; - rsp->reason = RSP_REASON_UNSUPPORTED; - - return(finish_http_response(csp, rsp)); - } - } - } - } - return NULL; -} - - -/********************************************************************* - * - * Function : content_filters_enabled - * - * Description : Checks whether there are any content filters - * enabled for the current request. - * - * Parameters : - * 1 : action = Action spec to check. - * - * Returns : TRUE for yes, FALSE otherwise - * - *********************************************************************/ -int content_filters_enabled(const struct current_action_spec *action) -{ - return ((action->flags & ACTION_DEANIMATE) || - !list_is_empty(action->multi[ACTION_MULTI_FILTER])); -} - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/filters.h b/external/privoxy/filters.h deleted file mode 100644 index 66794e1..0000000 --- a/external/privoxy/filters.h +++ /dev/null @@ -1,382 +0,0 @@ -#ifndef FILTERS_H_INCLUDED -#define FILTERS_H_INCLUDED -#define FILTERS_H_VERSION "$Id: filters.h,v 1.36 2008/05/21 15:35:08 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/filters.h,v $ - * - * Purpose : Declares functions to parse/crunch headers and pages. - * Functions declared include: - * `acl_addr', `add_stats', `block_acl', `block_imageurl', - * `block_url', `url_actions', `filter_popups', `forward_url' - * `ij_untrusted_url', `intercept_url', `re_process_buffer', - * `show_proxy_args', and `trust_url' - * - * Copyright : Written by and Copyright (C) 2001, 2004 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: filters.h,v $ - * Revision 1.36 2008/05/21 15:35:08 fabiankeil - * - Mark csp as immutable for block_acl(). - * - Remove an obsolete complaint about filter_popups(). - * - * Revision 1.35 2008/05/03 16:40:45 fabiankeil - * Change content_filters_enabled()'s parameter from - * csp->action to action so it can be also used in the - * CGI code. Don't bother checking if there are filters - * loaded, as that's somewhat besides the point. - * - * Revision 1.34 2008/03/02 12:25:25 fabiankeil - * Also use shiny new connect_port_is_forbidden() in jcc.c. - * - * Revision 1.33 2008/02/23 16:57:12 fabiankeil - * Rename url_actions() to get_url_actions() and let it - * use the standard parameter ordering. - * - * Revision 1.32 2008/02/23 16:33:43 fabiankeil - * Let forward_url() use the standard parameter ordering - * and mark its second parameter immutable. - * - * Revision 1.31 2007/10/19 16:53:28 fabiankeil - * Add helper function to check if any content filters are enabled. - * - * Revision 1.30 2007/09/29 10:21:16 fabiankeil - * - Move get_filter_function() from jcc.c to filters.c - * so the filter functions can be static. - * - Don't bother filtering body-less responses. - * - * Revision 1.29 2007/09/28 16:38:55 fabiankeil - * - Execute content filters through execute_content_filter(). - * - Add prepare_for_filtering() so filter functions don't have to - * care about de-chunking and decompression. As a side effect this enables - * decompression for gif_deanimate_response() and jpeg_inspect_response(). - * - Change remove_chunked_transfer_coding()'s return type to jb_err. - * Some clowns feel like chunking empty responses in which case - * (size == 0) is valid but previously would be interpreted as error. - * - * Revision 1.28 2007/09/02 15:31:20 fabiankeil - * Move match_portlist() from filter.c to urlmatch.c. - * It's used for url matching, not for filtering. - * - * Revision 1.27 2007/04/30 15:02:18 fabiankeil - * Introduce dynamic pcrs jobs that can resolve variables. - * - * Revision 1.26 2007/03/13 11:28:43 fabiankeil - * - Fix port handling in acl_addr() and use a temporary acl spec - * copy so error messages don't contain a truncated version. - * - Log size of iob before and after decompression. - * - * Revision 1.25 2007/01/12 15:36:44 fabiankeil - * Mark *csp as immutable for is_untrusted_url() - * and is_imageurl(). Closes FR 1237736. - * - * Revision 1.24 2006/12/29 18:30:46 fabiankeil - * Fixed gcc43 conversion warnings, - * changed sprintf calls to snprintf. - * - * Revision 1.23 2006/11/28 15:19:43 fabiankeil - * Implemented +redirect{s@foo@bar@} to generate - * a redirect based on a rewritten version of the - * original URL. - * - * Revision 1.22 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.20.2.2 2004/10/03 12:53:32 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.20.2.1 2002/09/25 14:51:51 oes - * Added basic support for OPTIONS and TRACE HTTP methods: - * New function direct_response which handles OPTIONS and - * TRACE requests whose Max-Forwards header field is zero. - * - * Revision 1.20 2002/04/02 14:56:16 oes - * Bugfix: is_untrusted_url() and trust_url() now depend on FEATURE_TRUST, not FEATURE_COOKIE_JAR - * - * Revision 1.19 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.8 2001/06/03 19:12:00 oes - * extracted-CGI relevant stuff - * - * Revision 1.7 2001/05/31 21:21:30 jongfoster - * Permissionsfile / actions file changes: - * - Changed "permission" to "action" throughout - * - changes to file format to allow string parameters - * - Moved helper functions to actions.c - * - * Revision 1.6 2001/05/29 09:50:24 jongfoster - * Unified blocklist/imagelist/permissionslist. - * File format is still under discussion, but the internal changes - * are (mostly) done. - * - * 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.5 2001/05/27 22:17:04 oes - * - * - re_process_buffer no longer writes the modified buffer - * to the client, which was very ugly. It now returns the - * buffer, which it is then written by chat. - * - * - content_length now adjusts the Content-Length: header - * for modified documents rather than crunch()ing it. - * (Length info in csp->content_length, which is 0 for - * unmodified documents) - * - * - For this to work, sed() is called twice when filtering. - * - * Revision 1.4 2001/05/26 15:26:15 jongfoster - * ACL feature now provides more security by immediately dropping - * connections from untrusted hosts. - * - * Revision 1.3 2001/05/22 18:46:04 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.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:52 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -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 -extern int block_acl(const struct access_control_addr *dst, const struct client_state *csp); -extern int acl_addr(const char *aspec, struct access_control_addr *aca); -#endif /* def FEATURE_ACL */ - -/* - * Interceptors - */ -extern struct http_response *block_url(struct client_state *csp); -extern struct http_response *redirect_url(struct client_state *csp); -#ifdef FEATURE_TRUST -extern struct http_response *trust_url(struct client_state *csp); -#endif /* def FEATURE_TRUST */ - -/* - * Request inspectors - */ -#ifdef FEATURE_TRUST -extern int is_untrusted_url(const struct client_state *csp); -#endif /* def FEATURE_TRUST */ -#ifdef FEATURE_IMAGE_BLOCKING -extern int is_imageurl(const struct client_state *csp); -#endif /* def FEATURE_IMAGE_BLOCKING */ -extern int connect_port_is_forbidden(const struct client_state *csp); - -/* - * Determining applicable actions - */ -extern void get_url_actions(struct client_state *csp, - struct http_request *http); -extern void apply_url_actions(struct current_action_spec *action, - struct http_request *http, - struct url_actions *b); -/* - * Determining parent proxies - */ -extern const struct forward_spec *forward_url(struct client_state *csp, - const struct http_request *http); - -/* - * Content modification - */ - -typedef char *(*filter_function_ptr)(); -extern char *execute_content_filter(struct client_state *csp, filter_function_ptr content_filter); - -extern filter_function_ptr get_filter_function(struct client_state *csp); -extern char *execute_single_pcrs_command(char *subject, const char *pcrs_command, int *hits); -extern char *rewrite_url(char *old_url, const char *pcrs_command); -extern char *get_last_url(char *subject, const char *redirect_mode); - -extern pcrs_job *compile_dynamic_pcrs_job_list(const struct client_state *csp, const struct re_filterfile_spec *b); - -extern int content_filters_enabled(const struct current_action_spec *action); - -/* - * Handling Max-Forwards: - */ -extern struct http_response *direct_response(struct client_state *csp); - - -/* - * Solaris fix: - */ -#ifndef INADDR_NONE -#define INADDR_NONE -1 -#endif - -/* - * Revision control strings from this header and associated .c file - */ -extern const char filters_rcs[]; -extern const char filters_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef FILTERS_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/gateway.c b/external/privoxy/gateway.c deleted file mode 100644 index 1e4ffd0..0000000 --- a/external/privoxy/gateway.c +++ /dev/null @@ -1,1379 +0,0 @@ -const char gateway_rcs[] = "$Id: gateway.c,v 1.48 2009/02/13 17:20:36 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/gateway.c,v $ - * - * Purpose : Contains functions to connect to a server, possibly - * using a "forwarder" (i.e. HTTP proxy and/or a SOCKS4 - * or SOCKS5 proxy). - * - * Copyright : Written by and Copyright (C) 2001-2009 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: gateway.c,v $ - * Revision 1.48 2009/02/13 17:20:36 fabiankeil - * Reword keep-alive support warning and only show - * it #if !defined(HAVE_POLL) && !defined(_WIN32). - * - * Revision 1.47 2008/12/24 17:06:19 fabiankeil - * Keep a thread around to timeout alive connections - * even if no new requests are coming in. - * - * Revision 1.46 2008/12/13 11:07:23 fabiankeil - * Remove duplicated debugging checks - * in connection_destination_matches(). - * - * Revision 1.45 2008/12/04 18:17:07 fabiankeil - * Fix some cparser warnings. - * - * Revision 1.44 2008/11/22 11:54:04 fabiankeil - * Move log message around to include the socket number. - * - * Revision 1.43 2008/11/13 09:15:51 fabiankeil - * Make keep_alive_timeout static. - * - * Revision 1.42 2008/11/13 09:08:42 fabiankeil - * Add new config option: keep-alive-timeout. - * - * Revision 1.41 2008/11/08 15:29:58 fabiankeil - * Unify two debug messages. - * - * Revision 1.40 2008/11/08 15:14:05 fabiankeil - * Fix duplicated debugging check. - * - * Revision 1.39 2008/10/25 11:33:01 fabiankeil - * Remove already out-commented line left over from debugging. - * - * Revision 1.38 2008/10/24 17:33:00 fabiankeil - * - Tone the "keep-alive support is experimental" warning - * down a bit as hackish 0-chunk detection has been - * implemented recently. - * - Only show the "ndef HAVE_POLL" warning once on start-up. - * - * Revision 1.37 2008/10/23 17:40:53 fabiankeil - * Fix forget_connection() and mark_connection_unused(), - * which would both under certain circumstances access - * reusable_connection[MAX_REUSABLE_CONNECTIONS]. Oops. - * - * Revision 1.36 2008/10/18 19:49:15 fabiankeil - * - Factor close_unusable_connections() out of - * get_reusable_connection() to make sure we really check - * all the remembered connections, not just the ones before - * the next reusable one. - * - Plug two file descriptor leaks. Internally marking - * connections as closed doesn't cut it. - * - * Revision 1.35 2008/10/17 17:12:01 fabiankeil - * In socket_is_still_usable(), use select() - * and FD_ISSET() if poll() isn't available. - * - * Revision 1.34 2008/10/17 17:07:13 fabiankeil - * Add preliminary timeout support. - * - * Revision 1.33 2008/10/16 16:34:21 fabiankeil - * Fix two gcc44 warnings. - * - * Revision 1.32 2008/10/16 16:27:22 fabiankeil - * Fix compiler warning. - * - * Revision 1.31 2008/10/16 07:31:11 fabiankeil - * - Factor socket_is_still_usable() out of get_reusable_connection(). - * - If poll() isn't available, show a warning and assume the socket - * is still usable. - * - * Revision 1.30 2008/10/13 17:31:03 fabiankeil - * If a remembered connection is no longer usable and - * has been marked closed, don't bother checking if the - * destination matches. - * - * Revision 1.29 2008/10/11 16:59:41 fabiankeil - * Add missing dots for two log messages. - * - * Revision 1.28 2008/10/09 18:21:41 fabiankeil - * Flush work-in-progress changes to keep outgoing connections - * alive where possible. Incomplete and mostly #ifdef'd out. - * - * Revision 1.27 2008/09/27 15:05:51 fabiankeil - * Return only once in forwarded_connect(). - * - * Revision 1.26 2008/08/18 17:42:06 fabiankeil - * Fix typo in macro name. - * - * Revision 1.25 2008/02/07 18:09:46 fabiankeil - * In socks5_connect: - * - make the buffers quite a bit smaller. - * - properly report "socks5 server unreachable" failures. - * - let strncpy() use the whole buffer. Using a length of 0xffu wasn't actually - * wrong, but requires too much thinking as it doesn't depend on the buffer size. - * - log a message if the socks5 server sends more data than expected. - * - add some assertions and comments. - * - * Revision 1.24 2008/02/04 14:56:29 fabiankeil - * - Fix a compiler warning. - * - Stop assuming that htonl(INADDR_NONE) equals INADDR_NONE. - * - * Revision 1.23 2008/02/04 13:11:35 fabiankeil - * Remember the cause of the SOCKS5 error for the CGI message. - * - * Revision 1.22 2008/02/03 13:46:15 fabiankeil - * Add SOCKS5 support. Patch #1862863 by Eric M. Hopper with minor changes. - * - * Revision 1.21 2007/07/28 12:30:03 fabiankeil - * Modified patch from Song Weijia (#1762559) to - * fix socks requests on big-endian platforms. - * - * Revision 1.20 2007/05/14 10:23:48 fabiankeil - * - Use strlcpy() instead of strcpy(). - * - Use the same buffer for socks requests and socks responses. - * - Fix bogus warning about web_server_addr being used uninitialized. - * - * Revision 1.19 2007/01/25 14:09:45 fabiankeil - * - Save errors in socks4_connect() to csp->error_message. - * - Silence some gcc43 warnings, hopefully the right way. - * - * Revision 1.18 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.16 2002/05/12 21:36:29 jongfoster - * Correcting function comments - * - * Revision 1.15 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.14 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.13 2002/03/13 00:29:59 jongfoster - * Killing warnings - * - * Revision 1.12 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.11 2002/03/08 17:46:04 jongfoster - * Fixing int/size_t warnings - * - * Revision 1.10 2002/03/07 03:50:19 oes - * - Improved handling of failed DNS lookups - * - Fixed compiler warnings - * - * Revision 1.9 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.8 2001/09/13 20:10:12 jongfoster - * Fixing missing #include under Windows - * - * Revision 1.7 2001/09/12 17:58:26 steudten - * - * add #include <string.h> - * - * Revision 1.6 2001/09/10 10:41:16 oes - * Added #include in.h - * - * Revision 1.5 2001/07/29 18:47:57 jongfoster - * Adding missing #include project.h - * - * Revision 1.4 2001/07/24 12:47:06 oes - * Applied BeOS support update by Eugenia - * - * Revision 1.3 2001/06/09 10:55:28 jongfoster - * Changing BUFSIZ ==> BUFFER_SIZE - * - * Revision 1.2 2001/06/07 23:11:38 jongfoster - * Removing gateways[] list - no longer used. - * Replacing function pointer in struct gateway with a directly - * 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 - * Fixing bug with SOCKS4A and HTTP proxy server in combination. - * It was a bug which led to the connection being made to the web - * server rather than the HTTP proxy, and also a buffer overrun. - * - * Revision 1.1.1.1 2001/05/15 13:58:54 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> - -#ifndef _WIN32 -#include <netinet/in.h> -#endif - -#include <errno.h> -#include <string.h> -#include "assert.h" - -#ifdef _WIN32 -#include <winsock2.h> -#endif /* def _WIN32 */ - -#ifdef __BEOS__ -#include <netdb.h> -#endif /* def __BEOS__ */ - -#ifdef __OS2__ -#include <utils.h> -#endif /* def __OS2__ */ - -#include "project.h" -#include "jcc.h" -#include "errlog.h" -#include "jbsockets.h" -#include "gateway.h" -#include "miscutil.h" -#ifdef FEATURE_CONNECTION_KEEP_ALIVE -#ifdef HAVE_POLL -#ifdef __GLIBC__ -#include <sys/poll.h> -#else -#include <poll.h> -#endif /* def __GLIBC__ */ -#endif /* HAVE_POLL */ -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - -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 jb_socket socks5_connect(const struct forward_spec *fwd, - const char *target_host, - int target_port, - struct client_state *csp); - - -#define SOCKS_REQUEST_GRANTED 90 -#define SOCKS_REQUEST_REJECT 91 -#define SOCKS_REQUEST_IDENT_FAILED 92 -#define SOCKS_REQUEST_IDENT_CONFLICT 93 - -#define SOCKS5_REQUEST_GRANTED 0 -#define SOCKS5_REQUEST_FAILED 1 -#define SOCKS5_REQUEST_DENIED 2 -#define SOCKS5_REQUEST_NETWORK_UNREACHABLE 3 -#define SOCKS5_REQUEST_HOST_UNREACHABLE 4 -#define SOCKS5_REQUEST_CONNECTION_REFUSED 5 -#define SOCKS5_REQUEST_TTL_EXPIRED 6 -#define SOCKS5_REQUEST_PROTOCOL_ERROR 7 -#define SOCKS5_REQUEST_BAD_ADDRESS_TYPE 8 - -/* structure of a socks client operation */ -struct socks_op { - unsigned char vn; /* socks version number */ - unsigned char cd; /* command code */ - unsigned char dstport[2]; /* destination port */ - unsigned char dstip[4]; /* destination address */ - char userid; /* first byte of userid */ - char padding[3]; /* make sure sizeof(struct socks_op) is endian-independent. */ - /* more bytes of the userid follow, terminated by a NULL */ -}; - -/* structure of a socks server reply */ -struct socks_reply { - unsigned char vn; /* socks version number */ - unsigned char cd; /* command code */ - unsigned char dstport[2]; /* destination port */ - unsigned char dstip[4]; /* destination address */ -}; - -static const char socks_userid[] = "anonymous"; - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - -#define MAX_REUSABLE_CONNECTIONS 100 -static int keep_alive_timeout = DEFAULT_KEEP_ALIVE_TIMEOUT; - -struct reusable_connection -{ - jb_socket sfd; - int in_use; - char *host; - int port; - time_t timestamp; - - int forwarder_type; - char *gateway_host; - int gateway_port; - char *forward_host; - int forward_port; -}; - -static struct reusable_connection reusable_connection[MAX_REUSABLE_CONNECTIONS]; - -static int mark_connection_unused(jb_socket sfd); -static void mark_connection_closed(struct reusable_connection *closed_connection); -static int socket_is_still_usable(jb_socket sfd); - - -/********************************************************************* - * - * Function : initialize_reusable_connections - * - * Description : Initializes the reusable_connection structures. - * Must be called with connection_reuse_mutex locked. - * - * Parameters : N/A - * - * Returns : void - * - *********************************************************************/ -extern void initialize_reusable_connections(void) -{ - unsigned int slot = 0; - -#if !defined(HAVE_POLL) && !defined(_WIN32) - log_error(LOG_LEVEL_INFO, - "Detecting already dead connections might not work " - "correctly on your platform. In case of problems, " - "unset the keep-alive-timeout option."); -#endif - - for (slot = 0; slot < SZ(reusable_connection); slot++) - { - mark_connection_closed(&reusable_connection[slot]); - } - - log_error(LOG_LEVEL_CONNECT, "Initialized %d socket slots.", slot); -} - - -/********************************************************************* - * - * Function : remember_connection - * - * Description : Remembers a connection for reuse later on. - * - * Parameters : - * 1 : sfd = Open socket to remember. - * 2 : http = The destination for the connection. - * 3 : fwd = The forwarder settings used. - * - * Returns : void - * - *********************************************************************/ -void remember_connection(jb_socket sfd, const struct http_request *http, - const struct forward_spec *fwd) -{ - unsigned int slot = 0; - int free_slot_found = FALSE; - - assert(sfd != JB_INVALID_SOCKET); - - if (mark_connection_unused(sfd)) - { - return; - } - - privoxy_mutex_lock(&connection_reuse_mutex); - - /* Find free socket slot. */ - for (slot = 0; slot < SZ(reusable_connection); slot++) - { - if (reusable_connection[slot].sfd == JB_INVALID_SOCKET) - { - assert(reusable_connection[slot].in_use == 0); - log_error(LOG_LEVEL_CONNECT, - "Remembering socket %d for %s:%d in slot %d.", - sfd, http->host, http->port, slot); - free_slot_found = TRUE; - break; - } - } - - if (!free_slot_found) - { - log_error(LOG_LEVEL_CONNECT, - "No free slots found to remembering socket for %s:%d. Last slot %d.", - http->host, http->port, slot); - privoxy_mutex_unlock(&connection_reuse_mutex); - close_socket(sfd); - return; - } - - assert(NULL != http->host); - reusable_connection[slot].host = strdup(http->host); - if (NULL == reusable_connection[slot].host) - { - log_error(LOG_LEVEL_FATAL, "Out of memory saving socket."); - } - reusable_connection[slot].sfd = sfd; - reusable_connection[slot].port = http->port; - reusable_connection[slot].in_use = 0; - reusable_connection[slot].timestamp = time(NULL); - - assert(NULL != fwd); - assert(reusable_connection[slot].gateway_host == NULL); - assert(reusable_connection[slot].gateway_port == 0); - assert(reusable_connection[slot].forwarder_type == SOCKS_NONE); - assert(reusable_connection[slot].forward_host == NULL); - assert(reusable_connection[slot].forward_port == 0); - - reusable_connection[slot].forwarder_type = fwd->type; - if (NULL != fwd->gateway_host) - { - reusable_connection[slot].gateway_host = strdup(fwd->gateway_host); - if (NULL == reusable_connection[slot].gateway_host) - { - log_error(LOG_LEVEL_FATAL, "Out of memory saving gateway_host."); - } - } - else - { - reusable_connection[slot].gateway_host = NULL; - } - reusable_connection[slot].gateway_port = fwd->gateway_port; - - if (NULL != fwd->forward_host) - { - reusable_connection[slot].forward_host = strdup(fwd->forward_host); - if (NULL == reusable_connection[slot].forward_host) - { - log_error(LOG_LEVEL_FATAL, "Out of memory saving forward_host."); - } - } - else - { - reusable_connection[slot].forward_host = NULL; - } - reusable_connection[slot].forward_port = fwd->forward_port; - - privoxy_mutex_unlock(&connection_reuse_mutex); -} - - -/********************************************************************* - * - * Function : mark_connection_closed - * - * Description : Marks a reused connection closed. - * Must be called with connection_reuse_mutex locked. - * - * Parameters : - * 1 : closed_connection = The connection to mark as closed. - * - * Returns : void - * - *********************************************************************/ -static void mark_connection_closed(struct reusable_connection *closed_connection) -{ - closed_connection->in_use = FALSE; - closed_connection->sfd = JB_INVALID_SOCKET; - freez(closed_connection->host); - closed_connection->port = 0; - closed_connection->timestamp = 0; - closed_connection->forwarder_type = SOCKS_NONE; - freez(closed_connection->gateway_host); - closed_connection->gateway_port = 0; - freez(closed_connection->forward_host); - closed_connection->forward_port = 0; -} - - -/********************************************************************* - * - * Function : forget_connection - * - * Description : Removes a previously remembered connection from - * the list of reusable connections. - * - * Parameters : - * 1 : sfd = The socket belonging to the connection in question. - * - * Returns : void - * - *********************************************************************/ -void forget_connection(jb_socket sfd) -{ - unsigned int slot = 0; - - assert(sfd != JB_INVALID_SOCKET); - - privoxy_mutex_lock(&connection_reuse_mutex); - - for (slot = 0; slot < SZ(reusable_connection); slot++) - { - if (reusable_connection[slot].sfd == sfd) - { - assert(reusable_connection[slot].in_use); - - log_error(LOG_LEVEL_CONNECT, - "Forgetting socket %d for %s:%d in slot %d.", - sfd, reusable_connection[slot].host, - reusable_connection[slot].port, slot); - mark_connection_closed(&reusable_connection[slot]); - privoxy_mutex_unlock(&connection_reuse_mutex); - - return; - } - } - - log_error(LOG_LEVEL_CONNECT, - "Socket %d already forgotten or never remembered.", sfd); - - privoxy_mutex_unlock(&connection_reuse_mutex); -} - - -/********************************************************************* - * - * Function : connection_destination_matches - * - * Description : Determines whether a remembered connection can - * be reused. That is, whether the destination and - * the forwarding settings match. - * - * Parameters : - * 1 : connection = The connection to check. - * 2 : http = The destination for the connection. - * 3 : fwd = The forwarder settings. - * - * Returns : TRUE for yes, FALSE otherwise. - * - *********************************************************************/ -static int connection_destination_matches(const struct reusable_connection *connection, - const struct http_request *http, - const struct forward_spec *fwd) -{ - if ((connection->forwarder_type != fwd->type) - || (connection->gateway_port != fwd->gateway_port) - || (connection->forward_port != fwd->forward_port) - || (connection->port != http->port)) - { - return FALSE; - } - - if (( (NULL != connection->gateway_host) - && (NULL != fwd->gateway_host) - && strcmpic(connection->gateway_host, fwd->gateway_host)) - && (connection->gateway_host != fwd->gateway_host)) - { - log_error(LOG_LEVEL_CONNECT, "Gateway mismatch."); - return FALSE; - } - - if (( (NULL != connection->forward_host) - && (NULL != fwd->forward_host) - && strcmpic(connection->forward_host, fwd->forward_host)) - && (connection->forward_host != fwd->forward_host)) - { - log_error(LOG_LEVEL_CONNECT, "Forwarding proxy mismatch."); - return FALSE; - } - - return (!strcmpic(connection->host, http->host)); - -} - - -/********************************************************************* - * - * Function : close_unusable_connections - * - * Description : Closes remembered connections that have timed - * out or have been closed on the other side. - * - * Parameters : none - * - * Returns : Number of connections that are still alive. - * - *********************************************************************/ -int close_unusable_connections(void) -{ - unsigned int slot = 0; - int connections_alive = 0; - - privoxy_mutex_lock(&connection_reuse_mutex); - - for (slot = 0; slot < SZ(reusable_connection); slot++) - { - if (!reusable_connection[slot].in_use - && (JB_INVALID_SOCKET != reusable_connection[slot].sfd)) - { - time_t time_open = time(NULL) - reusable_connection[slot].timestamp; - - if (keep_alive_timeout < time_open) - { - log_error(LOG_LEVEL_CONNECT, - "The connection to %s:%d in slot %d timed out. " - "Closing socket %d. Timeout is: %d.", - reusable_connection[slot].host, - reusable_connection[slot].port, slot, - reusable_connection[slot].sfd, keep_alive_timeout); - close_socket(reusable_connection[slot].sfd); - mark_connection_closed(&reusable_connection[slot]); - } - else if (!socket_is_still_usable(reusable_connection[slot].sfd)) - { - log_error(LOG_LEVEL_CONNECT, - "The connection to %s:%d in slot %d is no longer usable. " - "Closing socket %d.", reusable_connection[slot].host, - reusable_connection[slot].port, slot, - reusable_connection[slot].sfd); - close_socket(reusable_connection[slot].sfd); - mark_connection_closed(&reusable_connection[slot]); - } - else - { - connections_alive++; - } - } - } - - privoxy_mutex_unlock(&connection_reuse_mutex); - - return connections_alive; - -} - - -/********************************************************************* - * - * Function : socket_is_still_usable - * - * Description : Decides whether or not an open socket is still usable. - * - * Parameters : - * 1 : sfd = The socket to check. - * - * Returns : TRUE for yes, otherwise FALSE. - * - *********************************************************************/ -static int socket_is_still_usable(jb_socket sfd) -{ -#ifdef HAVE_POLL - int poll_result; - struct pollfd poll_fd[1]; - - memset(poll_fd, 0, sizeof(poll_fd)); - poll_fd[0].fd = sfd; - poll_fd[0].events = POLLIN; - - poll_result = poll(poll_fd, 1, 0); - - if (-1 != poll_result) - { - return !(poll_fd[0].revents & POLLIN); - } - else - { - log_error(LOG_LEVEL_CONNECT, "Polling socket %d failed.", sfd); - return FALSE; - } -#else - fd_set readable_fds; - struct timeval timeout; - int ret; - int socket_is_alive = 0; - - memset(&timeout, '\0', sizeof(timeout)); - FD_ZERO(&readable_fds); - FD_SET(sfd, &readable_fds); - - ret = select((int)sfd+1, &readable_fds, NULL, NULL, &timeout); - if (ret < 0) - { - log_error(LOG_LEVEL_ERROR, "select() failed!: %E"); - } - - /* - * XXX: I'm not sure why !FD_ISSET() works, - * but apparently it does. - */ - socket_is_alive = !FD_ISSET(sfd, &readable_fds); - - return socket_is_alive; -#endif /* def HAVE_POLL */ -} - - -/********************************************************************* - * - * Function : get_reusable_connection - * - * Description : Returns an open socket to a previously remembered - * open connection (if there is one). - * - * Parameters : - * 1 : http = The destination for the connection. - * 2 : fwd = The forwarder settings. - * - * Returns : JB_INVALID_SOCKET => No reusable connection found, - * otherwise a usable socket. - * - *********************************************************************/ -static jb_socket get_reusable_connection(const struct http_request *http, - const struct forward_spec *fwd) -{ - jb_socket sfd = JB_INVALID_SOCKET; - unsigned int slot = 0; - - close_unusable_connections(); - - privoxy_mutex_lock(&connection_reuse_mutex); - - for (slot = 0; slot < SZ(reusable_connection); slot++) - { - if (!reusable_connection[slot].in_use - && (JB_INVALID_SOCKET != reusable_connection[slot].sfd)) - { - if (connection_destination_matches(&reusable_connection[slot], http, fwd)) - { - reusable_connection[slot].in_use = TRUE; - sfd = reusable_connection[slot].sfd; - log_error(LOG_LEVEL_CONNECT, - "Found reusable socket %d for %s:%d in slot %d.", - sfd, reusable_connection[slot].host, reusable_connection[slot].port, slot); - break; - } - } - } - - privoxy_mutex_unlock(&connection_reuse_mutex); - - return sfd; - -} - - -/********************************************************************* - * - * Function : mark_connection_unused - * - * Description : Gives a remembered connection free for reuse. - * - * Parameters : - * 1 : sfd = The socket belonging to the connection in question. - * - * Returns : TRUE => Socket found and marked as unused. - * FALSE => Socket not found. - * - *********************************************************************/ -static int mark_connection_unused(jb_socket sfd) -{ - unsigned int slot = 0; - int socket_found = FALSE; - - assert(sfd != JB_INVALID_SOCKET); - - privoxy_mutex_lock(&connection_reuse_mutex); - - for (slot = 0; slot < SZ(reusable_connection); slot++) - { - if (reusable_connection[slot].sfd == sfd) - { - assert(reusable_connection[slot].in_use); - socket_found = TRUE; - log_error(LOG_LEVEL_CONNECT, - "Marking open socket %d for %s:%d in slot %d as unused.", - sfd, reusable_connection[slot].host, - reusable_connection[slot].port, slot); - reusable_connection[slot].in_use = 0; - reusable_connection[slot].timestamp = time(NULL); - break; - } - } - - privoxy_mutex_unlock(&connection_reuse_mutex); - - return socket_found; - -} - - -/********************************************************************* - * - * Function : set_keep_alive_timeout - * - * Description : Sets the timeout after which open - * connections will no longer be reused. - * - * Parameters : - * 1 : timeout = The timeout in seconds. - * - * Returns : void - * - *********************************************************************/ -void set_keep_alive_timeout(int timeout) -{ - keep_alive_timeout = timeout; -} -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - - -/********************************************************************* - * - * Function : forwarded_connect - * - * Description : Connect to a specified web server, possibly via - * a HTTP proxy and/or a SOCKS proxy. - * - * Parameters : - * 1 : fwd = the proxies to use when connecting. - * 2 : http = the http request and apropos headers - * 3 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_INVALID_SOCKET => 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) -{ - const char * dest_host; - int dest_port; - jb_socket sfd = JB_INVALID_SOCKET; - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - sfd = get_reusable_connection(http, fwd); - if (JB_INVALID_SOCKET != sfd) - { - return sfd; - } -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - - /* Figure out if we need to connect to the web server or a HTTP proxy. */ - if (fwd->forward_host) - { - /* HTTP proxy */ - dest_host = fwd->forward_host; - dest_port = fwd->forward_port; - } - else - { - /* Web server */ - dest_host = http->host; - dest_port = http->port; - } - - /* Connect, maybe using a SOCKS proxy */ - switch (fwd->type) - { - case SOCKS_NONE: - sfd = connect_to(dest_host, dest_port, csp); - break; - case SOCKS_4: - case SOCKS_4A: - sfd = socks4_connect(fwd, dest_host, dest_port, csp); - break; - case SOCKS_5: - sfd = socks5_connect(fwd, dest_host, dest_port, csp); - break; - default: - /* Should never get here */ - log_error(LOG_LEVEL_FATAL, - "SOCKS4 impossible internal error - bad SOCKS type."); - } - - if (JB_INVALID_SOCKET != sfd) - { - log_error(LOG_LEVEL_CONNECT, - "Created new connection to %s:%d on socket %d.", - http->host, http->port, sfd); - } - - return sfd; - -} - - -/********************************************************************* - * - * Function : socks4_connect - * - * Description : Connect to the SOCKS server, and connect through - * it to the specified server. This handles - * all the SOCKS negotiation, and returns a file - * descriptor for a socket which can be treated as a - * normal (non-SOCKS) socket. - * - * Logged error messages are saved to csp->error_message - * and later reused by error_response() for the CGI - * message. strdup allocation failures are handled there. - * - * Parameters : - * 1 : fwd = Specifies the SOCKS proxy to use. - * 2 : target_host = The final server to connect to. - * 3 : target_port = The final port to connect to. - * 4 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_INVALID_SOCKET => 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) -{ - unsigned int web_server_addr; - char buf[BUFFER_SIZE]; - struct socks_op *c = (struct socks_op *)buf; - struct socks_reply *s = (struct socks_reply *)buf; - size_t n; - size_t csiz; - jb_socket sfd; - int err = 0; - char *errstr = NULL; - - if ((fwd->gateway_host == NULL) || (*fwd->gateway_host == '\0')) - { - /* XXX: Shouldn't the config file parser prevent this? */ - errstr = "NULL gateway host specified."; - err = 1; - } - - if (fwd->gateway_port <= 0) - { - errstr = "invalid gateway port specified."; - err = 1; - } - - if (err) - { - log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s", errstr); - csp->error_message = strdup(errstr); - errno = EINVAL; - return(JB_INVALID_SOCKET); - } - - /* build a socks request for connection to the web server */ - - strlcpy(&(c->userid), socks_userid, sizeof(buf) - sizeof(struct socks_op)); - - csiz = sizeof(*c) + sizeof(socks_userid) - sizeof(c->userid) - sizeof(c->padding); - - switch (fwd->type) - { - case SOCKS_4: - web_server_addr = resolve_hostname_to_ip(target_host); - if (web_server_addr == INADDR_NONE) - { - errstr = "could not resolve target host"; - log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s %s", errstr, target_host); - err = 1; - } - else - { - web_server_addr = htonl(web_server_addr); - } - break; - case SOCKS_4A: - web_server_addr = 0x00000001; - n = csiz + strlen(target_host) + 1; - if (n > sizeof(buf)) - { - errno = EINVAL; - errstr = "buffer cbuf too small."; - log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s", errstr); - err = 1; - } - else - { - strlcpy(buf + csiz, target_host, sizeof(buf) - sizeof(struct socks_op) - csiz); - /* - * What we forward to the socks4a server should have the - * size of socks_op, plus the length of the userid plus - * its \0 byte (which we don't have to add because the - * first byte of the userid is counted twice as it's also - * part of sock_op) minus the padding bytes (which are part - * of the userid as well), plus the length of the target_host - * (which is stored csiz bytes after the beginning of the buffer), - * plus another \0 byte. - */ - assert(n == sizeof(struct socks_op) + strlen(&(c->userid)) - sizeof(c->padding) + strlen(buf + csiz) + 1); - csiz = n; - } - break; - default: - /* Should never get here */ - log_error(LOG_LEVEL_FATAL, - "socks4_connect: SOCKS4 impossible internal error - bad SOCKS type."); - /* Not reached */ - return(JB_INVALID_SOCKET); - } - - if (err) - { - csp->error_message = strdup(errstr); - return(JB_INVALID_SOCKET); - } - - c->vn = 4; - c->cd = 1; - c->dstport[0] = (unsigned char)((target_port >> 8 ) & 0xff); - c->dstport[1] = (unsigned char)((target_port ) & 0xff); - c->dstip[0] = (unsigned char)((web_server_addr >> 24 ) & 0xff); - c->dstip[1] = (unsigned char)((web_server_addr >> 16 ) & 0xff); - c->dstip[2] = (unsigned char)((web_server_addr >> 8 ) & 0xff); - c->dstip[3] = (unsigned char)((web_server_addr ) & 0xff); - - /* pass the request to the socks server */ - sfd = connect_to(fwd->gateway_host, fwd->gateway_port, csp); - - if (sfd == JB_INVALID_SOCKET) - { - /* - * XXX: connect_to should fill in the exact reason. - * Most likely resolving the IP of the forwarder failed. - */ - errstr = "connect_to failed: see logfile for details"; - err = 1; - } - else if (write_socket(sfd, (char *)c, csiz)) - { - errstr = "SOCKS4 negotiation write failed."; - log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s", errstr); - err = 1; - close_socket(sfd); - } - else if (read_socket(sfd, buf, sizeof(buf)) != sizeof(*s)) - { - errstr = "SOCKS4 negotiation read failed."; - log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s", errstr); - err = 1; - close_socket(sfd); - } - - if (err) - { - csp->error_message = strdup(errstr); - return(JB_INVALID_SOCKET); - } - - switch (s->cd) - { - case SOCKS_REQUEST_GRANTED: - return(sfd); - case SOCKS_REQUEST_REJECT: - errstr = "SOCKS request rejected or failed."; - errno = EINVAL; - break; - case SOCKS_REQUEST_IDENT_FAILED: - errstr = "SOCKS request rejected because " - "SOCKS server cannot connect to identd on the client."; - errno = EACCES; - break; - case SOCKS_REQUEST_IDENT_CONFLICT: - errstr = "SOCKS request rejected because " - "the client program and identd report " - "different user-ids."; - errno = EACCES; - break; - default: - errno = ENOENT; - snprintf(buf, sizeof(buf), - "SOCKS request rejected for reason code %d.", s->cd); - errstr = buf; - } - - log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s", errstr); - csp->error_message = strdup(errstr); - close_socket(sfd); - - return(JB_INVALID_SOCKET); - -} - -/********************************************************************* - * - * Function : translate_socks5_error - * - * Description : Translates a SOCKS errors to a string. - * - * Parameters : - * 1 : socks_error = The error code to translate. - * - * Returns : The string translation. - * - *********************************************************************/ -static const char *translate_socks5_error(int socks_error) -{ - switch (socks_error) - { - /* XXX: these should be more descriptive */ - case SOCKS5_REQUEST_FAILED: - return "SOCKS5 request failed"; - case SOCKS5_REQUEST_DENIED: - return "SOCKS5 request denied"; - case SOCKS5_REQUEST_NETWORK_UNREACHABLE: - return "SOCKS5 network unreachable"; - case SOCKS5_REQUEST_HOST_UNREACHABLE: - return "SOCKS5 host unreachable"; - case SOCKS5_REQUEST_CONNECTION_REFUSED: - return "SOCKS5 connection refused"; - case SOCKS5_REQUEST_TTL_EXPIRED: - return "SOCKS5 TTL expired"; - case SOCKS5_REQUEST_PROTOCOL_ERROR: - return "SOCKS5 client protocol error"; - case SOCKS5_REQUEST_BAD_ADDRESS_TYPE: - return "SOCKS5 domain names unsupported"; - case SOCKS5_REQUEST_GRANTED: - return "everything's peachy"; - default: - return "SOCKS5 negotiation protocol error"; - } -} - -/********************************************************************* - * - * Function : socks5_connect - * - * Description : Connect to the SOCKS server, and connect through - * it to the specified server. This handles - * all the SOCKS negotiation, and returns a file - * descriptor for a socket which can be treated as a - * normal (non-SOCKS) socket. - * - * Parameters : - * 1 : fwd = Specifies the SOCKS proxy to use. - * 2 : target_host = The final server to connect to. - * 3 : target_port = The final port to connect to. - * 4 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_INVALID_SOCKET => failure, else a socket file descriptor. - * - *********************************************************************/ -static jb_socket socks5_connect(const struct forward_spec *fwd, - const char *target_host, - int target_port, - struct client_state *csp) -{ - int err = 0; - char cbuf[300]; - char sbuf[30]; - size_t client_pos = 0; - int server_size = 0; - size_t hostlen = 0; - jb_socket sfd; - const char *errstr = NULL; - - assert(fwd->gateway_host); - if ((fwd->gateway_host == NULL) || (*fwd->gateway_host == '\0')) - { - errstr = "NULL gateway host specified"; - err = 1; - } - - if (fwd->gateway_port <= 0) - { - /* - * XXX: currently this can't happen because in - * case of invalid gateway ports we use the defaults. - * Of course we really shouldn't do that. - */ - errstr = "invalid gateway port specified"; - err = 1; - } - - hostlen = strlen(target_host); - if (hostlen > (size_t)255) - { - errstr = "target host name is longer than 255 characters"; - err = 1; - } - - if (fwd->type != SOCKS_5) - { - /* Should never get here */ - log_error(LOG_LEVEL_FATAL, - "SOCKS5 impossible internal error - bad SOCKS type"); - err = 1; - } - - if (err) - { - errno = EINVAL; - assert(errstr != NULL); - log_error(LOG_LEVEL_CONNECT, "socks5_connect: %s", errstr); - csp->error_message = strdup(errstr); - return(JB_INVALID_SOCKET); - } - - /* pass the request to the socks server */ - sfd = connect_to(fwd->gateway_host, fwd->gateway_port, csp); - - if (sfd == JB_INVALID_SOCKET) - { - errstr = "socks5 server unreachable"; - log_error(LOG_LEVEL_CONNECT, "socks5_connect: %s", errstr); - csp->error_message = strdup(errstr); - return(JB_INVALID_SOCKET); - } - - client_pos = 0; - cbuf[client_pos++] = '\x05'; /* Version */ - cbuf[client_pos++] = '\x01'; /* One authentication method supported */ - cbuf[client_pos++] = '\x00'; /* The no authentication authentication method */ - - if (write_socket(sfd, cbuf, client_pos)) - { - errstr = "SOCKS5 negotiation write failed"; - csp->error_message = strdup(errstr); - log_error(LOG_LEVEL_CONNECT, "%s", errstr); - close_socket(sfd); - return(JB_INVALID_SOCKET); - } - - if (read_socket(sfd, sbuf, sizeof(sbuf)) != 2) - { - errstr = "SOCKS5 negotiation read failed"; - err = 1; - } - - if (!err && (sbuf[0] != '\x05')) - { - errstr = "SOCKS5 negotiation protocol version error"; - err = 1; - } - - if (!err && (sbuf[1] == '\xff')) - { - errstr = "SOCKS5 authentication required"; - err = 1; - } - - if (!err && (sbuf[1] != '\x00')) - { - errstr = "SOCKS5 negotiation protocol error"; - err = 1; - } - - if (err) - { - assert(errstr != NULL); - log_error(LOG_LEVEL_CONNECT, "socks5_connect: %s", errstr); - csp->error_message = strdup(errstr); - close_socket(sfd); - errno = EINVAL; - return(JB_INVALID_SOCKET); - } - - client_pos = 0; - cbuf[client_pos++] = '\x05'; /* Version */ - cbuf[client_pos++] = '\x01'; /* TCP connect */ - cbuf[client_pos++] = '\x00'; /* Reserved, must be 0x00 */ - cbuf[client_pos++] = '\x03'; /* Address is domain name */ - cbuf[client_pos++] = (char)(hostlen & 0xffu); - assert(sizeof(cbuf) - client_pos > (size_t)255); - /* Using strncpy because we really want the nul byte padding. */ - strncpy(cbuf + client_pos, target_host, sizeof(cbuf) - client_pos); - client_pos += (hostlen & 0xffu); - cbuf[client_pos++] = (char)((target_port >> 8) & 0xff); - cbuf[client_pos++] = (char)((target_port ) & 0xff); - - if (write_socket(sfd, cbuf, client_pos)) - { - errstr = "SOCKS5 negotiation read failed"; - csp->error_message = strdup(errstr); - log_error(LOG_LEVEL_CONNECT, "%s", errstr); - close_socket(sfd); - errno = EINVAL; - return(JB_INVALID_SOCKET); - } - - server_size = read_socket(sfd, sbuf, sizeof(sbuf)); - if (server_size < 3) - { - errstr = "SOCKS5 negotiation read failed"; - err = 1; - } - else if (server_size > 20) - { - /* This is somewhat unexpected but doesn't realy matter. */ - log_error(LOG_LEVEL_CONNECT, "socks5_connect: read %d bytes " - "from socks server. Would have accepted up to %d.", - server_size, sizeof(sbuf)); - } - - if (!err && (sbuf[0] != '\x05')) - { - errstr = "SOCKS5 negotiation protocol version error"; - err = 1; - } - - if (!err && (sbuf[2] != '\x00')) - { - errstr = "SOCKS5 negotiation protocol error"; - err = 1; - } - - if (!err) - { - if (sbuf[1] == SOCKS5_REQUEST_GRANTED) - { - return(sfd); - } - errstr = translate_socks5_error(sbuf[1]); - err = 1; - } - - assert(errstr != NULL); - csp->error_message = strdup(errstr); - log_error(LOG_LEVEL_CONNECT, "socks5_connect: %s", errstr); - close_socket(sfd); - errno = EINVAL; - - return(JB_INVALID_SOCKET); - -} - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/gateway.h b/external/privoxy/gateway.h deleted file mode 100644 index 94115f7..0000000 --- a/external/privoxy/gateway.h +++ /dev/null @@ -1,158 +0,0 @@ -#ifndef GATEWAY_H_INCLUDED -#define GATEWAY_H_INCLUDED -#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.12 2008/12/24 17:06:19 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/gateway.h,v $ - * - * Purpose : Contains functions to connect to a server, possibly - * using a "gateway" (i.e. HTTP proxy and/or SOCKS4 - * proxy). Also contains the list of gateway types. - * - * 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: gateway.h,v $ - * Revision 1.12 2008/12/24 17:06:19 fabiankeil - * Keep a thread around to timeout alive connections - * even if no new requests are coming in. - * - * Revision 1.11 2008/11/13 09:08:42 fabiankeil - * Add new config option: keep-alive-timeout. - * - * Revision 1.10 2008/10/09 18:21:41 fabiankeil - * Flush work-in-progress changes to keep outgoing connections - * alive where possible. Incomplete and mostly #ifdef'd out. - * - * Revision 1.9 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.7 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -struct forward_spec; -struct http_request; -struct client_state; - -extern jb_socket forwarded_connect(const struct forward_spec * fwd, - struct http_request *http, - struct client_state *csp); -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - -/* - * Default number of seconds after which an - * open connection will no longer be reused. - */ -#define DEFAULT_KEEP_ALIVE_TIMEOUT 180 - -extern void set_keep_alive_timeout(int timeout); -extern void initialize_reusable_connections(void); -extern void forget_connection(jb_socket sfd); -extern void remember_connection(jb_socket sfd, - const struct http_request *http, - const struct forward_spec *fwd); -extern int close_unusable_connections(void); -#endif /* FEATURE_CONNECTION_KEEP_ALIVE */ - - -/* - * Solaris fix - */ -#ifndef INADDR_NONE -#define INADDR_NONE -1 -#endif - -/* - * Revision control strings from this header and associated .c file - */ -extern const char gateway_rcs[]; -extern const char gateway_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef GATEWAY_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/genclspec.sh b/external/privoxy/genclspec.sh deleted file mode 100755 index 376e992..0000000 --- a/external/privoxy/genclspec.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# -# $Id: genclspec.sh,v 1.2 2002/04/27 04:49:11 morcego Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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: genclspec.sh,v $ -# Revision 1.2 2002/04/27 04:49:11 morcego -# Adding license and copyright comments. -# -# - -VERSION=`cat privoxy-rh.spec | sed -n -e 's/^Version:[ ]*//p'` -RELEASE=`cat privoxy-rh.spec | sed -n -e 's/^Release:[ ]*//p'` -CLTAG=${VERSION}-${RELEASE}cl - -PACKAGER=`rpm --eval "%{packager}"` -if [ "${PACKAGER}" = "%{packager}" ]; then - PACKAGER="genclspec script developers@privoxy.org" -fi - -export LC_ALL= -export LANG= -DATETAG=`date "+%a %b %d %Y"` - -if [ -r privoxy-cl.spec ]; then - echo Old CL specfile found. Removing it. -fi - -cat privoxy-rh.spec | sed -e 's/^(Release:[ ]*[^ ]+)[ ]*$/\1cl/' \ - -e "/^%changelog/a* ${DATETAG} ${PACKAGER}" \ - -e "/^%changelog/a+ privoxy-${CLTAG}" \ - -e "/^%changelog/a- Packaging for Conectiva Linux (automatic genarated specfile)" \ - -e '/^%changelog/a \ -' > privoxy-cl.spec - diff --git a/external/privoxy/icons/ico00001.ico b/external/privoxy/icons/ico00001.ico deleted file mode 100644 index a01ccfc..0000000 Binary files a/external/privoxy/icons/ico00001.ico and /dev/null differ diff --git a/external/privoxy/icons/ico00002.ico b/external/privoxy/icons/ico00002.ico deleted file mode 100644 index b7de068..0000000 Binary files a/external/privoxy/icons/ico00002.ico and /dev/null differ diff --git a/external/privoxy/icons/ico00003.ico b/external/privoxy/icons/ico00003.ico deleted file mode 100644 index 99e0980..0000000 Binary files a/external/privoxy/icons/ico00003.ico and /dev/null differ diff --git a/external/privoxy/icons/ico00004.ico b/external/privoxy/icons/ico00004.ico deleted file mode 100644 index 35b76d4..0000000 Binary files a/external/privoxy/icons/ico00004.ico and /dev/null differ diff --git a/external/privoxy/icons/ico00005.ico b/external/privoxy/icons/ico00005.ico deleted file mode 100644 index db9bddf..0000000 Binary files a/external/privoxy/icons/ico00005.ico and /dev/null differ diff --git a/external/privoxy/icons/ico00006.ico b/external/privoxy/icons/ico00006.ico deleted file mode 100644 index 5e1f3fa..0000000 Binary files a/external/privoxy/icons/ico00006.ico and /dev/null differ diff --git a/external/privoxy/icons/ico00007.ico b/external/privoxy/icons/ico00007.ico deleted file mode 100644 index 6ec504d..0000000 Binary files a/external/privoxy/icons/ico00007.ico and /dev/null differ diff --git a/external/privoxy/icons/ico00008.ico b/external/privoxy/icons/ico00008.ico deleted file mode 100644 index e6bc72f..0000000 Binary files a/external/privoxy/icons/ico00008.ico and /dev/null differ diff --git a/external/privoxy/icons/idle.ico b/external/privoxy/icons/idle.ico deleted file mode 100644 index 5ef20fc..0000000 Binary files a/external/privoxy/icons/idle.ico and /dev/null differ diff --git a/external/privoxy/icons/off.ico b/external/privoxy/icons/off.ico deleted file mode 100644 index cea8778..0000000 Binary files a/external/privoxy/icons/off.ico and /dev/null differ diff --git a/external/privoxy/icons/os2.ico b/external/privoxy/icons/os2.ico deleted file mode 100644 index 0ad4f56..0000000 Binary files a/external/privoxy/icons/os2.ico and /dev/null differ diff --git a/external/privoxy/icons/os20.ico b/external/privoxy/icons/os20.ico deleted file mode 100644 index ef5995b..0000000 Binary files a/external/privoxy/icons/os20.ico and /dev/null differ diff --git a/external/privoxy/icons/os21.ico b/external/privoxy/icons/os21.ico deleted file mode 100644 index cc61b61..0000000 Binary files a/external/privoxy/icons/os21.ico and /dev/null differ diff --git a/external/privoxy/icons/os22.ico b/external/privoxy/icons/os22.ico deleted file mode 100644 index d357dfb..0000000 Binary files a/external/privoxy/icons/os22.ico and /dev/null differ diff --git a/external/privoxy/icons/os23.ico b/external/privoxy/icons/os23.ico deleted file mode 100644 index 8ac037f..0000000 Binary files a/external/privoxy/icons/os23.ico and /dev/null differ diff --git a/external/privoxy/icons/os24.ico b/external/privoxy/icons/os24.ico deleted file mode 100644 index f2b87f7..0000000 Binary files a/external/privoxy/icons/os24.ico and /dev/null differ diff --git a/external/privoxy/icons/os25.ico b/external/privoxy/icons/os25.ico deleted file mode 100644 index 5bc68b5..0000000 Binary files a/external/privoxy/icons/os25.ico and /dev/null differ diff --git a/external/privoxy/icons/os26.ico b/external/privoxy/icons/os26.ico deleted file mode 100644 index 408d89e..0000000 Binary files a/external/privoxy/icons/os26.ico and /dev/null differ diff --git a/external/privoxy/icons/os27.ico b/external/privoxy/icons/os27.ico deleted file mode 100644 index 00a8814..0000000 Binary files a/external/privoxy/icons/os27.ico and /dev/null differ diff --git a/external/privoxy/icons/os28.ico b/external/privoxy/icons/os28.ico deleted file mode 100644 index 9153636..0000000 Binary files a/external/privoxy/icons/os28.ico and /dev/null differ diff --git a/external/privoxy/icons/privoxy.ico b/external/privoxy/icons/privoxy.ico deleted file mode 100644 index 4c96d0b..0000000 Binary files a/external/privoxy/icons/privoxy.ico and /dev/null differ diff --git a/external/privoxy/install-sh b/external/privoxy/install-sh deleted file mode 100755 index e9de238..0000000 --- a/external/privoxy/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/external/privoxy/jarfile b/external/privoxy/jarfile deleted file mode 100644 index e69de29..0000000 diff --git a/external/privoxy/jbsockets.c b/external/privoxy/jbsockets.c deleted file mode 100644 index 4548ff2..0000000 --- a/external/privoxy/jbsockets.c +++ /dev/null @@ -1,1054 +0,0 @@ -const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.50 2008/12/20 14:53:55 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/jbsockets.c,v $ - * - * Purpose : Contains wrappers for system-specific sockets code, - * so that the rest of Junkbuster can be more - * OS-independent. Contains #ifdefs to make this work - * on many platforms. - * - * Copyright : Written by and Copyright (C) 2001-2007 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: jbsockets.c,v $ - * Revision 1.50 2008/12/20 14:53:55 fabiankeil - * Add config option socket-timeout to control the time - * Privoxy waits for data to arrive on a socket. Useful - * in case of stale ssh tunnels or when fuzz-testing. - * - * Revision 1.49 2008/11/10 17:03:57 fabiankeil - * Fix a gcc44 warning and remove a now-obsolete cast. - * - * Revision 1.48 2008/09/04 08:13:58 fabiankeil - * Prepare for critical sections on Windows by adding a - * layer of indirection before the pthread mutex functions. - * - * Revision 1.47 2008/03/26 18:07:07 fabiankeil - * Add hostname directive. Closes PR#1918189. - * - * Revision 1.46 2008/03/21 11:13:57 fabiankeil - * Only gather host information if it's actually needed. - * Also move the code out of accept_connection() so it's less likely - * to delay other incoming connections if the host is misconfigured. - * - * Revision 1.45 2007/09/30 16:59:22 fabiankeil - * Set the maximum listen() backlog to 128. Apparently SOMAXCONN is - * neither high enough, nor a hard limit on mingw32. Again for BR#1795281. - * - * Revision 1.44 2007/09/15 13:01:31 fabiankeil - * Increase listen() backlog to SOMAXCONN (or 128) to decrease - * chances of dropped connections under load. Problem reported - * and fix suggested by nobody in BR#1795281. - * - * Revision 1.43 2007/06/01 18:16:36 fabiankeil - * Use the same mutex for gethostbyname() and gethostbyaddr() to prevent - * deadlocks and crashes on OpenBSD and possibly other OS with neither - * gethostbyname_r() nor gethostaddr_r(). Closes BR#1729174. - * Thanks to Ralf Horstmann for report and solution. - * - * Revision 1.42 2007/04/01 17:37:07 fabiankeil - * - Add DNS retries for Solaris and other systems - * whose gethostbyname_r version takes five arguments. - * - Move maximum number of DNS retries into a macro. - * - * Revision 1.41 2006/11/13 19:05:51 fabiankeil - * Make pthread mutex locking more generic. Instead of - * checking for OSX and OpenBSD, check for FEATURE_PTHREAD - * and use mutex locking unless there is an _r function - * available. Better safe than sorry. - * - * Fixes "./configure --disable-pthread" and should result - * in less threading-related problems on pthread-using platforms, - * but it still doesn't fix BR#1122404. - * - * Revision 1.40 2006/09/02 15:36:42 fabiankeil - * Follow the OpenBSD port's lead and protect the resolve - * functions on OpenBSD as well. - * - * Revision 1.39 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work:http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.38 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.35.2.8 2006/01/21 16:16:08 david__schmidt - * Thanks to Edward Carrel for his patch to modernize OSX'spthreads support. See bug #1409623. - * - * Revision 1.35.2.7 2005/05/07 21:50:55 david__schmidt - * A few memory leaks plugged (mostly on error paths) - * - * Revision 1.35.2.6 2003/12/17 16:34:40 oes - * Cosmetics - * - * Revision 1.35.2.5 2003/04/29 11:32:54 oes - * Don't rely on h_addr being non-NULL after gethostbyname. - * Works around an oddness in Max OSX and closes bug #724796 - * - * Revision 1.35.2.4 2003/04/04 12:40:20 oes - * Made sure the errno set by bind, not close[socket] is used in - * bind_port. Probably fixes bugs #713777, #705562. - * - * Revision 1.35.2.3 2003/03/07 03:41:04 david__schmidt - * Wrapping all *_r functions (the non-_r versions of them) with mutex semaphores for OSX. Hopefully this will take care of all of those pesky crash reports. - * - * Revision 1.35.2.2 2002/11/20 14:37:24 oes - * Fixed Win32 error logging in bind_port. - * Thanks to Oliver Stoeneberg for the hint. - * - * Revision 1.35.2.1 2002/05/26 23:41:27 joergs - * AmigaOS: Fixed wrong type of len in write_socket() - * - * Revision 1.35 2002/04/26 15:50:04 joergs - * AmigaOS: No socklen_t, added AMIGA to the systems using int instead. - * - * Revision 1.34 2002/04/08 20:31:41 swa - * fixed JB spelling - * - * Revision 1.33 2002/04/03 16:02:18 gliptak - * Correcting compile warning with older gcc - * - * Revision 1.32 2002/03/31 17:18:59 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.31 2002/03/29 03:33:13 david__schmidt - * Fix Mac OSX compiler warnings - * - * Revision 1.30 2002/03/27 14:32:43 david__schmidt - * More compiler warning message maintenance - * - * Revision 1.29 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.28 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.27 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.26 2002/03/11 22:07:02 david__schmidt - * OS/2 port maintenance: - * - Fixed EMX build - it had decayed a little - * - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro. - * substituted a memset for now. - * - * Revision 1.25 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.24 2002/03/07 03:51:36 oes - * - Improved handling of failed DNS lookups - * - Fixed compiler warnings etc - * - * Revision 1.23 2002/03/05 00:36:01 jongfoster - * Fixing bug 514988 - unable to restart Junkbuster - * - * Revision 1.22 2002/03/04 02:08:02 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.21 2002/01/09 14:32:33 oes - * Added support for gethostbyname_r and gethostbyaddr_r. - * - * Revision 1.20 2001/11/16 00:48:48 jongfoster - * Enabling duplicate-socket detection for all platforms, not - * just Win32. - * - * Revision 1.19 2001/10/25 03:40:47 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.18 2001/09/21 23:02:02 david__schmidt - * Cleaning up 2 compiler warnings on OS/2. - * - * Revision 1.17 2001/09/13 20:11:46 jongfoster - * Fixing 2 compiler warnings under Win32 - * - * Revision 1.16 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.15 2001/07/29 17:40:43 jongfoster - * Fixed compiler warning by adding a cast - * - * Revision 1.14 2001/07/18 13:47:59 oes - * Eliminated dirty hack for getsockbyname() - * - * Revision 1.13 2001/07/15 13:56:57 jongfoster - * Removing unused local variable. - * - * Revision 1.12 2001/07/01 17:04:11 oes - * Bugfix: accept_connection no longer uses the obsolete hstrerror() function - * - * Revision 1.11 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * - * Revision 1.10 2001/06/29 13:29:15 oes - * - Added remote (server) host IP to csp->http->host_ip_addr_str - * - Added detection of local socket IP and fqdn - * - Removed logentry from cancelled commit - * - * Revision 1.9 2001/06/07 23:06:09 jongfoster - * The host parameter to connect_to() is now const. - * - * Revision 1.8 2001/06/03 19:12:07 oes - * filled comment - * - * Revision 1.7 2001/05/28 16:14:00 jongfoster - * Fixing bug in LOG_LEVEL_LOG - * - * Revision 1.6 2001/05/26 17:28:32 jongfoster - * Fixed LOG_LEVEL_LOG - * - * Revision 1.5 2001/05/26 15:26:15 jongfoster - * ACL feature now provides more security by immediately dropping - * connections from untrusted hosts. - * - * Revision 1.4 2001/05/26 00:37:42 jongfoster - * Cosmetic indentation correction. - * - * Revision 1.3 2001/05/25 21:57:54 jongfoster - * Now gives a warning under Windows if you try to bind - * it to a port that's already in use. - * - * 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:58:54 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/types.h> - -#ifdef _WIN32 - -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> -#include <sys/timeb.h> -#include <io.h> - -#else - -#ifndef __OS2__ -#include <unistd.h> -#endif -#include <sys/time.h> -#include <netinet/in.h> -#include <sys/ioctl.h> -#include <netdb.h> -#include <sys/socket.h> - -#ifndef __BEOS__ -#include <netinet/tcp.h> -#ifndef __OS2__ -#include <arpa/inet.h> -#endif -#else -#include <socket.h> -#endif - -#if defined(__EMX__) || defined (__OS2__) -#include <sys/select.h> /* OS/2/EMX needs a little help with select */ -#ifdef __OS2__ -#include <nerrno.h> -#endif -#endif - -#endif - -#include "project.h" - -#ifdef FEATURE_PTHREAD -#include "jcc.h" -/* jcc.h is for mutex semaphores only */ -#endif /* def FEATURE_PTHREAD */ - -#include "jbsockets.h" -#include "filters.h" -#include "errlog.h" - -const char jbsockets_h_rcs[] = JBSOCKETS_H_VERSION; - -/* - * Maximum number of gethostbyname(_r) retries in case of - * soft errors (TRY_AGAIN). - * XXX: Does it make sense to make this a config option? - */ -#define MAX_DNS_RETRIES 10 - -#define MAX_LISTEN_BACKLOG 128 - - -/********************************************************************* - * - * Function : connect_to - * - * Description : Open a socket and connect to it. Will check - * that this is allowed according to ACL. - * - * Parameters : - * 1 : host = hostname to connect to - * 2 : portnum = port to connent on (XXX: should be unsigned) - * 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. - * - *********************************************************************/ -jb_socket connect_to(const char *host, int portnum, struct client_state *csp) -{ - struct sockaddr_in inaddr; - jb_socket fd; - unsigned int 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 - struct access_control_addr dst[1]; -#endif /* def FEATURE_ACL */ - - memset((char *)&inaddr, 0, sizeof inaddr); - - if ((addr = resolve_hostname_to_ip(host)) == INADDR_NONE) - { - csp->http->host_ip_addr_str = strdup("unknown"); - return(JB_INVALID_SOCKET); - } - -#ifdef FEATURE_ACL - dst->addr = ntohl(addr); - dst->port = portnum; - - if (block_acl(dst, csp)) - { -#ifdef __OS2__ - errno = SOCEPERM; -#else - errno = EPERM; -#endif - return(JB_INVALID_SOCKET); - } -#endif /* def FEATURE_ACL */ - - 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); - } -#ifndef _WIN32 - else - { - inaddr.sin_port = htonl((unsigned long)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); - } - -#ifdef TCP_NODELAY - { /* turn off TCP coalescence */ - int mi = 1; - setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &mi, sizeof (int)); - } -#endif /* def TCP_NODELAY */ - -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) - 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__) */ - - while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == JB_INVALID_SOCKET) - { -#ifdef _WIN32 - if (errno == WSAEINPROGRESS) -#elif __OS2__ - if (sock_errno() == EINPROGRESS) -#else /* ifndef _WIN32 */ - if (errno == EINPROGRESS) -#endif /* ndef _WIN32 || __OS2__ */ - { - break; - } - -#ifdef __OS2__ - if (sock_errno() != EINTR) -#else - if (errno != EINTR) -#endif /* __OS2__ */ - { - close_socket(fd); - return(JB_INVALID_SOCKET); - } - } - -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) - if (flags != -1) - { - flags &= ~O_NDELAY; - fcntl(fd, F_SETFL, flags); - } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */ - - /* wait for connection to complete */ - FD_ZERO(&wfds); - FD_SET(fd, &wfds); - - tv->tv_sec = 30; - tv->tv_usec = 0; - - /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */ - if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0) - { - close_socket(fd); - return(JB_INVALID_SOCKET); - } - return(fd); - -} - - -/********************************************************************* - * - * Function : write_socket - * - * Description : Write the contents of buf (for n bytes) to socket fd. - * - * Parameters : - * 1 : fd = file descriptor (aka. handle) of socket to write to. - * 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. - * - *********************************************************************/ -#ifdef AMIGA -int write_socket(jb_socket fd, const char *buf, ssize_t len) -#else -int write_socket(jb_socket fd, const char *buf, size_t len) -#endif -{ - if (len == 0) - { - return 0; - } - - if (len < 0) /* constant condition - size_t isn't ever negative */ - { - return 1; - } - - 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; - } -#else - return (write(fd, buf, len) != len); -#endif - -} - - -/********************************************************************* - * - * Function : read_socket - * - * Description : Read from a TCP/IP socket in a platform independent way. - * - * Parameters : - * 1 : fd = file descriptor of the socket to read - * 2 : buf = pointer to buffer where data will be written - * Must be >= len bytes long. - * 3 : len = maximum number of bytes to read - * - * Returns : On success, the number of bytes read is returned (zero - * indicates end of file), and the file position is advanced - * by this number. It is not an error if this number is - * 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, - * -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) -{ - 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)); -#else - return(read(fd, buf, (size_t)len)); -#endif -} - - -/********************************************************************* - * - * Function : data_is_available - * - * Description : Waits for data to arrive on a socket. - * - * Parameters : - * 1 : fd = file descriptor of the socket to read - * 2 : seconds_to_wait = number of seconds after which we give up. - * - * Returns : TRUE if data arrived in time, - * FALSE otherwise. - * - *********************************************************************/ -int data_is_available(jb_socket fd, int seconds_to_wait) -{ - fd_set rfds; - struct timeval timeout; - int n; - - memset(&timeout, 0, sizeof(timeout)); - timeout.tv_sec = seconds_to_wait; - -#ifdef __OS2__ - /* Copy and pasted from jcc.c ... */ - memset(&rfds, 0, sizeof(fd_set)); -#else - FD_ZERO(&rfds); -#endif - FD_SET(fd, &rfds); - - n = select(fd+1, &rfds, NULL, NULL, &timeout); - - /* - * XXX: Do we care about the different error conditions? - */ - return (n == 1); -} - - -/********************************************************************* - * - * Function : close_socket - * - * Description : Closes a TCP/IP socket - * - * Parameters : - * 1 : fd = file descriptor of socket to be closed - * - * Returns : void - * - *********************************************************************/ -void close_socket(jb_socket fd) -{ -#if defined(_WIN32) || defined(__BEOS__) - closesocket(fd); -#elif defined(AMIGA) - CloseSocket(fd); -#elif defined(__OS2__) - soclose(fd); -#else - close(fd); -#endif - -} - - -/********************************************************************* - * - * Function : bind_port - * - * Description : Call socket, set socket options, and listen. - * Called by listen_loop to "boot up" our proxy address. - * - * 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 - *********************************************************************/ -int bind_port(const char *hostnam, int portnum, jb_socket *pfd) -{ - struct sockaddr_in inaddr; - jb_socket fd; -#ifndef _WIN32 - 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); - } -#ifndef _WIN32 - else - { - inaddr.sin_port = htonl((unsigned long) 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 - * duplicate instances of Privoxy from being caught. - * - * On UNIX, we assume the user is sensible enough not - * to start Privoxy multiple times on the same IP. - * Without this, stopping and restarting Privoxy - * 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. - */ - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); -#endif /* ndef _WIN32 */ - - if (bind(fd, (struct sockaddr *)&inaddr, sizeof(inaddr)) < 0) - { -#ifdef _WIN32 - errno = WSAGetLastError(); - if (errno == WSAEADDRINUSE) -#else - if (errno == EADDRINUSE) -#endif - { - close_socket(fd); - return(-3); - } - else - { - close_socket(fd); - return(-1); - } - } - - while (listen(fd, MAX_LISTEN_BACKLOG) == -1) - { - if (errno != EINTR) - { - return(-1); - } - } - - *pfd = fd; - return 0; - -} - - -/********************************************************************* - * - * Function : get_host_information - * - * Description : Determines the IP address the client used to - * reach us and the hostname associated with it. - * - * XXX: Most of the code has been copy and pasted - * from accept_connection() and not all of the - * ifdefs paths have been tested afterwards. - * - * Parameters : - * 1 : afd = File descriptor returned from accept(). - * 2 : ip_address = Pointer to return the pointer to - * the ip address string. - * 3 : hostname = Pointer to return the pointer to - * the hostname or NULL if the caller - * isn't interested in it. - * - * Returns : void. - * - *********************************************************************/ -void get_host_information(jb_socket afd, char **ip_address, char **hostname) -{ - struct sockaddr_in server; - struct hostent *host = NULL; -#if defined(_WIN32) || defined(__OS2__) || defined(__APPLE_CC__) || defined(AMIGA) - /* according to accept_connection() this fixes a warning. */ - int s_length; -#else - socklen_t 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 */ - s_length = sizeof(server); - - if (NULL != hostname) - { - *hostname = NULL; - } - *ip_address = NULL; - - if (!getsockname(afd, (struct sockaddr *) &server, &s_length)) - { - *ip_address = strdup(inet_ntoa(server.sin_addr)); - - if (NULL == hostname) - { - /* - * We're done here, the caller isn't - * interested in knowing the hostname. - */ - return; - } -#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; - } -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&resolver_mutex); - host = gethostbyaddr((const char *)&server.sin_addr, - sizeof(server.sin_addr), AF_INET); - privoxy_mutex_unlock(&resolver_mutex); -#else - host = gethostbyaddr((const char *)&server.sin_addr, - sizeof(server.sin_addr), AF_INET); -#endif - if (host == NULL) - { - log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %E\n"); - } - else - { - *hostname = strdup(host->h_name); - } - } - - return; -} - - -/********************************************************************* - * - * Function : accept_connection - * - * Description : Accepts a connection on a socket. Socket must have - * been created using bind_port(). - * - * Parameters : - * 1 : csp = Client state, cfd, ip_addr_str, and - * ip_addr_long will be set by this routine. - * 2 : fd = file descriptor returned from bind_port - * - * Returns : when a connection is accepted, it returns 1 (TRUE). - * On an error it returns 0 (FALSE). - * - *********************************************************************/ -int accept_connection(struct client_state * csp, jb_socket fd) -{ - struct sockaddr_in client; - jb_socket afd; -#if defined(_WIN32) || defined(__OS2__) || defined(__APPLE_CC__) || defined(AMIGA) - /* Wierdness - fix a warning. */ - int c_length; -#else - socklen_t c_length; -#endif - - c_length = sizeof(client); - -#ifdef _WIN32 - afd = accept (fd, (struct sockaddr *) &client, &c_length); - if (afd == JB_INVALID_SOCKET) - { - return 0; - } -#else - do - { - afd = accept (fd, (struct sockaddr *) &client, &c_length); - } while (afd < 1 && errno == EINTR); - if (afd < 0) - { - return 0; - } -#endif - - csp->cfd = afd; - csp->ip_addr_str = strdup(inet_ntoa(client.sin_addr)); - csp->ip_addr_long = ntohl(client.sin_addr.s_addr); - - return 1; - -} - - -/********************************************************************* - * - * Function : resolve_hostname_to_ip - * - * Description : Resolve a hostname to an internet tcp/ip address. - * NULL or an empty string resolve to INADDR_ANY. - * - * Parameters : - * 1 : host = hostname to resolve - * - * Returns : INADDR_NONE => failure, INADDR_ANY or tcp/ip address if succesful. - * - *********************************************************************/ -unsigned long resolve_hostname_to_ip(const char *host) -{ - struct sockaddr_in inaddr; - struct hostent *hostp; - unsigned int dns_retries = 0; -#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')) - { - return(INADDR_ANY); - } - - memset((char *) &inaddr, 0, sizeof inaddr); - - if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1) - { -#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) - while (gethostbyname_r(host, &result, hbuf, - HOSTENT_BUFFER_SIZE, &hostp, &thd_err) - && (thd_err == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES)) - { - log_error(LOG_LEVEL_ERROR, - "Timeout #%u while trying to resolve %s. Trying again.", - dns_retries, host); - } -#elif defined(HAVE_GETHOSTBYNAME_R_5_ARGS) - while (NULL == (hostp = gethostbyname_r(host, &result, - hbuf, HOSTENT_BUFFER_SIZE, &thd_err)) - && (thd_err == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES)) - { - log_error(LOG_LEVEL_ERROR, - "Timeout #%u while trying to resolve %s. Trying again.", - dns_retries, host); - } -#elif defined(HAVE_GETHOSTBYNAME_R_3_ARGS) - /* - * XXX: Doesn't retry in case of soft errors. - * Does this gethostbyname_r version set h_errno? - */ - if (0 == gethostbyname_r(host, &result, &hdata)) - { - hostp = &result; - } - else - { - hostp = NULL; - } -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&resolver_mutex); - while (NULL == (hostp = gethostbyname(host)) - && (h_errno == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES)) - { - log_error(LOG_LEVEL_ERROR, - "Timeout #%u while trying to resolve %s. Trying again.", - dns_retries, host); - } - privoxy_mutex_unlock(&resolver_mutex); -#else - while (NULL == (hostp = gethostbyname(host)) - && (h_errno == TRY_AGAIN) && (dns_retries++ < MAX_DNS_RETRIES)) - { - log_error(LOG_LEVEL_ERROR, - "Timeout #%u while trying to resolve %s. Trying again.", - dns_retries, host); - } -#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */ - /* - * On Mac OSX, if a domain exists but doesn't have a type A - * record associated with it, the h_addr member of the struct - * hostent returned by gethostbyname is NULL, even if h_length - * is 4. Therefore the second test below. - */ - if (hostp == NULL || hostp->h_addr == NULL) - { - errno = EINVAL; - log_error(LOG_LEVEL_ERROR, "could not resolve hostname %s", host); - return(INADDR_NONE); - } - if (hostp->h_addrtype != AF_INET) - { -#ifdef _WIN32 - errno = WSAEPROTOTYPE; -#else - errno = EPROTOTYPE; -#endif - log_error(LOG_LEVEL_ERROR, "hostname %s resolves to unknown address type.", host); - return(INADDR_NONE); - } - memcpy( - (char *) &inaddr.sin_addr, - (char *) hostp->h_addr, - sizeof(inaddr.sin_addr) - ); - } - return(inaddr.sin_addr.s_addr); - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/jbsockets.h b/external/privoxy/jbsockets.h deleted file mode 100644 index 115cb6a..0000000 --- a/external/privoxy/jbsockets.h +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef JBSOCKETS_H_INCLUDED -#define JBSOCKETS_H_INCLUDED -#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.14 2008/12/20 14:53:55 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/jbsockets.h,v $ - * - * Purpose : Contains wrappers for system-specific sockets code, - * so that the rest of Junkbuster can be more - * OS-independent. Contains #ifdefs to make this work - * on many platforms. - * - * 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: jbsockets.h,v $ - * Revision 1.14 2008/12/20 14:53:55 fabiankeil - * Add config option socket-timeout to control the time - * Privoxy waits for data to arrive on a socket. Useful - * in case of stale ssh tunnels or when fuzz-testing. - * - * Revision 1.13 2008/03/21 11:13:59 fabiankeil - * Only gather host information if it's actually needed. - * Also move the code out of accept_connection() so it's less likely - * to delay other incoming connections if the host is misconfigured. - * - * Revision 1.12 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.9.2.1 2002/05/26 23:41:27 joergs - * AmigaOS: Fixed wrong type of len in write_socket() - * - * Revision 1.9 2002/04/08 20:31:41 swa - * fixed JB spelling - * - * Revision 1.8 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * 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 - * - * - *********************************************************************/ - - -#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); -#ifdef AMIGA -extern int write_socket(jb_socket fd, const char *buf, ssize_t n); -#else -extern int write_socket(jb_socket fd, const char *buf, size_t n); -#endif -extern int read_socket(jb_socket fd, char *buf, int n); -extern int data_is_available(jb_socket fd, int seconds_to_wait); -extern void close_socket(jb_socket 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 void get_host_information(jb_socket afd, char **ip_address, char **hostname); - -extern unsigned long resolve_hostname_to_ip(const char *host); - -/* Revision control strings from this header and associated .c file */ -extern const char jbsockets_rcs[]; -extern const char jbsockets_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef JBSOCKETS_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/jcc.c b/external/privoxy/jcc.c deleted file mode 100644 index 1007128..0000000 --- a/external/privoxy/jcc.c +++ /dev/null @@ -1,4486 +0,0 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.235 2009/03/18 21:01:20 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ - * - * Purpose : Main file. Contains main() method, main loop, and - * the main connection-handling function. - * - * Copyright : Written by and Copyright (C) 2001-2009 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: jcc.c,v $ - * Revision 1.235 2009/03/18 21:01:20 fabiankeil - * Comment fix. Spotted by Roland. - * - * Revision 1.234 2009/03/18 20:48:42 fabiankeil - * If the --no-daemon option is used, enable LOG_LEVEL_INFO - * before the config file has been parsed (as we always did). - * - * Revision 1.233 2009/03/13 14:10:07 fabiankeil - * Fix some more harmless warnings on amd64. - * - * Revision 1.232 2009/03/08 19:29:16 fabiankeil - * Reinitialize the timeout structure every time before passing - * it to select(). Apparently some implementations mess with it. - * Probably fixes #2669131 reported by cyberpatrol. - * - * Revision 1.231 2009/03/08 14:19:23 fabiankeil - * Fix justified (but harmless) compiler warnings - * on platforms where sizeof(int) < sizeof(long). - * - * Revision 1.230 2009/03/07 13:09:17 fabiankeil - * Change csp->expected_content and_csp->expected_content_length from - * size_t to unsigned long long to reduce the likelihood of integer - * overflows that would let us close the connection prematurely. - * Bug found while investigating #2669131, reported by cyberpatrol. - * - * Revision 1.229 2009/03/07 11:17:01 fabiankeil - * Fix compiler warning. - * - * Revision 1.228 2009/03/06 20:30:13 fabiankeil - * Log unsigned values as such. - * - * Revision 1.227 2009/03/02 19:18:11 fabiankeil - * Streamline parse_http_request()'s prototype. As - * cparser pointed out it doesn't actually use csp. - * - * Revision 1.226 2009/03/01 18:28:24 fabiankeil - * Help clang understand that we aren't dereferencing - * NULL pointers here. - * - * Revision 1.225 2009/02/19 18:09:32 fabiankeil - * Unbreak build without FEATURE_CONNECTION_KEEP_ALIVE. - * Noticed by David. - * - * Revision 1.224 2009/02/14 15:32:04 fabiankeil - * Add the request URL to the timeout message in chat(). - * Suggested by Lee. - * - * Revision 1.223 2009/02/09 21:21:16 fabiankeil - * Now that init_log_module() is called earlier, call show_version() - * later on from main() directly so it doesn't get called for --help - * or --version. - * - * Revision 1.222 2009/02/08 12:56:51 fabiankeil - * Call initialize_mutexes() before init_log_module() again. - * Broken since r220, might be the cause of Lee's #2579448. - * - * Revision 1.221 2009/02/06 18:02:58 fabiankeil - * When dropping privileges, also give up membership in supplementary - * groups. Thanks to Matthias Drochner for reporting the problem, - * providing the initial patch and testing the final version. - * - * Revision 1.220 2009/02/04 18:29:07 fabiankeil - * Initialize the log module before parsing arguments. - * Thanks to Matthias Drochner for the report. - * - * Revision 1.219 2009/01/31 16:08:21 fabiankeil - * Remove redundant error check in receive_client_request(). - * - * Revision 1.218 2009/01/31 12:25:54 fabiankeil - * Flatten indentation in receive_client_request(). - * - * Revision 1.217 2009/01/07 19:50:09 fabiankeil - * - If the socket-timeout has been reached and the client - * hasn't received any data yet, send an explanation before - * closing the connection. - * - In get_request_line(), signal timeouts the right way. - * - * Revision 1.216 2008/12/24 22:13:11 ler762 - * fix GCC 3.4.4 warning - * - * Revision 1.215 2008/12/24 17:06:19 fabiankeil - * Keep a thread around to timeout alive connections - * even if no new requests are coming in. - * - * Revision 1.214 2008/12/20 14:53:55 fabiankeil - * Add config option socket-timeout to control the time - * Privoxy waits for data to arrive on a socket. Useful - * in case of stale ssh tunnels or when fuzz-testing. - * - * Revision 1.213 2008/12/15 18:45:51 fabiankeil - * When logging crunches, log the whole URL, so one can easily - * differentiate between vanilla HTTP and CONNECT requests. - * - * Revision 1.212 2008/12/14 15:46:22 fabiankeil - * Give crunched requests their own log level. - * - * Revision 1.211 2008/12/06 10:05:03 fabiankeil - * Downgrade "Received x bytes while expecting y." message to - * LOG_LEVEL_CONNECT as it doesn't necessarily indicate an error. - * - * Revision 1.210 2008/12/02 22:03:18 fabiankeil - * Don't miscalculate byte_count if we don't get all the - * server headers with one read_socket() call. With keep-alive - * support enabled, this caused delays until the server closed - * the connection. - * - * Revision 1.209 2008/11/27 09:44:04 fabiankeil - * Cosmetics for the last commit: Don't watch out for - * the last chunk if the content isn't chunk-encoded or - * if we already determined the content length previously. - * - * Revision 1.208 2008/11/26 18:24:17 fabiankeil - * Recognize that the server response is complete if the - * last chunk is read together with the server headers. - * Reported by Lee. - * - * Revision 1.207 2008/11/25 17:25:16 fabiankeil - * Don't convert the client-header list to text until we need to. - * - * Revision 1.206 2008/11/23 17:00:11 fabiankeil - * Some more chat() cosmetics. - * - * Revision 1.205 2008/11/16 12:43:49 fabiankeil - * Turn keep-alive support into a runtime feature - * that is disabled by setting keep-alive-timeout - * to a negative value. - * - * Revision 1.204 2008/11/06 19:42:17 fabiankeil - * Fix last-chunk detection hack to also apply - * if buf[] contains nothing but the last-chunk. - * - * Revision 1.203 2008/11/06 18:34:35 fabiankeil - * Factor receive_client_request() and - * parse_client_request() out of chat(). - * - * Revision 1.202 2008/11/02 18:40:34 fabiankeil - * If we received a different amount of data than we expected, - * log a warning and make sure the server socket isn't reused. - * - * Revision 1.201 2008/11/02 16:48:20 fabiankeil - * Revert revision 1.195 and try again. - * - * Revision 1.200 2008/10/26 16:53:18 fabiankeil - * Fix gcc44 warning. - * - * Revision 1.199 2008/10/26 15:36:10 fabiankeil - * Remove two debug messages with LOG_LEVEL_INFO. - * - * Revision 1.198 2008/10/22 15:19:55 fabiankeil - * Once More, With Feeling: if there is no logfile - * because the user didn't specify one, we shouldn't - * call init_error_log() after receiving SIGHUP either. - * - * Revision 1.197 2008/10/20 17:02:40 fabiankeil - * If SIGHUP is received while we aren't running in daemon - * mode, calling init_error_log() would be a mistake. - * - * Revision 1.196 2008/10/16 09:16:41 fabiankeil - * - Fix two gcc44 conversion warnings. - * - Don't bother logging the last five bytes - * of the 0-chunk. - * - * Revision 1.195 2008/10/13 16:04:37 fabiankeil - * Make sure we don't try to reuse tainted server sockets. - * - * Revision 1.194 2008/10/12 18:35:18 fabiankeil - * The last commit was a bit too ambitious, apparently the content - * length adjustment is only necessary if we aren't buffering. - * - * Revision 1.193 2008/10/12 15:57:35 fabiankeil - * Fix content length calculation if we read headers - * and the start of the body at once. Now that we have - * FEATURE_CONNECTION_KEEP_ALIVE, it actually matters. - * - * Revision 1.192 2008/10/11 18:19:14 fabiankeil - * Even more chat() cosmetics. - * - * Revision 1.191 2008/10/11 18:00:14 fabiankeil - * Reformat some comments in chat(). - * - * Revision 1.190 2008/10/11 14:58:00 fabiankeil - * In case of chunk-encoded content, stop reading if - * the buffer looks like it ends with the last chunk. - * - * Revision 1.189 2008/10/11 09:53:00 fabiankeil - * Let server_response_is_complete() deal properly with - * content that is neither buffered nor read all at once. - * - * Revision 1.188 2008/10/09 18:21:41 fabiankeil - * Flush work-in-progress changes to keep outgoing connections - * alive where possible. Incomplete and mostly #ifdef'd out. - * - * Revision 1.187 2008/09/07 12:35:05 fabiankeil - * Add mutex lock support for _WIN32. - * - * Revision 1.186 2008/09/04 08:13:58 fabiankeil - * Prepare for critical sections on Windows by adding a - * layer of indirection before the pthread mutex functions. - * - * Revision 1.185 2008/08/30 12:03:07 fabiankeil - * Remove FEATURE_COOKIE_JAR. - * - * Revision 1.184 2008/08/22 15:34:45 fabiankeil - * - Silence LLVM/Clang complaint. - * - Make received_hup_signal static. - * - Hide definitions for basedir, pidfile and received_hup_signal - * from __EMX__ as they only seem to be used in case of #ifdef unix. - * - * Revision 1.183 2008/08/21 07:09:35 fabiankeil - * Accept Shoutcast responses again. Problem reported - * and fix suggested by Stefan in #2062860. - * - * Revision 1.182 2008/06/27 11:13:56 fabiankeil - * Fix possible NULL-pointer dereference reported - * by din_a4 in #2003937. Pointy hat to me. - * - * Revision 1.181 2008/05/21 15:47:15 fabiankeil - * Streamline sed()'s prototype and declare - * the header parse and add structures static. - * - * Revision 1.180 2008/05/21 15:26:32 fabiankeil - * - Mark csp as immutable for send_crunch_response(). - * - Fix comment spelling. - * - * Revision 1.179 2008/05/20 20:13:32 fabiankeil - * Factor update_server_headers() out of sed(), ditch the - * first_run hack and make server_patterns_light static. - * - * Revision 1.178 2008/05/10 13:23:38 fabiankeil - * Don't provide get_header() with the whole client state - * structure when it only needs access to csp->iob. - * - * Revision 1.177 2008/05/10 11:51:12 fabiankeil - * Make the "read the rest of the headers" loop a bit more readable. - * - * Revision 1.176 2008/05/10 11:37:57 fabiankeil - * - Instead of logging when the IIS5 hack is enabled, log when it fails. - * - Remove useless comment. - * - * Revision 1.175 2008/05/09 18:53:59 fabiankeil - * Fix comment grammar. - * - * Revision 1.174 2008/05/07 18:05:53 fabiankeil - * Remove the pointless buffer in client_protocol_is_unsupported(). - * - * Revision 1.173 2008/05/06 15:09:00 fabiankeil - * Least-effort fix for bug #1821930 (reported by Lee): - * If the response doesn't look like HTTP, - * tell the client and log the problem. - * - * Revision 1.172 2008/04/16 16:38:21 fabiankeil - * Don't pass the whole csp structure to flush_socket() - * when it only needs a file descriptor and a buffer. - * - * Revision 1.171 2008/03/27 18:27:25 fabiankeil - * Remove kill-popups action. - * - * Revision 1.170 2008/03/06 16:33:46 fabiankeil - * If limit-connect isn't used, don't limit CONNECT requests to port 443. - * - * Revision 1.169 2008/03/04 18:30:39 fabiankeil - * Remove the treat-forbidden-connects-like-blocks action. We now - * use the "blocked" page for forbidden CONNECT requests by default. - * - * Revision 1.168 2008/03/02 12:25:25 fabiankeil - * Also use shiny new connect_port_is_forbidden() in jcc.c. - * - * Revision 1.167 2008/02/23 16:57:12 fabiankeil - * Rename url_actions() to get_url_actions() and let it - * use the standard parameter ordering. - * - * Revision 1.166 2008/02/23 16:33:43 fabiankeil - * Let forward_url() use the standard parameter ordering - * and mark its second parameter immutable. - * - * Revision 1.165 2008/02/02 19:36:56 fabiankeil - * Remove the "Listening ... for local connections only" log message. - * Whether or not remote connections are able to reach Privoxy is up - * to the operating system. - * - * Revision 1.164 2007/12/16 18:32:46 fabiankeil - * Prevent the log messages for CONNECT requests to unacceptable - * ports from printing the limit-connect argument as [null] if - * limit-connect hasn't been explicitly enabled. - * - * Revision 1.163 2007/12/13 01:47:11 david__schmidt - * Make sure all console-mode apps get a usage() instance - * - * Revision 1.162 2007/12/06 17:54:57 fabiankeil - * Reword NO_SERVER_DATA_RESPONSE to make it harder - * to misunderstand what the message is all about. - * - * Revision 1.161 2007/12/04 19:44:22 fabiankeil - * Unbreak trustfile which previously didn't work without - * FEATURE_TOGGLE. Fixes BR#1843585, reported by Lee. - * - * Revision 1.160 2007/11/29 18:00:29 fabiankeil - * Plug memory leak. Spotted by Valgrind, triggered by - * Privoxy-Regression-Test feeding proxyfuzz.py. - * - * Revision 1.159 2007/11/24 14:34:09 fabiankeil - * In the HTTP snipplets, refer to the client as client. - * - * Revision 1.158 2007/11/11 16:44:17 fabiankeil - * Emit a log message when activating the MS IIS5 hack. - * - * Revision 1.157 2007/11/03 17:34:49 fabiankeil - * Log the "weak randomization factor" warning only - * once for mingw32 and provide some more details. - * - * Revision 1.156 2007/11/01 18:20:58 fabiankeil - * Initialize log module after initializing mutexes, future - * deadlocks in that code should now work cross-platform. - * - * Revision 1.155 2007/10/23 20:12:45 fabiankeil - * Fix first CSUCCEED line to end in \r\n as required by RFC1945. - * Reported by Bert van Leeuwen in BR#1818808. - * - * Revision 1.154 2007/10/19 17:00:08 fabiankeil - * Downgrade "Flushing header and buffers" message to LOG_LEVEL_INFO. - * - * Revision 1.153 2007/10/14 14:12:41 fabiankeil - * When in daemon mode, close stderr after the configuration file has been - * parsed the first time. If logfile isn't set, stop logging. Fixes BR#897436. - * - * Revision 1.152 2007/10/04 18:03:34 fabiankeil - * - Fix a crash when parsing invalid requests whose first header - * is rejected by get_header(). Regression (re?)introduced - * in r1.143 by yours truly. - * - Move ACTION_VANILLA_WAFER handling into parsers.c's - * client_cookie_adder() to make sure send-vanilla-wafer can be - * controlled through tags (and thus regression-tested). - * - * Revision 1.151 2007/09/29 10:21:16 fabiankeil - * - Move get_filter_function() from jcc.c to filters.c - * so the filter functions can be static. - * - Don't bother filtering body-less responses. - * - * Revision 1.150 2007/09/28 16:39:29 fabiankeil - * Execute content filters through execute_content_filter(). - * - * Revision 1.149 2007/09/04 15:08:48 fabiankeil - * Initialize req to NULL to make sure it's defined if the - * first read_socket() call fails. Reported by icmp30. - * - * Revision 1.148 2007/08/26 16:47:13 fabiankeil - * Add Stephen Gildea's --pre-chroot-nslookup patch [#1276666], - * extensive comments moved to user manual. - * - * Revision 1.147 2007/08/25 14:42:40 fabiankeil - * Don't crash if a broken header filter wiped out the request line. - * - * Revision 1.146 2007/08/20 17:09:32 fabiankeil - * Fix byte_count calculation in case of flushes - * and don't parse the server headers a second time. - * - * Revision 1.145 2007/08/19 13:13:31 fabiankeil - * - If there's a connection problem after we already forwarded - * parts of the original content, just hang up. Fixes BR#1776724. - * - Fix warnings about unused code on mingw32. - * - In case of flushes, calculate the byte count - * less incorrectly (I think). - * - * Revision 1.144 2007/08/11 14:43:22 fabiankeil - * Add some more prototypes for static functions. - * - * Revision 1.143 2007/08/05 13:58:19 fabiankeil - * Comment out request_contains_null_bytes() until it's used again. - * - * Revision 1.142 2007/08/05 13:50:26 fabiankeil - * #1763173 from Stefan Huehner: s@const static@static const@ - * and declare some more functions static. - * - * Revision 1.141 2007/08/04 09:56:23 fabiankeil - * - Log rejected CONNECT requests with LOG_LEVEL_INFO - * and explain why they were rejected in the first place. - * - Fix the LOG_LEVEL_CLF message for crunches of unallowed - * CONNECT requests. The request line was missing. - * - Add two more XXX reminders as we don't have enough already. - * - * Revision 1.140 2007/07/21 11:51:36 fabiankeil - * As Hal noticed, checking dispatch_cgi() as the last cruncher - * looks like a bug if CGI requests are blocked unintentionally, - * so don't do it unless the user enabled the new config option - * "allow-cgi-request-crunching". - * - * Revision 1.139 2007/07/14 07:46:41 fabiankeil - * - Allow to rewrite the request destination behind the client's back. - * - Turn the weird-looking unconditional for loop that - * reads the client request into a conditional while loop. - * Move the stuff that only runs once out of the loop. - * - Move parts of chat(), server_content_type() and the - * necessary stuff to fix BR#1750917 into get_filter_function(). - * - * Revision 1.138 2007/06/03 18:45:18 fabiankeil - * Temporary workaround for BR#1730105. - * - * Revision 1.137 2007/06/01 18:16:36 fabiankeil - * Use the same mutex for gethostbyname() and gethostbyaddr() to prevent - * deadlocks and crashes on OpenBSD and possibly other OS with neither - * gethostbyname_r() nor gethostaddr_r(). Closes BR#1729174. - * Thanks to Ralf Horstmann for report and solution. - * - * Revision 1.136 2007/06/01 16:41:11 fabiankeil - * Add forward-override{} to change the forwarding settings through - * action sections. This is mainly interesting to forward different - * clients differently (for example based on User-Agent or request - * origin). - * - * Revision 1.135 2007/05/24 17:03:50 fabiankeil - * - Let usage() mention the --chroot parameter. - * - Use read_socket() consistently and always leave - * the last buffer byte alone, even in cases where - * null termination (currently) doesn't matter. - * - * Revision 1.134 2007/05/16 14:59:46 fabiankeil - * - Fix config file loading on Unix if no config file is specified. - * Since r1.97 Privoxy would always interpret the last argument as - * config file, even if it's a valid command line option. - * - Abort in case of unrecognized command line options. Closes #1719696. - * - Remove a bunch of unnecessary strcpy() calls (yay for c&p without thinking). - * - Replace the remaining strcpy() and strcat() calls with strlcpy() and strcat(). - * - * Revision 1.133 2007/05/04 11:23:19 fabiankeil - * - Don't rerun crunchers that only depend on the request URL. - * - Don't count redirects and CGI requests as "blocked requests". - * - * Revision 1.132 2007/04/25 15:15:17 fabiankeil - * Support crunching based on tags created by server-header taggers. - * - * Revision 1.131 2007/04/22 13:24:50 fabiankeil - * Make HTTP snippets static (again). Add a Content-Type for those - * with content so the browser doesn't guess it based on the URL. - * - * Revision 1.130 2007/04/19 13:47:34 fabiankeil - * Move crunching and request line rebuilding out of chat(). - * - * Revision 1.129 2007/04/15 16:39:20 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.128 2007/03/25 16:55:54 fabiankeil - * Don't CLF-log CONNECT requests twice. - * - * Revision 1.127 2007/03/20 13:53:17 fabiankeil - * Log the source address for ACL-related connection drops. - * - * Revision 1.126 2007/03/17 15:20:05 fabiankeil - * New config option: enforce-blocks. - * - * Revision 1.125 2007/03/09 14:12:00 fabiankeil - * - Move null byte check into separate function. - * - Don't confuse the client with error pages - * if a CONNECT request was already confirmed. - * - * Revision 1.124 2007/02/23 14:59:54 fabiankeil - * Speed up NULL byte escaping and only log the complete - * NULL byte requests with header debugging enabled. - * - * Revision 1.123 2007/02/21 18:42:10 fabiankeil - * Answer requests that contain NULL bytes with - * a custom response instead of waiting for more - * data until the client eventually hangs up. - * - * Revision 1.122 2007/02/07 11:12:02 fabiankeil - * - Move delivery and logging of crunched responses - * from chat() into send_crunch_response(). - * - Display the reason for generating http_responses. - * - Log the content length for LOG_LEVEL_CLF correctly - * (still incorrect for some fixed responses). - * - Reword an incorrect comment about - * treat-forbidden-connects-like-blocks violating - * the specs. - * - Add some log messages. - * - * Revision 1.121 2007/01/27 10:52:56 fabiankeil - * Move mutex initialization into separate - * function and exit in case of errors. - * - * Revision 1.120 2007/01/26 14:18:42 fabiankeil - * - Start to reduce chat()'s line count and move - * parts of it into separate functions. - * - Add "HTTP/1.1 100 Continue" hack for BR 756734. - * - * Revision 1.119 2007/01/25 14:02:30 fabiankeil - * - Add Proxy-Agent header to HTTP snippets that are - * supposed to reach HTTP clients only. - * - Made a few CONNECT log messages more descriptive. - * - Catch completely empty server responses (as seen - * with Tor's fake ".noconnect" top level domain). - * - Use shiny new "forwarding-failed" template for socks errors. - * - * Revision 1.118 2007/01/07 07:43:43 joergs - * AmigaOS4 support added. - * - * Revision 1.117 2006/12/31 17:56:37 fabiankeil - * Added config option accept-intercepted-requests - * and disabled it by default. - * - * Revision 1.116 2006/12/29 19:08:22 fabiankeil - * Reverted parts of my last commit - * to keep error handling working. - * - * Revision 1.115 2006/12/29 17:38:57 fabiankeil - * Fixed gcc43 conversion warnings. - * - * Revision 1.114 2006/12/27 18:52:02 fabiankeil - * Fix -pedantic ISO C warning about converting - * from function pointer to object pointer. - * - * Revision 1.113 2006/12/26 17:38:50 fabiankeil - * Silence compiler warning I introduced with my last commit. - * - * Revision 1.112 2006/12/26 17:31:41 fabiankeil - * Mutex protect rand() if POSIX threading - * is used, warn the user if that's not possible - * and stop using it on _WIN32 where it could - * cause crashes. - * - * Revision 1.111 2006/12/23 16:15:06 fabiankeil - * Don't prevent core dumps by catching SIGABRT. - * It's rude and makes debugging unreasonable painful. - * - * Revision 1.110 2006/12/13 14:52:53 etresoft - * Fix build failure on MacOS X. Global symbols can be either static or extern, but not both. - * - * Revision 1.109 2006/12/06 19:41:40 fabiankeil - * Privoxy is now able to run as intercepting - * proxy in combination with any packet filter - * that does the port redirection. The destination - * is extracted from the "Host:" header which - * should be available for nearly all requests. - * - * Moved HTTP snipplets into jcc.c. - * Added error message for gopher proxy requests. - * - * Revision 1.108 2006/11/28 15:38:51 fabiankeil - * Only unlink the pidfile if it's actually used. - * - * Change order of interception checks to make - * it possible to block or redirect requests for - * the cgi pages. - * - * Revision 1.107 2006/11/13 19:05:51 fabiankeil - * Make pthread mutex locking more generic. Instead of - * checking for OSX and OpenBSD, check for FEATURE_PTHREAD - * and use mutex locking unless there is an _r function - * available. Better safe than sorry. - * - * Fixes "./configure --disable-pthread" and should result - * in less threading-related problems on pthread-using platforms, - * but it still doesn't fix BR#1122404. - * - * Revision 1.106 2006/11/06 19:58:23 fabiankeil - * Move pthread.h inclusion from jcc.c to jcc.h. - * Fixes build on x86-freebsd1 (FreeBSD 5.4-RELEASE). - * - * Revision 1.105 2006/11/06 14:26:02 fabiankeil - * Don't exit after receiving the second SIGHUP on Solaris. - * - * Fixes BR 1052235, but the same problem may exist on other - * systems. Once 3.0.6 is out we should use sigset() - * where available and see if it breaks anything. - * - * Revision 1.104 2006/09/23 13:26:38 roro - * Replace TABs by spaces in source code. - * - * Revision 1.103 2006/09/21 12:54:43 fabiankeil - * Fix +redirect{}. Didn't work with -fast-redirects. - * - * Revision 1.102 2006/09/06 13:03:04 fabiankeil - * Respond with 400 and a short text message - * if the client tries to use Privoxy as FTP proxy. - * - * Revision 1.101 2006/09/06 09:23:37 fabiankeil - * Make number of retries in case of forwarded-connect problems - * a config file option (forwarded-connect-retries) and use 0 as - * default. - * - * Revision 1.100 2006/09/03 19:42:59 fabiankeil - * Set random(3) seed. - * - * Revision 1.99 2006/09/02 15:36:42 fabiankeil - * Follow the OpenBSD port's lead and protect the resolve - * functions on OpenBSD as well. - * - * Revision 1.98 2006/08/24 11:01:34 fabiankeil - * --user fix. Only use the user as group if no group is specified. - * Solves BR 1492612. Thanks to Spinor S. and David Laight. - * - * Revision 1.97 2006/08/18 15:23:17 david__schmidt - * Windows service (re-)integration - * - * The new args are: - * - * --install[:service_name] - * --uninstall[:service_name] - * --service - * - * They work as follows: - * --install will create a service for you and then terminate. - * By default the service name will be "privoxy" (without the quotes). - * However you can run multiple services if you wish, just by adding - * a colon and then a name (no spaces). - * - * --uninstall follows the exact same rules a --install. - * - * --service is used when the program is executed by the service - * control manager, and in normal circumstances would never be - * used as a command line argument. - * - * Revision 1.96 2006/08/15 20:12:36 david__schmidt - * Windows service integration - * - * Revision 1.95 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work: -http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.94 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.92.2.16 2005/04/03 20:10:50 david__schmidt - * Thanks to Jindrich Makovicka for a race condition fix for the log - * file. The race condition remains for non-pthread implementations. - * Reference patch #1175720. - * - * Revision 1.92.2.15 2004/10/03 12:53:32 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.92.2.14 2003/12/12 12:52:53 oes - * - Fixed usage info for non-unix platforms - * - Fixed small cmdline parsing bug - * - * Revision 1.92.2.13 2003/11/27 19:20:27 oes - * Diagnostics: Now preserve the returncode of pthread_create - * in errno. Closes BR #775721. Thanks to Geoffrey Hausheer. - * - * Revision 1.92.2.12 2003/07/11 11:34:19 oes - * No longer ignore SIGCHLD. Fixes bug #769381 - * - * Revision 1.92.2.11 2003/05/14 12:32:02 oes - * Close jarfile on graceful exit, remove stray line - * - * Revision 1.92.2.10 2003/05/08 15:13:46 oes - * Cosmetics: Killed a warning, a typo and an allocation left at exit - * - * Revision 1.92.2.9 2003/04/03 15:08:42 oes - * No longer rely on non-POSIX.1 extensions of getcwd(). - * Fixes bug #711001 - * - * Revision 1.92.2.8 2003/03/31 13:12:32 oes - * Replaced setenv() by posix-compliant putenv() - * Thanks to Neil McCalden (nmcc AT users.sf.net). - * - * Revision 1.92.2.7 2003/03/17 16:48:59 oes - * Added chroot ability, thanks to patch by Sviatoslav Sviridov - * - * Revision 1.92.2.6 2003/03/11 11:55:00 oes - * Clean-up and extension of improvements for forked mode: - * - Child's return code now consists of flags RC_FLAG_* - * - Reporting toggle to parent now properly #ifdef'ed - * - Children now report blocking to parent. This enables - * statistics in forked mode - * - * Revision 1.92.2.5 2003/03/10 23:45:32 oes - * Fixed bug #700381: Non-Threaded version now capable of being toggled. - * Children now report having been toggled through _exit(17), parents - * watch for that code and toggle themselves if found. - * - * Revision 1.92.2.4 2003/03/07 03:41:04 david__schmidt - * Wrapping all *_r functions (the non-_r versions of them) with - * mutex semaphores for OSX. Hopefully this will take care of all - * of those pesky crash reports. - * - * Revision 1.92.2.3 2003/02/28 12:53:06 oes - * Fixed two mostly harmless mem leaks - * - * Revision 1.92.2.2 2002/11/20 14:37:47 oes - * Fix: Head of global clients list now initialized to NULL - * - * Revision 1.92.2.1 2002/09/25 14:52:24 oes - * Added basic support for OPTIONS and TRACE HTTP methods: - * - New interceptor direct_response() added in chat(). - * - sed() moved to earlier in the process, so that the - * Host: header is evaluated before actions and forwarding - * are decided on. - * - * Revision 1.92 2002/05/08 16:00:46 oes - * Chat's buffer handling: - * - Fixed bug with unchecked out-of-mem conditions - * while reading client request & server headers - * - No longer predict if the buffer limit will be exceeded - * in the next read -- check add_to_iob's new - * return code. If buffer couldn't be extended - * (policy or out-of-mem) while - * - reading from client: abort - * - reading server headers: send error page - * - buffering server body for filter: flush, - * and if that fails: send error page - * - * Revision 1.91 2002/04/08 20:35:58 swa - * fixed JB spelling - * - * Revision 1.90 2002/04/02 14:57:28 oes - * Made sending wafers independent of FEATURE_COOKIE_JAR - * - * Revision 1.89 2002/03/31 17:18:59 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.88 2002/03/27 14:32:43 david__schmidt - * More compiler warning message maintenance - * - * 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, - * block, trust, fast_redirect) in one - * place, with one (CGI) answer generation - * mechansim. Much clearer now. - * - Removed the GIF image generation, which - * is now done in filters.c:block_url() - * - Made error conditions like domain lookup - * failiure or (various) problems while talking - * to the server use cgi.c:error_response() - * instead of generating HTML/HTTP in chat() (yuck!) - * - Removed logentry from cancelled commit - * - * Revision 1.20 2001/06/09 10:55:28 jongfoster - * Changing BUFSIZ ==> BUFFER_SIZE - * - * Revision 1.19 2001/06/07 23:12:52 jongfoster - * Replacing function pointer in struct gateway with a directly - * called function forwarded_connect(). - * Replacing struct gateway with struct forward_spec - * - * Revision 1.18 2001/06/03 19:12:16 oes - * introduced new cgi handling - * - * Revision 1.17 2001/06/01 20:07:23 jongfoster - * Now uses action +image-blocker{} rather than config->tinygif - * - * Revision 1.16 2001/06/01 18:49:17 jongfoster - * Replaced "list_share" with "list" - the tiny memory gain was not - * worth the extra complexity. - * - * Revision 1.15 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.14 2001/05/29 20:14:01 joergs - * AmigaOS bugfix: PCRS needs a lot of stack, stacksize for child threads - * increased. - * - * Revision 1.13 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.12 2001/05/27 22:17:04 oes - * - * - re_process_buffer no longer writes the modified buffer - * to the client, which was very ugly. It now returns the - * buffer, which it is then written by chat. - * - * - content_length now adjusts the Content-Length: header - * for modified documents rather than crunch()ing it. - * (Length info in csp->content_length, which is 0 for - * unmodified documents) - * - * - For this to work, sed() is called twice when filtering. - * - * Revision 1.11 2001/05/26 17:27:53 jongfoster - * Added support for CLF and fixed LOG_LEVEL_LOG. - * Also did CRLF->LF fix of my previous patch. - * - * Revision 1.10 2001/05/26 15:26:15 jongfoster - * ACL feature now provides more security by immediately dropping - * connections from untrusted hosts. - * - * Revision 1.9 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.8 2001/05/25 22:43:18 jongfoster - * Fixing minor memory leak and buffer overflow. - * - * Revision 1.7 2001/05/25 22:34:30 jongfoster - * Hard tabs->Spaces - * - * Revision 1.6 2001/05/23 00:13:58 joergs - * AmigaOS support fixed. - * - * Revision 1.5 2001/05/22 18:46:04 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/21 19:34:01 jongfoster - * Made failure to bind() a fatal error. - * - * 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 22:34:44 oes - * - Added hint on GIF char array generation to jcc.c - * - Cleaned CRLF's from the sources and related files - * - Repaired logging for REF and FRC - * - * Revision 1.1.1.1 2001/05/15 13:58:56 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> -#include <stdlib.h> -#include <string.h> -#include <signal.h> -#include <fcntl.h> -#include <errno.h> -#include <assert.h> - -#ifdef _WIN32 -# ifndef FEATURE_PTHREAD -# ifndef STRICT -# define STRICT -# endif -# include <windows.h> -# include <process.h> -# endif /* ndef FEATURE_PTHREAD */ - -# include "win32.h" -# ifndef _WIN_CONSOLE -# include "w32log.h" -# endif /* ndef _WIN_CONSOLE */ -# include "w32svrapi.h" - -#else /* ifndef _WIN32 */ - -# if !defined (__OS2__) -# include <unistd.h> -# include <sys/wait.h> -# endif /* ndef __OS2__ */ -# include <sys/time.h> -# include <sys/stat.h> -# include <sys/ioctl.h> - -#ifdef sun -#include <sys/termios.h> -#endif /* sun */ - -#ifdef unix -#include <pwd.h> -#include <grp.h> -#endif - -# include <signal.h> - -# ifdef __BEOS__ -# include <socket.h> /* BeOS has select() for sockets only. */ -# include <OS.h> /* declarations for threads and stuff. */ -# endif - -# if defined(__EMX__) || defined(__OS2__) -# include <sys/select.h> /* OS/2/EMX needs a little help with select */ -# endif -# ifdef __OS2__ -#define INCL_DOS -# include <os2.h> -#define bzero(B,N) memset(B,0x00,n) -# endif - -# ifndef FD_ZERO -# include <select.h> -# endif - -#endif - -#include "project.h" -#include "list.h" -#include "jcc.h" -#include "filters.h" -#include "loaders.h" -#include "parsers.h" -#include "miscutil.h" -#include "errlog.h" -#include "jbsockets.h" -#include "gateway.h" -#include "actions.h" -#include "cgi.h" -#include "loadcfg.h" -#include "urlmatch.h" - -const char jcc_h_rcs[] = JCC_H_VERSION; -const char project_h_rcs[] = PROJECT_H_VERSION; - -int no_daemon = 0; -struct client_state clients[1]; -struct file_list files[1]; - -#ifdef FEATURE_STATISTICS -int urls_read = 0; /* total nr of urls read inc rejected */ -int urls_rejected = 0; /* total nr of urls rejected */ -#endif /* def FEATURE_STATISTICS */ - -#ifdef FEATURE_GRACEFUL_TERMINATION -int g_terminate = 0; -#endif - -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) -static void sig_handler(int the_signal); -#endif -static int client_protocol_is_unsupported(const struct client_state *csp, char *req); -static jb_err get_request_destination_elsewhere(struct client_state *csp, struct list *headers); -static jb_err get_server_headers(struct client_state *csp); -static const char *crunch_reason(const struct http_response *rsp); -static void send_crunch_response(const struct client_state *csp, struct http_response *rsp); -static char *get_request_line(struct client_state *csp); -static jb_err receive_client_request(struct client_state *csp); -static jb_err parse_client_request(struct client_state *csp); -static void build_request_line(struct client_state *csp, const struct forward_spec *fwd, char **request_line); -static jb_err change_request_destination(struct client_state *csp); -static void chat(struct client_state *csp); -static void serve(struct client_state *csp); -#if !defined(_WIN32) || defined(_WIN_CONSOLE) -static void usage(const char *myname); -#endif -static void initialize_mutexes(void); -static jb_socket bind_port_helper(struct configuration_spec *config); -static void listen_loop(void); - -#ifdef AMIGA -void serve(struct client_state *csp); -#else /* ifndef AMIGA */ -static void serve(struct client_state *csp); -#endif /* def AMIGA */ - -#ifdef __BEOS__ -static int32 server_thread(void *data); -#endif /* def __BEOS__ */ - -#ifdef _WIN32 -#define sleep(N) Sleep(((N) * 1000)) -#endif - -#ifdef __OS2__ -#define sleep(N) DosSleep(((N) * 100)) -#endif - -#ifdef MUTEX_LOCKS_AVAILABLE -/* - * XXX: Does the locking stuff really belong in this file? - */ -privoxy_mutex_t log_mutex; -privoxy_mutex_t log_init_mutex; -privoxy_mutex_t connection_reuse_mutex; - -#if !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R) -privoxy_mutex_t resolver_mutex; -#endif /* !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R) */ - -#ifndef HAVE_GMTIME_R -privoxy_mutex_t gmtime_mutex; -#endif /* ndef HAVE_GMTIME_R */ - -#ifndef HAVE_LOCALTIME_R -privoxy_mutex_t localtime_mutex; -#endif /* ndef HAVE_GMTIME_R */ - -#ifndef HAVE_RANDOM -privoxy_mutex_t rand_mutex; -#endif /* ndef HAVE_RANDOM */ - -#endif /* def MUTEX_LOCKS_AVAILABLE */ - -#if defined(unix) -const char *basedir = NULL; -const char *pidfile = NULL; -static int received_hup_signal = 0; -#endif /* defined unix */ - -/* HTTP snipplets. */ -static const char CSUCCEED[] = - "HTTP/1.0 200 Connection established\r\n" - "Proxy-Agent: Privoxy/" VERSION "\r\n\r\n"; - -static const char CHEADER[] = - "HTTP/1.0 400 Invalid header received from client\r\n" - "Proxy-Agent: Privoxy " VERSION "\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Invalid header received from client.\r\n"; - -static const char FTP_RESPONSE[] = - "HTTP/1.0 400 Invalid request received from client\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Invalid request. Privoxy doesn't support FTP.\r\n"; - -static const char GOPHER_RESPONSE[] = - "HTTP/1.0 400 Invalid request received from client\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Invalid request. Privoxy doesn't support gopher.\r\n"; - -/* XXX: should be a template */ -static const char MISSING_DESTINATION_RESPONSE[] = - "HTTP/1.0 400 Bad request received from client\r\n" - "Proxy-Agent: Privoxy " VERSION "\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Bad request. Privoxy was unable to extract the destination.\r\n"; - -/* XXX: should be a template */ -static const char NO_SERVER_DATA_RESPONSE[] = - "HTTP/1.0 502 Server or forwarder response empty\r\n" - "Proxy-Agent: Privoxy " VERSION "\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Empty server or forwarder response.\r\n" - "The connection has been closed but Privoxy didn't receive any data.\r\n"; - -/* XXX: should be a template */ -static const char INVALID_SERVER_HEADERS_RESPONSE[] = - "HTTP/1.0 502 Server or forwarder response invalid\r\n" - "Proxy-Agent: Privoxy " VERSION "\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Bad response. The server or forwarder response doesn't look like HTTP.\r\n"; - -#if 0 -/* XXX: should be a template */ -static const char NULL_BYTE_RESPONSE[] = - "HTTP/1.0 400 Bad request received from client\r\n" - "Proxy-Agent: Privoxy " VERSION "\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Bad request. Null byte(s) before end of request.\r\n"; -#endif - -/* XXX: should be a template */ -static const char MESSED_UP_REQUEST_RESPONSE[] = - "HTTP/1.0 400 Malformed request after rewriting\r\n" - "Proxy-Agent: Privoxy " VERSION "\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "Bad request. Messed up with header filters.\r\n"; - -/* XXX: should be a template */ -static const char CONNECTION_TIMEOUT_RESPONSE[] = - "HTTP/1.0 502 Connection timeout\r\n" - "Proxy-Agent: Privoxy " VERSION "\r\n" - "Content-Type: text/plain\r\n" - "Connection: close\r\n\r\n" - "The connection timed out.\r\n"; - -/* A function to crunch a response */ -typedef struct http_response *(*crunch_func_ptr)(struct client_state *); - -/* Crunch function flags */ -#define CF_NO_FLAGS 0 -/* Cruncher applies to forced requests as well */ -#define CF_IGNORE_FORCE 1 -/* Crunched requests are counted for the block statistics */ -#define CF_COUNT_AS_REJECT 2 - -/* A crunch function and its flags */ -struct cruncher -{ - const crunch_func_ptr cruncher; - const int flags; -}; - -static int crunch_response_triggered(struct client_state *csp, const struct cruncher crunchers[]); - -/* Complete list of cruncher functions */ -static const struct cruncher crunchers_all[] = { - { direct_response, CF_COUNT_AS_REJECT|CF_IGNORE_FORCE}, - { block_url, CF_COUNT_AS_REJECT }, -#ifdef FEATURE_TRUST - { trust_url, CF_COUNT_AS_REJECT }, -#endif /* def FEATURE_TRUST */ - { redirect_url, CF_NO_FLAGS }, - { dispatch_cgi, CF_IGNORE_FORCE}, - { NULL, 0 } -}; - -/* Light version, used after tags are applied */ -static const struct cruncher crunchers_light[] = { - { block_url, CF_COUNT_AS_REJECT }, - { redirect_url, CF_NO_FLAGS }, - { NULL, 0 } -}; - - -/* - * XXX: Don't we really mean - * - * #if defined(unix) - * - * here? - */ -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) -/********************************************************************* - * - * Function : sig_handler - * - * Description : Signal handler for different signals. - * Exit gracefully on 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 SIGTERM: - case SIGINT: - log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal); -#if defined(unix) - if(pidfile) - { - unlink(pidfile); - } -#endif /* unix */ - exit(the_signal); - break; - - case SIGHUP: -#if defined(unix) - received_hup_signal = 1; -#endif - 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 : client_protocol_is_unsupported - * - * Description : Checks if the client used a known unsupported - * protocol and deals with it by sending an error - * response. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : req = the first request line send by the client - * - * Returns : TRUE if an error response has been generated, or - * FALSE if the request doesn't look invalid. - * - *********************************************************************/ -static int client_protocol_is_unsupported(const struct client_state *csp, char *req) -{ - /* - * If it's a FTP or gopher request, we don't support it. - * - * These checks are better than nothing, but they might - * not work in all configurations and some clients might - * have problems digesting the answer. - * - * They should, however, never cause more problems than - * Privoxy's old behaviour (returning the misleading HTML - * error message: - * - * "Could not resolve http://(ftp%7Cgopher)://example.org"). - */ - if (!strncmpic(req, "GET ftp://", 10) || !strncmpic(req, "GET gopher://", 13)) - { - const char *response = NULL; - const char *protocol = NULL; - - if (!strncmpic(req, "GET ftp://", 10)) - { - response = FTP_RESPONSE; - protocol = "FTP"; - } - else - { - response = GOPHER_RESPONSE; - protocol = "GOPHER"; - } - log_error(LOG_LEVEL_ERROR, - "%s tried to use Privoxy as %s proxy: %s", - csp->ip_addr_str, protocol, req); - log_error(LOG_LEVEL_CLF, - "%s - - [%T] "%s" 400 0", csp->ip_addr_str, req); - freez(req); - write_socket(csp->cfd, response, strlen(response)); - - return TRUE; - } - - return FALSE; -} - - -/********************************************************************* - * - * Function : get_request_destination_elsewhere - * - * Description : If the client's request was redirected into - * Privoxy without the client's knowledge, - * the request line lacks the destination host. - * - * This function tries to get it elsewhere, - * provided accept-intercepted-requests is enabled. - * - * "Elsewhere" currently only means "Host: header", - * but in the future we may ask the redirecting - * packet filter to look the destination up. - * - * If the destination stays unknown, an error - * response is send to the client and headers - * are freed so that chat() can return directly. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : headers = a header list - * - * Returns : JB_ERR_OK if the destination is now known, or - * JB_ERR_PARSE if it isn't. - * - *********************************************************************/ -static jb_err get_request_destination_elsewhere(struct client_state *csp, struct list *headers) -{ - char *req; - - if (!(csp->config->feature_flags & RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS)) - { - log_error(LOG_LEVEL_ERROR, "%s's request: '%s' is invalid." - " Privoxy isn't configured to accept intercepted requests.", - csp->ip_addr_str, csp->http->cmd); - /* XXX: Use correct size */ - log_error(LOG_LEVEL_CLF, "%s - - [%T] "%s" 400 0", - csp->ip_addr_str, csp->http->cmd); - - write_socket(csp->cfd, CHEADER, strlen(CHEADER)); - destroy_list(headers); - - return JB_ERR_PARSE; - } - else if (JB_ERR_OK == get_destination_from_headers(headers, csp->http)) - { - /* Split the domain we just got for pattern matching */ - init_domain_components(csp->http); - - return JB_ERR_OK; - } - else - { - /* We can't work without destination. Go spread the news.*/ - - req = list_to_text(headers); - chomp(req); - /* XXX: Use correct size */ - log_error(LOG_LEVEL_CLF, "%s - - [%T] "%s" 400 0", - csp->ip_addr_str, csp->http->cmd); - log_error(LOG_LEVEL_ERROR, - "Privoxy was unable to get the destination for %s's request:\n%s\n%s", - csp->ip_addr_str, csp->http->cmd, req); - freez(req); - - write_socket(csp->cfd, MISSING_DESTINATION_RESPONSE, strlen(MISSING_DESTINATION_RESPONSE)); - destroy_list(headers); - - return JB_ERR_PARSE; - } - /* - * TODO: If available, use PF's ioctl DIOCNATLOOK as last resort - * to get the destination IP address, use it as host directly - * or do a reverse DNS lookup first. - */ -} - - -/********************************************************************* - * - * Function : get_server_headers - * - * Description : Parses server headers in iob and fills them - * into csp->headers so that they can later be - * handled by sed(). - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK if everything went fine, or - * JB_ERR_PARSE if the headers were incomplete. - * - *********************************************************************/ -static jb_err get_server_headers(struct client_state *csp) -{ - int continue_hack_in_da_house = 0; - char * header; - - while (((header = get_header(csp->iob)) != NULL) || continue_hack_in_da_house) - { - if (header == NULL) - { - /* - * continue hack in da house. Ignore the ending of - * this head and continue enlisting header lines. - * The reason is described below. - */ - enlist(csp->headers, ""); - continue_hack_in_da_house = 0; - continue; - } - else if (0 == strncmpic(header, "HTTP/1.1 100", 12)) - { - /* - * It's a bodyless continue response, don't - * stop header parsing after reaching its end. - * - * As a result Privoxy will concatenate the - * next response's head and parse and deliver - * the headers as if they belonged to one request. - * - * The client will separate them because of the - * empty line between them. - * - * XXX: What we're doing here is clearly against - * the intended purpose of the continue header, - * and under some conditions (HTTP/1.0 client request) - * it's a standard violation. - * - * Anyway, "sort of against the spec" is preferable - * to "always getting confused by Continue responses" - * (Privoxy's behaviour before this hack was added) - */ - log_error(LOG_LEVEL_HEADER, "Continue hack in da house."); - continue_hack_in_da_house = 1; - } - else if (*header == '\0') - { - /* - * If the header is empty, but the Continue hack - * isn't active, we can assume that we reached the - * end of the buffer before we hit the end of the - * head. - * - * Inform the caller an let it decide how to handle it. - */ - return JB_ERR_PARSE; - } - - if (JB_ERR_MEMORY == enlist(csp->headers, header)) - { - /* - * XXX: Should we quit the request and return a - * out of memory error page instead? - */ - log_error(LOG_LEVEL_ERROR, - "Out of memory while enlisting server headers. %s lost.", - header); - } - freez(header); - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : crunch_reason - * - * Description : Translates the crunch reason code into a string. - * - * Parameters : - * 1 : rsp = a http_response - * - * Returns : A string with the crunch reason or an error description. - * - *********************************************************************/ -static const char *crunch_reason(const struct http_response *rsp) -{ - char * reason = NULL; - - assert(rsp != NULL); - if (rsp == NULL) - { - return "Internal error while searching for crunch reason"; - } - - switch (rsp->reason) - { - case RSP_REASON_UNSUPPORTED: - reason = "Unsupported HTTP feature"; - break; - case RSP_REASON_BLOCKED: - reason = "Blocked"; - break; - case RSP_REASON_UNTRUSTED: - reason = "Untrusted"; - break; - case RSP_REASON_REDIRECTED: - reason = "Redirected"; - break; - case RSP_REASON_CGI_CALL: - reason = "CGI Call"; - break; - case RSP_REASON_NO_SUCH_DOMAIN: - reason = "DNS failure"; - break; - case RSP_REASON_FORWARDING_FAILED: - reason = "Forwarding failed"; - break; - case RSP_REASON_CONNECT_FAILED: - reason = "Connection failure"; - break; - case RSP_REASON_OUT_OF_MEMORY: - reason = "Out of memory (may mask other reasons)"; - break; - default: - reason = "No reason recorded"; - break; - } - - return reason; -} - - -/********************************************************************* - * - * Function : send_crunch_response - * - * Description : Delivers already prepared response for - * intercepted requests, logs the interception - * and frees the response. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 1 : rsp = Fully prepared response. Will be freed on exit. - * - * Returns : Nothing. - * - *********************************************************************/ -static void send_crunch_response(const struct client_state *csp, struct http_response *rsp) -{ - const struct http_request *http = csp->http; - char status_code[4]; - - assert(rsp != NULL); - assert(rsp->head != NULL); - - if (rsp == NULL) - { - /* - * Not supposed to happen. If it does - * anyway, treat it as an unknown error. - */ - cgi_error_unknown(csp, rsp, RSP_REASON_INTERNAL_ERROR); - /* return code doesn't matter */ - } - - if (rsp == NULL) - { - /* If rsp is still NULL, we have serious internal problems. */ - log_error(LOG_LEVEL_FATAL, - "NULL response in send_crunch_response and cgi_error_unknown failed as well."); - } - - /* - * Extract the status code from the actual head - * that was send to the client. It is the only - * way to get it right for all requests, including - * the fixed ones for out-of-memory problems. - * - * A head starts like this: 'HTTP/1.1 200...' - * 0123456789|11 - * 10 - */ - status_code[0] = rsp->head[9]; - status_code[1] = rsp->head[10]; - status_code[2] = rsp->head[11]; - status_code[3] = '\0'; - - /* 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)) - { - /* There is nothing we can do about it. */ - log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", csp->http->host); - } - - /* Log that the request was crunched and why. */ - log_error(LOG_LEVEL_CRUNCH, "%s: %s", crunch_reason(rsp), http->url); - log_error(LOG_LEVEL_CLF, "%s - - [%T] "%s" %s %u", - csp->ip_addr_str, http->ocmd, status_code, rsp->content_length); - - /* Clean up and return */ - if (cgi_error_memory() != rsp) - { - free_http_response(rsp); - } - return; -} - - -#if 0 -/********************************************************************* - * - * Function : request_contains_null_bytes - * - * Description : Checks for NULL bytes in the request and sends - * an error message to the client if any were found. - * - * XXX: currently not used, see comment in chat(). - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : buf = Data from the client's request to check. - * 3 : len = The data length. - * - * Returns : TRUE if the request contained one or more NULL bytes, or - * FALSE otherwise. - * - *********************************************************************/ -static int request_contains_null_bytes(const struct client_state *csp, char *buf, int len) -{ - size_t c_len; /* Request lenght when treated as C string */ - - c_len = strlen(buf); - - if (c_len < len) - { - /* - * Null byte(s) found. Log the request, - * return an error response and hang up. - */ - size_t tmp_len = c_len; - - do - { - /* - * Replace NULL byte(s) with '°' characters - * so the request can be logged as string. - * XXX: Is there a better replacement character? - */ - buf[tmp_len]='°'; - tmp_len += strlen(buf+tmp_len); - } while (tmp_len < len); - - log_error(LOG_LEVEL_ERROR, "%s's request contains at least one NULL byte " - "(length=%d, strlen=%u).", csp->ip_addr_str, len, c_len); - log_error(LOG_LEVEL_HEADER, - "Offending request data with NULL bytes turned into '°' characters: %s", buf); - - write_socket(csp->cfd, NULL_BYTE_RESPONSE, strlen(NULL_BYTE_RESPONSE)); - - /* XXX: Log correct size */ - log_error(LOG_LEVEL_CLF, "%s - - [%T] "Invalid request" 400 0", csp->ip_addr_str); - - return TRUE; - } - - return FALSE; -} -#endif - - -/********************************************************************* - * - * Function : crunch_response_triggered - * - * Description : Checks if the request has to be crunched, - * and delivers the crunch response if necessary. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : crunchers = list of cruncher functions to run - * - * Returns : TRUE if the request was answered with a crunch response - * FALSE otherwise. - * - *********************************************************************/ -static int crunch_response_triggered(struct client_state *csp, const struct cruncher crunchers[]) -{ - struct http_response *rsp = NULL; - const struct cruncher *c; - - /* - * If CGI request crunching is disabled, - * check the CGI dispatcher out of order to - * prevent unintentional blocks or redirects. - */ - if (!(csp->config->feature_flags & RUNTIME_FEATURE_CGI_CRUNCHING) - && (NULL != (rsp = dispatch_cgi(csp)))) - { - /* Deliver, log and free the interception response. */ - send_crunch_response(csp, rsp); - return TRUE; - } - - for (c = crunchers; c->cruncher != NULL; c++) - { - /* - * Check the cruncher if either Privoxy is toggled - * on and the request isn't forced, or if the cruncher - * applies to forced requests as well. - */ - if (((csp->flags & CSP_FLAG_TOGGLED_ON) && - !(csp->flags & CSP_FLAG_FORCED)) || - (c->flags & CF_IGNORE_FORCE)) - { - rsp = c->cruncher(csp); - if (NULL != rsp) - { - /* Deliver, log and free the interception response. */ - send_crunch_response(csp, rsp); -#ifdef FEATURE_STATISTICS - if (c->flags & CF_COUNT_AS_REJECT) - { - csp->flags |= CSP_FLAG_REJECTED; - } -#endif /* def FEATURE_STATISTICS */ - - return TRUE; - } - } - } - - return FALSE; -} - - -/********************************************************************* - * - * Function : build_request_line - * - * Description : Builds the HTTP request line. - * - * If a HTTP forwarder is used it expects the whole URL, - * web servers only get the path. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : fwd = The forwarding spec used for the request - * XXX: Should use http->fwd instead. - * 3 : request_line = The old request line which will be replaced. - * - * Returns : Nothing. Terminates in case of memory problems. - * - *********************************************************************/ -static void build_request_line(struct client_state *csp, const struct forward_spec *fwd, char **request_line) -{ - struct http_request *http = csp->http; - - assert(http->ssl == 0); - - /* - * Downgrade http version from 1.1 to 1.0 - * if +downgrade action applies. - */ - if ( (csp->action->flags & ACTION_DOWNGRADE) - && (!strcmpic(http->ver, "HTTP/1.1"))) - { - freez(http->ver); - http->ver = strdup("HTTP/1.0"); - - if (http->ver == NULL) - { - log_error(LOG_LEVEL_FATAL, "Out of memory downgrading HTTP version"); - } - } - - /* - * Rebuild the request line. - */ - freez(*request_line); - *request_line = strdup(http->gpc); - string_append(request_line, " "); - - if (fwd->forward_host) - { - string_append(request_line, http->url); - } - else - { - string_append(request_line, http->path); - } - string_append(request_line, " "); - string_append(request_line, http->ver); - - if (*request_line == NULL) - { - log_error(LOG_LEVEL_FATAL, "Out of memory writing HTTP command"); - } - log_error(LOG_LEVEL_HEADER, "New HTTP Request-Line: %s", *request_line); -} - - -/********************************************************************* - * - * Function : change_request_destination - * - * Description : Parse a (rewritten) request line and regenerate - * the http request data. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : Forwards the parse_http_request() return code. - * Terminates in case of memory problems. - * - *********************************************************************/ -static jb_err change_request_destination(struct client_state *csp) -{ - struct http_request *http = csp->http; - jb_err err; - - log_error(LOG_LEVEL_INFO, "Rewrite detected: %s", csp->headers->first->str); - free_http_request(http); - err = parse_http_request(csp->headers->first->str, http); - if (JB_ERR_OK != err) - { - log_error(LOG_LEVEL_ERROR, "Couldn't parse rewritten request: %s.", - jb_err_to_string(err)); - } - else - { - /* XXX: ocmd is a misleading name */ - http->ocmd = strdup(http->cmd); - if (http->ocmd == NULL) - { - log_error(LOG_LEVEL_FATAL, - "Out of memory copying rewritten HTTP request line"); - } - } - - return err; -} - - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE -/********************************************************************* - * - * Function : server_response_is_complete - * - * Description : Determines whether we should stop reading - * from the server socket. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : content_length = Length of content received so far. - * - * Returns : TRUE if the response is complete, - * FALSE otherwise. - * - *********************************************************************/ -static int server_response_is_complete(struct client_state *csp, - unsigned long long content_length) -{ - int content_length_known = !!(csp->flags & CSP_FLAG_CONTENT_LENGTH_SET); - - if (!strcmpic(csp->http->gpc, "HEAD")) - { - /* - * "HEAD" implies no body, we are thus expecting - * no content. XXX: incomplete "list" of methods? - */ - csp->expected_content_length = 0; - content_length_known = TRUE; - } - - if (csp->http->status == 304) - { - /* - * Expect no body. XXX: incomplete "list" of status codes? - */ - csp->expected_content_length = 0; - content_length_known = TRUE; - } - - return (content_length_known && ((0 == csp->expected_content_length) - || (csp->expected_content_length <= content_length))); -} - - -/********************************************************************* - * - * Function : wait_for_alive_connections - * - * Description : Waits for alive connections to timeout. - * - * Parameters : N/A - * - * Returns : N/A - * - *********************************************************************/ -static void wait_for_alive_connections() -{ - int connections_alive = close_unusable_connections(); - - while (0 < connections_alive) - { - log_error(LOG_LEVEL_CONNECT, - "Waiting for %d connections to timeout.", - connections_alive); - sleep(60); - connections_alive = close_unusable_connections(); - } - - log_error(LOG_LEVEL_CONNECT, "No connections to wait for left."); - -} -#endif /* FEATURE_CONNECTION_KEEP_ALIVE */ - - -/********************************************************************* - * - * Function : mark_server_socket_tainted - * - * Description : Makes sure we don't reuse a server socket - * (if we didn't read everything the server sent - * us reusing the socket would lead to garbage). - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : void. - * - *********************************************************************/ -static void mark_server_socket_tainted(struct client_state *csp) -{ - if ((csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE)) - { - log_error(LOG_LEVEL_CONNECT, "Unsetting keep-alive flag."); - csp->flags &= ~CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE; - } -} - -/********************************************************************* - * - * Function : get_request_line - * - * Description : Read the client request line. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : Pointer to request line or NULL in case of errors. - * - *********************************************************************/ -static char *get_request_line(struct client_state *csp) -{ - char buf[BUFFER_SIZE]; - char *request_line = NULL; - int len; - - memset(buf, 0, sizeof(buf)); - - do - { - if (!data_is_available(csp->cfd, csp->config->socket_timeout)) - { - log_error(LOG_LEVEL_ERROR, - "Stopped waiting for the request line."); - write_socket(csp->cfd, CONNECTION_TIMEOUT_RESPONSE, - strlen(CONNECTION_TIMEOUT_RESPONSE)); - return NULL; - } - - len = read_socket(csp->cfd, buf, sizeof(buf) - 1); - - if (len <= 0) return NULL; - - /* - * If there is no memory left for buffering the - * request, there is nothing we can do but hang up - */ - if (add_to_iob(csp, buf, len)) - { - return NULL; - } - - request_line = get_header(csp->iob); - - } while ((NULL != request_line) && ('\0' == *request_line)); - - return request_line; - -} - - -/********************************************************************* - * - * Function : receive_client_request - * - * Description : Read the client's request (more precisely the - * client headers) and answer it if necessary. - * - * Note that since we're not using select() we could get - * blocked here if a client connected, then didn't say - * anything! - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK, JB_ERR_PARSE or JB_ERR_MEMORY - * - *********************************************************************/ -static jb_err receive_client_request(struct client_state *csp) -{ - char buf[BUFFER_SIZE]; - char *p; - char *req = NULL; - struct http_request *http; - int len; - jb_err err; - - /* Temporary copy of the client's headers before they get enlisted in csp->headers */ - struct list header_list; - struct list *headers = &header_list; - - http = csp->http; - - memset(buf, 0, sizeof(buf)); - - req = get_request_line(csp); - if (req == NULL) - { - return JB_ERR_PARSE; - } - assert(*req != '\0'); - - if (client_protocol_is_unsupported(csp, req)) - { - return JB_ERR_PARSE; - } - -#ifdef FEATURE_FORCE_LOAD - /* - * If this request contains the FORCE_PREFIX and blocks - * aren't enforced, get rid of it and set the force flag. - */ - if (strstr(req, FORCE_PREFIX)) - { - if (csp->config->feature_flags & RUNTIME_FEATURE_ENFORCE_BLOCKS) - { - log_error(LOG_LEVEL_FORCE, - "Ignored force prefix in request: "%s".", req); - } - else - { - strclean(req, FORCE_PREFIX); - log_error(LOG_LEVEL_FORCE, "Enforcing request: "%s".", req); - csp->flags |= CSP_FLAG_FORCED; - } - } -#endif /* def FEATURE_FORCE_LOAD */ - - err = parse_http_request(req, http); - freez(req); - if (JB_ERR_OK != err) - { - write_socket(csp->cfd, CHEADER, strlen(CHEADER)); - /* XXX: Use correct size */ - log_error(LOG_LEVEL_CLF, "%s - - [%T] "Invalid request" 400 0", csp->ip_addr_str); - log_error(LOG_LEVEL_ERROR, - "Couldn't parse request line received from %s: %s", - csp->ip_addr_str, jb_err_to_string(err)); - - free_http_request(http); - return JB_ERR_PARSE; - } - - /* grab the rest of the client's headers */ - init_list(headers); - for (;;) - { - p = get_header(csp->iob); - - if (p == NULL) - { - /* There are no additional headers to read. */ - break; - } - - if (*p == '\0') - { - /* - * We didn't receive a complete header - * line yet, get the rest of it. - */ - if (!data_is_available(csp->cfd, csp->config->socket_timeout)) - { - log_error(LOG_LEVEL_ERROR, - "Stopped grabbing the client headers."); - return JB_ERR_PARSE; - } - - len = read_socket(csp->cfd, buf, sizeof(buf) - 1); - if (len <= 0) - { - log_error(LOG_LEVEL_ERROR, "read from client failed: %E"); - destroy_list(headers); - return JB_ERR_PARSE; - } - - if (add_to_iob(csp, buf, len)) - { - /* - * If there is no memory left for buffering the - * request, there is nothing we can do but hang up - */ - destroy_list(headers); - return JB_ERR_MEMORY; - } - } - else - { - /* - * We were able to read a complete - * header and can finaly enlist it. - */ - enlist(headers, p); - freez(p); - } - } - - if (http->host == NULL) - { - /* - * If we still don't know the request destination, - * the request is invalid or the client uses - * Privoxy without its knowledge. - */ - if (JB_ERR_OK != get_request_destination_elsewhere(csp, headers)) - { - /* - * Our attempts to get the request destination - * elsewhere failed or Privoxy is configured - * to only accept proxy requests. - * - * An error response has already been send - * and we're done here. - */ - return JB_ERR_PARSE; - } - } - - /* - * Determine the actions for this URL - */ -#ifdef FEATURE_TOGGLE - if (!(csp->flags & CSP_FLAG_TOGGLED_ON)) - { - /* Most compatible set of actions (i.e. none) */ - init_current_action(csp->action); - } - else -#endif /* ndef FEATURE_TOGGLE */ - { - get_url_actions(csp, http); - } - - /* - * 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"); - } - enlist(csp->headers, http->cmd); - - /* Append the previously read headers */ - list_append_list_unique(csp->headers, headers); - destroy_list(headers); - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : parse_client_request - * - * Description : Parses the client's request and decides what to do - * with it. - * - * Note that since we're not using select() we could get - * blocked here if a client connected, then didn't say - * anything! - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK or JB_ERR_PARSE - * - *********************************************************************/ -static jb_err parse_client_request(struct client_state *csp) -{ - struct http_request *http = csp->http; - jb_err err; - - err = sed(csp, FILTER_CLIENT_HEADERS); - if (JB_ERR_OK != err) - { - /* XXX: Should be handled in sed(). */ - assert(err == JB_ERR_PARSE); - log_error(LOG_LEVEL_FATAL, "Failed to parse client headers."); - } - csp->flags |= CSP_FLAG_CLIENT_HEADER_PARSING_DONE; - - /* Check request line for rewrites. */ - if ((NULL == csp->headers->first->str) - || (strcmp(http->cmd, csp->headers->first->str) && - (JB_ERR_OK != change_request_destination(csp)))) - { - /* - * A header filter broke the request line - bail out. - */ - write_socket(csp->cfd, MESSED_UP_REQUEST_RESPONSE, strlen(MESSED_UP_REQUEST_RESPONSE)); - /* XXX: Use correct size */ - log_error(LOG_LEVEL_CLF, - "%s - - [%T] "Invalid request generated" 500 0", csp->ip_addr_str); - log_error(LOG_LEVEL_ERROR, - "Invalid request line after applying header filters."); - free_http_request(http); - - return JB_ERR_PARSE; - } - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * 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 - * function returns, the caller must close the client - * socket handle. - * - * FIXME: chat is nearly thousand lines long. - * Ridiculous. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : Nothing. - * - *********************************************************************/ -static void chat(struct client_state *csp) -{ - char buf[BUFFER_SIZE]; - char *hdr; - char *p; - fd_set rfds; - int n; - jb_socket maxfd; - int server_body; - int ms_iis5_hack = 0; - unsigned long long byte_count = 0; - int forwarded_connect_retries = 0; - int max_forwarded_connect_retries = csp->config->forwarded_connect_retries; - const struct forward_spec *fwd; - struct http_request *http; - long len = 0; /* for buffer sizes (and negative error codes) */ - - /* Function that does the content filtering for the current request */ - filter_function_ptr content_filter = NULL; - - /* Skeleton for HTTP response, if we should intercept the request */ - struct http_response *rsp; - struct timeval timeout; - - memset(buf, 0, sizeof(buf)); - - http = csp->http; - - if (receive_client_request(csp) != JB_ERR_OK) - { - return; - } - if (parse_client_request(csp) != JB_ERR_OK) - { - return; - } - - /* decide how to route the HTTP request */ - fwd = forward_url(csp, http); - if (NULL == fwd) - { - log_error(LOG_LEVEL_FATAL, "gateway spec is NULL!?!? This can't happen!"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - return; - } - - /* - * build the http request to send to the server - * 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. - * - * 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. - * - * here's the matrix: - * SSL - * 0 1 - * +--------+--------+ - * | | | - * 0 | create | connect| - * | w/path | | - * Forwarding +--------+--------+ - * | | | - * 1 | create | pass | - * | w/url | | - * +--------+--------+ - * - */ - - if (http->ssl && connect_port_is_forbidden(csp)) - { - const char *acceptable_connect_ports = - csp->action->string[ACTION_STRING_LIMIT_CONNECT]; - assert(NULL != acceptable_connect_ports); - log_error(LOG_LEVEL_INFO, "Request from %s marked for blocking. " - "limit-connect{%s} doesn't allow CONNECT requests to port %d.", - csp->ip_addr_str, acceptable_connect_ports, csp->http->port); - csp->action->flags |= ACTION_BLOCK; - http->ssl = 0; - } - - if (http->ssl == 0) - { - freez(csp->headers->first->str); - build_request_line(csp, fwd, &csp->headers->first->str); - } - - /* - * We have a request. Check if one of the crunchers wants it. - */ - if (crunch_response_triggered(csp, crunchers_all)) - { - /* - * Yes. The client got the crunch response - * and we are done here after cleaning up. - */ - /* XXX: why list_remove_all()? */ - list_remove_all(csp->headers); - - return; - } - - log_error(LOG_LEVEL_GPC, "%s%s", http->hostport, http->path); - - if (fwd->forward_host) - { - log_error(LOG_LEVEL_CONNECT, "via %s:%d to: %s", - fwd->forward_host, fwd->forward_port, http->hostport); - } - else - { - log_error(LOG_LEVEL_CONNECT, "to %s", http->hostport); - } - - /* here we connect to the server, gateway, or the forwarder */ - - while ((csp->sfd = forwarded_connect(fwd, http, csp)) - && (errno == EINVAL) - && (forwarded_connect_retries++ < max_forwarded_connect_retries)) - { - log_error(LOG_LEVEL_ERROR, - "failed request #%u to connect to %s. Trying again.", - forwarded_connect_retries, http->hostport); - } - - if (csp->sfd == JB_INVALID_SOCKET) - { - if (fwd->type != SOCKS_NONE) - { - /* Socks error. */ - rsp = error_response(csp, "forwarding-failed", errno); - } - else if (errno == EINVAL) - { - rsp = error_response(csp, "no-such-domain", errno); - } - else - { - rsp = error_response(csp, "connect-failed", errno); - log_error(LOG_LEVEL_CONNECT, "connect to: %s failed: %E", - http->hostport); - } - - /* Write the answer to the client */ - if (rsp != NULL) - { - send_crunch_response(csp, rsp); - } - - return; - } - - hdr = list_to_text(csp->headers); - 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->iob) < 0)) - { - log_error(LOG_LEVEL_CONNECT, - "write header to: %s failed: %E", http->hostport); - - rsp = error_response(csp, "connect-failed", errno); - if (rsp) - { - send_crunch_response(csp, rsp); - } - - freez(hdr); - return; - } - } - else - { - /* - * We're running an SSL tunnel and we're not forwarding, - * so just send the "connect succeeded" message to the - * client, flush the rest, and get out of the way. - */ - if (write_socket(csp->cfd, CSUCCEED, strlen(CSUCCEED))) - { - freez(hdr); - return; - } - IOB_RESET(csp); - } - - log_error(LOG_LEVEL_CONNECT, "to %s successful", http->hostport); - - /* we're finished with the client's header */ - freez(hdr); - - maxfd = (csp->cfd > csp->sfd) ? csp->cfd : csp->sfd; - - /* pass data between the client and server - * until one or the other shuts down the connection. - */ - - server_body = 0; - - for (;;) - { -#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); - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - if ((csp->flags & CSP_FLAG_CHUNKED) - && !(csp->flags & CSP_FLAG_CONTENT_LENGTH_SET) - && ((csp->iob->eod - csp->iob->cur) >= 5) - && !memcmp(csp->iob->eod-5, "0\r\n\r\n", 5)) - { - log_error(LOG_LEVEL_CONNECT, - "Looks like we read the last chunk together with " - "the server headers. We better stop reading."); - byte_count = (unsigned long long)(csp->iob->eod - csp->iob->cur); - csp->expected_content_length = byte_count; - csp->flags |= CSP_FLAG_CONTENT_LENGTH_SET; - } - if (server_body && server_response_is_complete(csp, byte_count)) - { - log_error(LOG_LEVEL_CONNECT, - "Done reading from server. Expected content length: %llu. " - "Actual content length: %llu. Most recently received: %d.", - csp->expected_content_length, byte_count, len); - len = 0; - /* - * XXX: should not jump around, - * chat() is complicated enough already. - */ - goto reading_done; - } -#endif /* FEATURE_CONNECTION_KEEP_ALIVE */ - - timeout.tv_sec = csp->config->socket_timeout; - timeout.tv_usec = 0; - n = select((int)maxfd+1, &rfds, NULL, NULL, &timeout); - - if (n == 0) - { - log_error(LOG_LEVEL_ERROR, - "Didn't receive data in time: %s", http->url); - if ((byte_count == 0) && (http->ssl == 0)) - { - write_socket(csp->cfd, CONNECTION_TIMEOUT_RESPONSE, - strlen(CONNECTION_TIMEOUT_RESPONSE)); - } - mark_server_socket_tainted(csp); - return; - } - else if (n < 0) - { - log_error(LOG_LEVEL_ERROR, "select() failed!: %E"); - mark_server_socket_tainted(csp); - return; - } - - /* - * This is the body of the browser's request, - * just read and write it. - */ - if (FD_ISSET(csp->cfd, &rfds)) - { - len = read_socket(csp->cfd, buf, sizeof(buf) - 1); - - if (len <= 0) - { - /* XXX: not sure if this is necessary. */ - mark_server_socket_tainted(csp); - break; /* "game over, man" */ - } - - if (write_socket(csp->sfd, buf, (size_t)len)) - { - log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); - mark_server_socket_tainted(csp); - return; - } - continue; - } - - /* - * 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. - */ - if (FD_ISSET(csp->sfd, &rfds)) - { - fflush(0); - len = read_socket(csp->sfd, buf, sizeof(buf) - 1); - - if (len < 0) - { - log_error(LOG_LEVEL_ERROR, "read from: %s failed: %E", http->host); - - if (http->ssl && (fwd->forward_host == NULL)) - { - /* - * Just hang up. We already confirmed the client's CONNECT - * request with status code 200 and unencrypted content is - * no longer welcome. - */ - log_error(LOG_LEVEL_ERROR, - "CONNECT already confirmed. Unable to tell the client about the problem."); - return; - } - else if (byte_count) - { - /* - * Just hang up. We already transmitted the original headers - * and parts of the original content and therefore missed the - * chance to send an error message (without risking data corruption). - * - * XXX: we could retry with a fancy range request here. - */ - log_error(LOG_LEVEL_ERROR, "Already forwarded the original headers. " - "Unable to tell the client about the problem."); - mark_server_socket_tainted(csp); - return; - } - - rsp = error_response(csp, "connect-failed", errno); - if (rsp) - { - send_crunch_response(csp, rsp); - } - - return; - } - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - if (csp->flags & CSP_FLAG_CHUNKED) - { - if ((len >= 5) && !memcmp(buf+len-5, "0\r\n\r\n", 5)) - { - /* XXX: this is a temporary hack */ - log_error(LOG_LEVEL_CONNECT, - "Looks like we reached the end of the last chunk. " - "We better stop reading."); - csp->expected_content_length = byte_count + (unsigned long long)len; - csp->flags |= CSP_FLAG_CONTENT_LENGTH_SET; - } - } - reading_done: -#endif /* FEATURE_CONNECTION_KEEP_ALIVE */ - - /* - * Add a trailing zero to let be able to use string operations. - * XXX: do we still need this with filter_popups gone? - */ - buf[len] = '\0'; - - /* - * Normally, this would indicate that we've read - * as much as the server has sent us and we can - * close the client connection. However, Microsoft - * in its wisdom has released IIS/5 with a bug that - * prevents it from sending the trailing \r\n in - * a 302 redirect header (and possibly other headers). - * To work around this if we've haven't parsed - * a full header we'll append a trailing \r\n - * and see if this now generates a valid one. - * - * This hack shouldn't have any impacts. If we've - * already transmitted the header or if this is a - * SSL connection, then we won't bother with this - * hack. So we only work on partially received - * headers. If we append a \r\n and this still - * doesn't generate a valid header, then we won't - * transmit anything to the client. - */ - if (len == 0) - { - - 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) - { - p = execute_content_filter(csp, content_filter); - /* - * If the content filter fails, use the original - * buffer and length. - * (see p != NULL ? p : csp->iob->cur below) - */ - if (NULL == p) - { - csp->content_length = (size_t)(csp->iob->eod - csp->iob->cur); - } - - if (JB_ERR_OK != update_server_headers(csp)) - { - log_error(LOG_LEVEL_FATAL, - "Failed to update server headers. after filtering."); - } - - hdr = list_to_text(csp->headers); - 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), (size_t)csp->content_length)) - { - log_error(LOG_LEVEL_ERROR, "write modified content to client failed: %E"); - freez(hdr); - freez(p); - mark_server_socket_tainted(csp); - return; - } - - freez(hdr); - freez(p); - } - - break; /* "game over, man" */ - } - - /* - * This is NOT the body, so - * Let's pretend the server just sent us a blank line. - */ - snprintf(buf, sizeof(buf), "\r\n"); - len = (int)strlen(buf); - - /* - * Now, let the normal header parsing algorithm below do its - * job. If it fails, we'll exit instead of continuing. - */ - - ms_iis5_hack = 1; - } - - /* - * 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 - */ - if (server_body || http->ssl) - { - if (content_filter) - { - /* - * If there is no memory left for buffering the content, or the buffer limit - * has been reached, switch to non-filtering mode, i.e. make & write the - * header, flush the iob and buf, and get out of the way. - */ - if (add_to_iob(csp, buf, len)) - { - size_t hdrlen; - long flushed; - - log_error(LOG_LEVEL_INFO, - "Flushing header and buffers. Stepping back from filtering."); - - hdr = list_to_text(csp->headers); - if (hdr == NULL) - { - /* - * Memory is too tight to even generate the header. - * Send our static "Out-of-memory" page. - */ - log_error(LOG_LEVEL_ERROR, "Out of memory while trying to flush."); - rsp = cgi_error_memory(); - send_crunch_response(csp, rsp); - mark_server_socket_tainted(csp); - return; - } - hdrlen = strlen(hdr); - - if (write_socket(csp->cfd, hdr, hdrlen) - || ((flushed = flush_socket(csp->cfd, csp->iob)) < 0) - || (write_socket(csp->cfd, buf, (size_t)len))) - { - log_error(LOG_LEVEL_CONNECT, - "Flush header and buffers to client failed: %E"); - freez(hdr); - mark_server_socket_tainted(csp); - return; - } - - /* - * Reset the byte_count to the amount of bytes - * we just flushed. len will be added a few lines below, - * hdrlen doesn't matter for LOG_LEVEL_CLF. - */ - byte_count = (unsigned long long)flushed; - freez(hdr); - content_filter = NULL; - server_body = 1; - } - } - else - { - if (write_socket(csp->cfd, buf, (size_t)len)) - { - log_error(LOG_LEVEL_ERROR, "write to client failed: %E"); - mark_server_socket_tainted(csp); - return; - } - } - byte_count += (unsigned long long)len; - continue; - } - else - { - const char *header_start; - /* - * We're still looking for the end of the server's header. - * Buffer up the data we just read. If that fails, there's - * little we can do but send our static out-of-memory page. - */ - if (add_to_iob(csp, buf, len)) - { - log_error(LOG_LEVEL_ERROR, "Out of memory while looking for end of server headers."); - rsp = cgi_error_memory(); - send_crunch_response(csp, rsp); - mark_server_socket_tainted(csp); - return; - } - - header_start = csp->iob->cur; - - /* Convert iob into something sed() can digest */ - if (JB_ERR_PARSE == get_server_headers(csp)) - { - if (ms_iis5_hack) - { - /* - * Well, we tried our MS IIS/5 hack and it didn't work. - * The header is incomplete and there isn't anything - * we can do about it. - */ - log_error(LOG_LEVEL_INFO, - "MS IIS5 hack didn't produce valid headers."); - break; - } - else - { - /* - * Since we have to wait for more from the server before - * we can parse the headers we just continue here. - */ - long header_offset = csp->iob->cur - header_start; - assert(csp->iob->cur >= header_start); - byte_count += (unsigned long long)(len - header_offset); - log_error(LOG_LEVEL_CONNECT, "Continuing buffering headers. " - "byte_count: %llu. header_offset: %d. len: %d.", - byte_count, header_offset, len); - continue; - } - } - - /* Did we actually get anything? */ - if (NULL == csp->headers->first) - { - log_error(LOG_LEVEL_ERROR, "Empty server or forwarder response."); - log_error(LOG_LEVEL_CLF, "%s - - [%T] "%s" 502 0", csp->ip_addr_str, http->cmd); - write_socket(csp->cfd, NO_SERVER_DATA_RESPONSE, strlen(NO_SERVER_DATA_RESPONSE)); - free_http_request(http); - mark_server_socket_tainted(csp); - return; - } - - assert(csp->headers->first->str); - assert(!http->ssl); - if (strncmpic(csp->headers->first->str, "HTTP", 4) && - strncmpic(csp->headers->first->str, "ICY", 3)) - { - /* - * It doesn't look like a HTTP (or Shoutcast) response: - * tell the client and log the problem. - */ - if (strlen(csp->headers->first->str) > 30) - { - csp->headers->first->str[30] = '\0'; - } - log_error(LOG_LEVEL_ERROR, - "Invalid server or forwarder response. Starts with: %s", - csp->headers->first->str); - log_error(LOG_LEVEL_CLF, - "%s - - [%T] "%s" 502 0", csp->ip_addr_str, http->cmd); - write_socket(csp->cfd, INVALID_SERVER_HEADERS_RESPONSE, - strlen(INVALID_SERVER_HEADERS_RESPONSE)); - free_http_request(http); - mark_server_socket_tainted(csp); - return; - } - - /* - * We have now received the entire server header, - * filter it and send the result to the client - */ - if (JB_ERR_OK != sed(csp, FILTER_SERVER_HEADERS)) - { - log_error(LOG_LEVEL_FATAL, "Failed to parse server headers."); - } - hdr = list_to_text(csp->headers); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); - } - - if (crunch_response_triggered(csp, crunchers_light)) - { - /* - * One of the tags created by a server-header - * tagger triggered a crunch. We already - * delivered the crunch response to the client - * and are done here after cleaning up. - */ - freez(hdr); - mark_server_socket_tainted(csp); - return; - } - /* Buffer and pcrs filter this if appropriate. */ - - if (!http->ssl) /* We talk plaintext */ - { - content_filter = get_filter_function(csp); - } - /* - * 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) - */ - - if (write_socket(csp->cfd, hdr, strlen(hdr)) - || ((len = flush_socket(csp->cfd, csp->iob)) < 0)) - { - log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E"); - - /* - * The write failed, so don't bother mentioning it - * to the client... it probably can't hear us anyway. - */ - freez(hdr); - mark_server_socket_tainted(csp); - return; - } - - byte_count += (unsigned long long)len; - } - else - { - /* - * XXX: the header lenght should probably - * be calculated by get_server_headers(). - */ - long header_length = csp->iob->cur - header_start; - assert(csp->iob->cur > header_start); - byte_count += (unsigned long long)(len - header_length); - } - - /* we're finished with the server's header */ - - freez(hdr); - server_body = 1; - - /* - * If this was a MS IIS/5 hack then it means the server - * has already closed the connection. Nothing more to read. - * Time to bail. - */ - if (ms_iis5_hack) - { - log_error(LOG_LEVEL_INFO, - "Closed server connection detected with MS IIS5 hack enabled."); - break; - } - } - continue; - } - mark_server_socket_tainted(csp); - return; /* huh? we should never get here */ - } - - if (csp->content_length == 0) - { - /* - * If Privoxy didn't recalculate the Content-Lenght, - * byte_count is still correct. - */ - csp->content_length = byte_count; - } - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - if ((csp->flags & CSP_FLAG_CONTENT_LENGTH_SET) - && (csp->expected_content_length != byte_count)) - { - log_error(LOG_LEVEL_CONNECT, - "Received %llu bytes while expecting %llu.", - byte_count, csp->expected_content_length); - mark_server_socket_tainted(csp); - } -#endif - - log_error(LOG_LEVEL_CLF, "%s - - [%T] "%s" 200 %llu", - csp->ip_addr_str, http->ocmd, csp->content_length); -} - - -/********************************************************************* - * - * Function : serve - * - * Description : This is little more than chat. We only "serve" to - * to close any socket that chat may have opened. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : N/A - * - *********************************************************************/ -#ifdef AMIGA -void serve(struct client_state *csp) -#else /* ifndef AMIGA */ -static void serve(struct client_state *csp) -#endif /* def AMIGA */ -{ - chat(csp); - close_socket(csp->cfd); - - if (csp->sfd != JB_INVALID_SOCKET) - { -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - static int monitor_thread_running = 0; - - if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) - && (csp->flags & CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE)) - { - remember_connection(csp->sfd, csp->http, forward_url(csp, csp->http)); - privoxy_mutex_lock(&connection_reuse_mutex); - if (!monitor_thread_running) - { - monitor_thread_running = 1; - privoxy_mutex_unlock(&connection_reuse_mutex); - wait_for_alive_connections(); - privoxy_mutex_lock(&connection_reuse_mutex); - monitor_thread_running = 0; - } - privoxy_mutex_unlock(&connection_reuse_mutex); - } - else - { - forget_connection(csp->sfd); - close_socket(csp->sfd); - } -#else - close_socket(csp->sfd); -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - } - - csp->flags &= ~CSP_FLAG_ACTIVE; - -} - - -#ifdef __BEOS__ -/********************************************************************* - * - * Function : server_thread - * - * Description : We only exist to call `serve' in a threaded environment. - * - * Parameters : - * 1 : data = Current client state (buffers, headers, etc...) - * - * Returns : Always 0. - * - *********************************************************************/ -static int32 server_thread(void *data) -{ - serve((struct client_state *) data); - return 0; - -} -#endif - - -#if !defined(_WIN32) || defined(_WIN_CONSOLE) -/********************************************************************* - * - * Function : usage - * - * Description : Print usage info & exit. - * - * Parameters : Pointer to argv[0] for identifying ourselves - * - * Returns : No. ,-) - * - *********************************************************************/ -static void usage(const char *myname) -{ - printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n" - "Usage: %s " -#if defined(unix) - "[--chroot] " -#endif /* defined(unix) */ - "[--help] " -#if defined(unix) - "[--no-daemon] [--pidfile pidfile] [--pre-chroot-nslookup hostname] [--user user[.group]] " -#endif /* defined(unix) */ - "[--version] [configfile]\n" - "Aborting\n", myname); - - exit(2); - -} -#endif /* #if !defined(_WIN32) || defined(_WIN_CONSOLE) */ - - -#ifdef MUTEX_LOCKS_AVAILABLE -/********************************************************************* - * - * Function : privoxy_mutex_lock - * - * Description : Locks a mutex. - * - * Parameters : - * 1 : mutex = The mutex to lock. - * - * Returns : Void. May exit in case of errors. - * - *********************************************************************/ -void privoxy_mutex_lock(privoxy_mutex_t *mutex) -{ -#ifdef FEATURE_PTHREAD - int err = pthread_mutex_lock(mutex); - if (err) - { - if (mutex != &log_mutex) - { - log_error(LOG_LEVEL_FATAL, - "Mutex locking failed: %s.\n", strerror(err)); - } - exit(1); - } -#else - EnterCriticalSection(mutex); -#endif /* def FEATURE_PTHREAD */ -} - - -/********************************************************************* - * - * Function : privoxy_mutex_unlock - * - * Description : Unlocks a mutex. - * - * Parameters : - * 1 : mutex = The mutex to unlock. - * - * Returns : Void. May exit in case of errors. - * - *********************************************************************/ -void privoxy_mutex_unlock(privoxy_mutex_t *mutex) -{ -#ifdef FEATURE_PTHREAD - int err = pthread_mutex_unlock(mutex); - if (err) - { - if (mutex != &log_mutex) - { - log_error(LOG_LEVEL_FATAL, - "Mutex unlocking failed: %s.\n", strerror(err)); - } - exit(1); - } -#else - LeaveCriticalSection(mutex); -#endif /* def FEATURE_PTHREAD */ -} - - -/********************************************************************* - * - * Function : privoxy_mutex_init - * - * Description : Prepares a mutex. - * - * Parameters : - * 1 : mutex = The mutex to initialize. - * - * Returns : Void. May exit in case of errors. - * - *********************************************************************/ -static void privoxy_mutex_init(privoxy_mutex_t *mutex) -{ -#ifdef FEATURE_PTHREAD - int err = pthread_mutex_init(mutex, 0); - if (err) - { - printf("Fatal error. Mutex initialization failed: %s.\n", - strerror(err)); - exit(1); - } -#else - InitializeCriticalSection(mutex); -#endif /* def FEATURE_PTHREAD */ -} -#endif /* def MUTEX_LOCKS_AVAILABLE */ - -/********************************************************************* - * - * Function : initialize_mutexes - * - * Description : Prepares mutexes if mutex support is available. - * - * Parameters : None - * - * Returns : Void, exits in case of errors. - * - *********************************************************************/ -static void initialize_mutexes(void) -{ -#ifdef MUTEX_LOCKS_AVAILABLE - /* - * Prepare global mutex semaphores - */ - privoxy_mutex_init(&log_mutex); - privoxy_mutex_init(&log_init_mutex); - privoxy_mutex_init(&connection_reuse_mutex); - - /* - * XXX: The assumptions below are a bit naive - * and can cause locks that aren't necessary. - * - * For example older FreeBSD versions (< 6.x?) - * have no gethostbyname_r, but gethostbyname is - * thread safe. - */ -#if !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R) - privoxy_mutex_init(&resolver_mutex); -#endif /* !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R) */ - /* - * XXX: should we use a single mutex for - * localtime() and gmtime() as well? - */ -#ifndef HAVE_GMTIME_R - privoxy_mutex_init(&gmtime_mutex); -#endif /* ndef HAVE_GMTIME_R */ - -#ifndef HAVE_LOCALTIME_R - privoxy_mutex_init(&localtime_mutex); -#endif /* ndef HAVE_GMTIME_R */ - -#ifndef HAVE_RANDOM - privoxy_mutex_init(&rand_mutex); -#endif /* ndef HAVE_RANDOM */ -#endif /* def MUTEX_LOCKS_AVAILABLE */ -} - - -/********************************************************************* - * - * Function : main - * - * Description : Load the config file and start the listen loop. - * This function is a lot more *sane* with the `load_config' - * and `listen_loop' functions; although it stills does - * a *little* too much for my taste. - * - * Parameters : - * 1 : argc = Number of parameters (including $0). - * 2 : argv = Array of (char *)'s to the parameters. - * - * Returns : 1 if : can't open config file, unrecognized directive, - * stats requested in multi-thread mode, can't open the - * log file, can't open the jar file, listen port is invalid, - * 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 - * "File", "Exit" menu option. - * - *********************************************************************/ -#ifdef __MINGW32__ -int real_main(int argc, const char *argv[]) -#else -int main(int argc, const char *argv[]) -#endif -{ - int argc_pos = 0; - unsigned int random_seed; -#ifdef unix - struct passwd *pw = NULL; - struct group *grp = NULL; - char *p; - int do_chroot = 0; - char *pre_chroot_nslookup_to_load_resolver = NULL; -#endif - - Argc = argc; - Argv = argv; - - configfile = -#if !defined(_WIN32) - "config" -#else - "config.txt" -#endif - ; - - /* Prepare mutexes if supported and necessary. */ - initialize_mutexes(); - - /* Enable logging until further notice. */ - init_log_module(); - - /* - * Parse the command line arguments - * - * XXX: simply printing usage information in case of - * invalid arguments isn't particularly user friendly. - */ - while (++argc_pos < argc) - { -#ifdef _WIN32 - /* Check to see if the service must be installed or uninstalled */ - if (strncmp(argv[argc_pos], "--install", 9) == 0) - { - const char *pName = argv[argc_pos] + 9; - if (*pName == ':') - pName++; - exit( (install_service(pName)) ? 0 : 1 ); - } - else if (strncmp(argv[argc_pos], "--uninstall", + 11) == 0) - { - const char *pName = argv[argc_pos] + 11; - if (*pName == ':') - pName++; - exit((uninstall_service(pName)) ? 0 : 1); - } - else if (strcmp(argv[argc_pos], "--service" ) == 0) - { - bRunAsService = TRUE; - w32_set_service_cwd(); - atexit(w32_service_exit_notify); - } - else -#endif /* defined(_WIN32) */ - - -#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); - } - -#if defined(unix) - - else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0) - { - set_debug_level(LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO); - no_daemon = 1; - } - - 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'; - } - - else if (strcmp(argv[argc_pos], "--pre-chroot-nslookup" ) == 0) - { - if (++argc_pos == argc) usage(argv[0]); - pre_chroot_nslookup_to_load_resolver = strdup(argv[argc_pos]); - } - - else if (strcmp(argv[argc_pos], "--chroot" ) == 0) - { - do_chroot = 1; - } -#endif /* defined(unix) */ - - else if (argc_pos + 1 != argc) - { - /* - * This is neither the last command line - * option, nor was it recognized before, - * therefore it must be invalid. - */ - usage(argv[0]); - } - else - -#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ - { - configfile = argv[argc_pos]; - } - - } /* -END- while (more arguments) */ - - show_version(Argv[0]); - -#if defined(unix) - if ( *configfile != '/' ) - { - char cwd[BUFFER_SIZE]; - char *abs_file; - size_t abs_file_size; - - /* make config-filename absolute here */ - if (NULL == getcwd(cwd, sizeof(cwd))) - { - perror("failed to get current working directory"); - exit( 1 ); - } - - /* XXX: why + 5? */ - abs_file_size = strlen(cwd) + strlen(configfile) + 5; - basedir = strdup(cwd); - - if (NULL == basedir || - NULL == (abs_file = malloc(abs_file_size))) - { - perror("malloc failed"); - exit( 1 ); - } - strlcpy(abs_file, basedir, abs_file_size); - strlcat(abs_file, "/", abs_file_size ); - strlcat(abs_file, configfile, abs_file_size); - configfile = abs_file; - } -#endif /* defined unix */ - - - files->next = NULL; - clients->next = NULL; - - /* XXX: factor out initialising after the next stable release. */ -#ifdef AMIGA - InitAmiga(); -#elif defined(_WIN32) - InitWin32(); -#endif - - random_seed = (unsigned int)time(NULL); -#ifdef HAVE_RANDOM - srandom(random_seed); -#else - srand(random_seed); -#endif /* ifdef HAVE_RANDOM */ - - /* - * 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 signals (FIXME: Why?) - */ -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) -{ - int idx; - const int catched_signals[] = { SIGTERM, SIGINT, SIGHUP, 0 }; - const int ignored_signals[] = { SIGPIPE, 0 }; - - for (idx = 0; catched_signals[idx] != 0; idx++) - { -#ifdef sun /* FIXME: Is it safe to check for HAVE_SIGSET instead? */ - if (sigset(catched_signals[idx], sig_handler) == SIG_ERR) -#else - if (signal(catched_signals[idx], sig_handler) == SIG_ERR) -#endif /* ifdef sun */ - { - 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]); - } - } - -} -#else /* ifdef _WIN32 */ -# ifdef _WIN_CONSOLE - /* - * We *are* in a windows console app. - * Print a verbose messages about FAQ's and such - */ - printf("%s", win32_blurb); -# endif /* def _WIN_CONSOLE */ -#endif /* def _WIN32 */ - - - /* Initialize the CGI subsystem */ - cgi_init_error_messages(); - - /* - * If runnig on unix and without the --nodaemon - * option, become a daemon. I.e. fork, detach - * from tty and get process group leadership - */ -#if defined(unix) -{ - pid_t pid = 0; -#if 0 - int fd; -#endif - - if (!no_daemon) - { - pid = fork(); - - if ( pid < 0 ) /* error */ - { - perror("fork"); - exit( 3 ); - } - else if ( pid != 0 ) /* parent */ - { - int status; - pid_t wpid; - /* - * must check for errors - * child died due to missing files aso - */ - sleep( 1 ); - wpid = waitpid( pid, &status, WNOHANG ); - if ( wpid != 0 ) - { - exit( 1 ); - } - exit( 0 ); - } - /* child */ -#if 1 - /* Should be more portable, but not as well tested */ - setsid(); -#else /* !1 */ -#ifdef __FreeBSD__ - setpgrp(0,0); -#else /* ndef __FreeBSD__ */ - setpgrp(); -#endif /* ndef __FreeBSD__ */ - fd = open("/dev/tty", O_RDONLY); - if ( fd ) - { - /* no error check here */ - ioctl( fd, TIOCNOTTY,0 ); - close ( fd ); - } -#endif /* 1 */ - /* - * stderr (fd 2) will be closed later on, - * when the config file has been parsed. - */ - - 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 (setgid((NULL != grp) ? grp->gr_gid : pw->pw_gid)) - { - log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions."); - } - if (NULL != grp) - { - if (setgroups(1, &grp->gr_gid)) - { - log_error(LOG_LEVEL_FATAL, "setgroups() failed: %E"); - } - } - else if (initgroups(pw->pw_name, pw->pw_gid)) - { - log_error(LOG_LEVEL_FATAL, "initgroups() failed: %E"); - } - if (do_chroot) - { - if (!pw->pw_dir) - { - log_error(LOG_LEVEL_FATAL, "Home directory for %s undefined", pw->pw_name); - } - /* Read the time zone file from /etc before doing chroot. */ - tzset(); - if (NULL != pre_chroot_nslookup_to_load_resolver - && '\0' != pre_chroot_nslookup_to_load_resolver[0]) - { - /* Initialize resolver library. */ - (void) resolve_hostname_to_ip(pre_chroot_nslookup_to_load_resolver); - } - if (chroot(pw->pw_dir) < 0) - { - log_error(LOG_LEVEL_FATAL, "Cannot chroot to %s", pw->pw_dir); - } - if (chdir ("/")) - { - log_error(LOG_LEVEL_FATAL, "Cannot chdir /"); - } - } - if (setuid(pw->pw_uid)) - { - log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions."); - } - if (do_chroot) - { - char putenv_dummy[64]; - - strlcpy(putenv_dummy, "HOME=/", sizeof(putenv_dummy)); - if (putenv(putenv_dummy) != 0) - { - log_error(LOG_LEVEL_FATAL, "Cannot putenv(): HOME"); - } - - snprintf(putenv_dummy, sizeof(putenv_dummy), "USER=%s", pw->pw_name); - if (putenv(putenv_dummy) != 0) - { - log_error(LOG_LEVEL_FATAL, "Cannot putenv(): USER"); - } - } - } - else if (do_chroot) - { - log_error(LOG_LEVEL_FATAL, "Cannot chroot without --user argument."); - } -} -#endif /* defined unix */ - -#ifdef _WIN32 - /* This will be FALSE unless the command line specified --service - */ - if (bRunAsService) - { - /* Yup, so now we must attempt to establish a connection - * with the service dispatcher. This will only work if this - * process was launched by the service control manager to - * actually run as a service. If this isn't the case, i've - * known it take around 30 seconds or so for the call to return. - */ - - /* The StartServiceCtrlDispatcher won't return until the service is stopping */ - if (w32_start_service_ctrl_dispatcher(w32ServiceDispatchTable)) - { - /* Service has run, and at this point is now being stopped, so just return */ - return 0; - } - -#ifdef _WIN_CONSOLE - printf("Warning: Failed to connect to Service Control Dispatcher\nwhen starting as a service!\n"); -#endif - /* An error occurred. Usually it's because --service was wrongly specified - * and we were unable to connect to the Service Control Dispatcher because - * it wasn't expecting us and is therefore not listening. - * - * For now, just continue below to call the listen_loop function. - */ - } -#endif /* def _WIN32 */ - - listen_loop(); - - /* NOTREACHED */ - return(-1); - -} - - -/********************************************************************* - * - * 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) - { - 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; -} - - -#ifdef _WIN32 -/* Without this simple workaround we get this compiler warning from _beginthread - * warning C4028: formal parameter 1 different from declaration - */ -void w32_service_listen_loop(void *p) -{ - listen_loop(); -} -#endif /* def _WIN32 */ - - -/********************************************************************* - * - * Function : listen_loop - * - * Description : bind the listen port and enter a "FOREVER" listening loop. - * - * Parameters : N/A - * - * Returns : Never. - * - *********************************************************************/ -static void listen_loop(void) -{ - struct client_state *csp = NULL; - jb_socket bfd; - struct configuration_spec * config; - - config = load_config(); - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - /* - * XXX: Should be relocated once it no - * longer needs to emit log messages. - */ - initialize_reusable_connections(); -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - - bfd = bind_port_helper(config); - -#ifdef FEATURE_GRACEFUL_TERMINATION - while (!g_terminate) -#else - for (;;) -#endif - { -#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) - while (waitpid(-1, NULL, WNOHANG) > 0) - { - /* zombie children */ - } -#endif /* !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ - - /* - * Free data that was used by died threads - */ - sweep(); - -#if defined(unix) - /* - * Re-open the errlog after HUP signal - */ - if (received_hup_signal) - { - if (NULL != config->logfile) - { - init_error_log(Argv[0], config->logfile); - } - received_hup_signal = 0; - } -#endif - - 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; - - csp->config = config = load_config(); - - if ( config->need_bind ) - { - /* - * Since we were listening to the "old port", we will not see - * a "listen" param change until the next IJB request. So, at - * least 1 more request must be made for us to find the new - * setting. I am simply closing the old socket and binding the - * new one. - * - * Which-ever is correct, we will serve 1 more page via the - * old settings. This should probably be a "show-proxy-args" - * request. This should not be a so common of an operation - * that this will hurt people's feelings. - */ - - close_socket(bfd); - - bfd = bind_port_helper(config); - } - - log_error(LOG_LEVEL_CONNECT, "Listening for new connections ... "); - - if (!accept_connection(csp, bfd)) - { - log_error(LOG_LEVEL_CONNECT, "accept failed: %E"); - -#ifdef AMIGA - if(!childs) - { - exit(1); - } -#endif - freez(csp); - continue; - } - else - { - log_error(LOG_LEVEL_CONNECT, "accepted connection from %s", csp->ip_addr_str); - } - -#ifdef FEATURE_TOGGLE - if (global_toggle_state) -#endif /* def FEATURE_TOGGLE */ - { - csp->flags |= CSP_FLAG_TOGGLED_ON; - } - - if (run_loader(csp)) - { - log_error(LOG_LEVEL_FATAL, "a loader failed - must exit"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - -#ifdef FEATURE_ACL - if (block_acl(NULL,csp)) - { - log_error(LOG_LEVEL_CONNECT, "Connection from %s dropped due to ACL", csp->ip_addr_str); - close_socket(csp->cfd); - freez(csp); - continue; - } -#endif /* def FEATURE_ACL */ - - /* add it to the list of clients */ - csp->next = clients->next; - clients->next = csp; - - if (config->multi_threaded) - { - int child_id; - -/* 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); - errno = pthread_create(&the_thread, &attrs, - (void * (*)(void *))serve, csp); - child_id = errno ? -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, - 64 * 1024, - csp); -#endif - -#if defined(__BEOS__) && !defined(SELECTED_ONE_OPTION) -#define SELECTED_ONE_OPTION - { - thread_id tid = spawn_thread - (server_thread, "server", B_NORMAL_PRIORITY, csp); - - if ((tid >= 0) && (resume_thread(tid) == B_OK)) - { - child_id = (int) tid; - } - else - { - child_id = -1; - } - } -#endif - -#if defined(AMIGA) && !defined(SELECTED_ONE_OPTION) -#define SELECTED_ONE_OPTION - csp->cfd = ReleaseSocket(csp->cfd, -1); - -#ifdef __amigaos4__ - child_id = (int)CreateNewProcTags(NP_Entry, (ULONG)server_thread, - NP_Output, Output(), - NP_CloseOutput, FALSE, - NP_Name, (ULONG)"privoxy child", - NP_Child, TRUE, - TAG_DONE); -#else - child_id = (int)CreateNewProcTags(NP_Entry, (ULONG)server_thread, - NP_Output, Output(), - NP_CloseOutput, FALSE, - NP_Name, (ULONG)"privoxy child", - NP_StackSize, 200*1024, - TAG_DONE); -#endif - if(0 != child_id) - { - childs++; - ((struct Task *)child_id)->tc_UserData = csp; - Signal((struct Task *)child_id, SIGF_SINGLE); - Wait(SIGF_SINGLE); - } -#endif - -#if !defined(SELECTED_ONE_OPTION) - child_id = fork(); - - /* This block is only needed when using fork(). - * When using threads, the server thread was - * created and run by the call to _beginthread(). - */ - if (child_id == 0) /* child */ - { - int rc = 0; -#ifdef FEATURE_TOGGLE - int inherited_toggle_state = global_toggle_state; -#endif /* def FEATURE_TOGGLE */ - - serve(csp); - - /* - * If we've been toggled or we've blocked the request, tell Mom - */ - -#ifdef FEATURE_TOGGLE - if (inherited_toggle_state != global_toggle_state) - { - rc |= RC_FLAG_TOGGLED; - } -#endif /* def FEATURE_TOGGLE */ - -#ifdef FEATURE_STATISTICS - if (csp->flags & CSP_FLAG_REJECTED) - { - rc |= RC_FLAG_BLOCKED; - } -#endif /* ndef FEATURE_STATISTICS */ - - _exit(rc); - } - else if (child_id > 0) /* parent */ - { - /* in a fork()'d environment, the parent's - * copy of the client socket and the CSP - * are not used. - */ - int child_status; -#if !defined(_WIN32) && !defined(__CYGWIN__) - - wait( &child_status ); - - /* - * Evaluate child's return code: If the child has - * - been toggled, toggle ourselves - * - blocked its request, bump up the stats counter - */ - -#ifdef FEATURE_TOGGLE - if (WIFEXITED(child_status) && (WEXITSTATUS(child_status) & RC_FLAG_TOGGLED)) - { - global_toggle_state = !global_toggle_state; - } -#endif /* def FEATURE_TOGGLE */ - -#ifdef FEATURE_STATISTICS - urls_read++; - if (WIFEXITED(child_status) && (WEXITSTATUS(child_status) & RC_FLAG_BLOCKED)) - { - urls_rejected++; - } -#endif /* def FEATURE_STATISTICS */ - -#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"); - - snprintf(buf , sizeof(buf), "Privoxy: 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; - } - } - 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) - freez(basedir); -#endif - freez(configfile); - -#if defined(_WIN32) && !defined(_WIN_CONSOLE) - /* Cleanup - remove taskbar icon etc. */ - TermLogWindow(); -#endif - - exit(0); -#endif /* FEATURE_GRACEFUL_TERMINATION */ - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/jcc.c.rej b/external/privoxy/jcc.c.rej deleted file mode 100644 index 7a1bbdc..0000000 --- a/external/privoxy/jcc.c.rej +++ /dev/null @@ -1,20 +0,0 @@ -*************** -*** 3110,3118 **** - } - continue; - } -- log_error(LOG_LEVEL_INFO, -- "Shouldn't get here but did."); -- return; - } - - if (csp->content_length == 0) ---- 3120,3127 ---- - } - continue; - } -+ mark_server_socket_tainted(csp); -+ return; /* huh? we should never get here */ - } - - if (csp->content_length == 0) diff --git a/external/privoxy/jcc.h b/external/privoxy/jcc.h deleted file mode 100644 index add854c..0000000 --- a/external/privoxy/jcc.h +++ /dev/null @@ -1,261 +0,0 @@ -#ifndef JCC_H_INCLUDED -#define JCC_H_INCLUDED -#define JCC_H_VERSION "$Id: jcc.h,v 1.25 2008/10/09 18:21:41 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/jcc.h,v $ - * - * Purpose : Main file. Contains main() method, main loop, and - * the main connection-handling function. - * - * Copyright : Written by and Copyright (C) 2001-2006 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: jcc.h,v $ - * Revision 1.25 2008/10/09 18:21:41 fabiankeil - * Flush work-in-progress changes to keep outgoing connections - * alive where possible. Incomplete and mostly #ifdef'd out. - * - * Revision 1.24 2008/09/07 12:35:05 fabiankeil - * Add mutex lock support for _WIN32. - * - * Revision 1.23 2008/09/04 08:13:58 fabiankeil - * Prepare for critical sections on Windows by adding a - * layer of indirection before the pthread mutex functions. - * - * Revision 1.22 2007/06/01 18:16:36 fabiankeil - * Use the same mutex for gethostbyname() and gethostbyaddr() to prevent - * deadlocks and crashes on OpenBSD and possibly other OS with neither - * gethostbyname_r() nor gethostaddr_r(). Closes BR#1729174. - * Thanks to Ralf Horstmann for report and solution. - * - * Revision 1.21 2007/04/22 13:18:06 fabiankeil - * Keep the HTTP snippets local. - * - * Revision 1.20 2006/12/26 17:31:41 fabiankeil - * Mutex protect rand() if POSIX threading - * is used, warn the user if that's not possible - * and stop using it on _WIN32 where it could - * cause crashes. - * - * Revision 1.19 2006/12/06 19:41:39 fabiankeil - * Privoxy is now able to run as intercepting - * proxy in combination with any packet filter - * that does the port redirection. The destination - * is extracted from the "Host:" header which - * should be available for nearly all requests. - * - * Moved HTTP snipplets into jcc.c. - * Added error message for gopher proxy requests. - * - * Revision 1.18 2006/11/13 19:05:51 fabiankeil - * Make pthread mutex locking more generic. Instead of - * checking for OSX and OpenBSD, check for FEATURE_PTHREAD - * and use mutex locking unless there is an _r function - * available. Better safe than sorry. - * - * Fixes "./configure --disable-pthread" and should result - * in less threading-related problems on pthread-using platforms, - * but it still doesn't fix BR#1122404. - * - * Revision 1.17 2006/11/06 19:58:23 fabiankeil - * Move pthread.h inclusion from jcc.c to jcc.h. - * Fixes build on x86-freebsd1 (FreeBSD 5.4-RELEASE). - * - * Revision 1.16 2006/09/02 15:36:42 fabiankeil - * Follow the OpenBSD port's lead and protect the resolve - * functions on OpenBSD as well. - * - * Revision 1.15 2006/09/02 10:24:30 fabiankeil - * Include pthread.h for OpenBSD to make Privoxy build again. - * - * Tested shortly on OpenBSD 3.9 without problems, but the OpenBSD - * port has additional patches to use the mutexes OSX_DARWIN needs, - * and it should be investigated if they are still required for - * reliable operation. - * - * Revision 1.14 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.12.2.3 2006/01/21 16:16:08 david__schmidt - * Thanks to Edward Carrel for his patch to modernize OSX'spthreads support. See bug #1409623. - * - * Revision 1.12.2.2 2005/04/03 20:10:50 david__schmidt - * Thanks to Jindrich Makovicka for a race condition fix for the log - * file. The race condition remains for non-pthread implementations. - * Reference patch #1175720. - * - * Revision 1.12.2.1 2003/03/07 03:41:05 david__schmidt - * Wrapping all *_r functions (the non-_r versions of them) with mutex - * semaphores for OSX. Hopefully this will take care of all of those pesky - * crash reports. - * - * Revision 1.12 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -struct client_state; -struct file_list; - -/* Global variables */ - -#ifdef FEATURE_STATISTICS -extern int urls_read; -extern int urls_rejected; -#endif /*def FEATURE_STATISTICS*/ - -extern struct client_state clients[1]; -extern struct file_list files[1]; - -#ifdef unix -extern const char *pidfile; -#endif -extern int no_daemon; - -#ifdef FEATURE_GRACEFUL_TERMINATION -extern int g_terminate; -#endif - -#if defined(FEATURE_PTHREAD) || defined(_WIN32) -#define MUTEX_LOCKS_AVAILABLE - -#ifdef FEATURE_PTHREAD -#include <pthread.h> - -typedef pthread_mutex_t privoxy_mutex_t; - -#else - -typedef CRITICAL_SECTION privoxy_mutex_t; - -#endif - -extern void privoxy_mutex_lock(privoxy_mutex_t *mutex); -extern void privoxy_mutex_unlock(privoxy_mutex_t *mutex); - -extern privoxy_mutex_t log_mutex; -extern privoxy_mutex_t log_init_mutex; -extern privoxy_mutex_t connection_reuse_mutex; - -#ifndef HAVE_GMTIME_R -extern privoxy_mutex_t gmtime_mutex; -#endif /* ndef HAVE_GMTIME_R */ - -#ifndef HAVE_LOCALTIME_R -extern privoxy_mutex_t localtime_mutex; -#endif /* ndef HAVE_GMTIME_R */ - -#if !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R) -extern privoxy_mutex_t resolver_mutex; -#endif /* !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R) */ - -#ifndef HAVE_RANDOM -extern privoxy_mutex_t rand_mutex; -#endif /* ndef HAVE_RANDOM */ - -#endif /* FEATURE_PTHREAD */ - -/* Functions */ - -#ifdef __MINGW32__ -int real_main(int argc, const char *argv[]); -#else -int main(int argc, const char *argv[]); -#endif - -/* Revision control strings from this header and associated .c file */ -extern const char jcc_rcs[]; -extern const char jcc_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef JCC_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/list.c b/external/privoxy/list.c deleted file mode 100644 index c158129..0000000 --- a/external/privoxy/list.c +++ /dev/null @@ -1,1229 +0,0 @@ -const char list_rcs[] = "$Id: list.c,v 1.20 2007/05/14 16:56:07 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/list.c,v $ - * - * Purpose : Declares functions to handle lists. - * Functions declared include: - * `destroy_list', `enlist' and `list_to_text' - * - * Copyright : Written by and Copyright (C) 2001-2007 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: list.c,v $ - * Revision 1.20 2007/05/14 16:56:07 fabiankeil - * - Stop using strcpy(). - * - enlist_unique_header() now behaves as advertised - * and checks for existing headers with the same name - * but ignores the values. - * - * Revision 1.19 2007/04/17 18:14:06 fabiankeil - * Add list_contains_item(). - * - * Revision 1.18 2006/12/28 19:21:23 fabiankeil - * Fixed gcc43 warning and enabled list_is_valid()'s loop - * detection again. It was ineffective since the removal of - * the arbitrary list length limit two years ago. - * - * Revision 1.17 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.15.2.2 2004/05/25 02:04:23 david__schmidt - * Removed the "arbitrary" 1000 filter limit in file.c. See tracker #911950. - * - * Revision 1.15.2.1 2002/11/28 18:14:54 oes - * Added unmap function that removes all items with a given - * name from a map. - * - * Revision 1.15 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * arguments and thus saves the pain of sprintf()ing - * and determining the Header name length to enlist_unique - * - Improved comments - * - Removed logentry from cancelled commit - * - * Revision 1.3 2001/06/03 19:12:24 oes - * functions for new struct map, extended enlist_unique - * - * Revision 1.2 2001/06/01 18:49:17 jongfoster - * Replaced "list_share" with "list" - the tiny memory gain was not - * worth the extra complexity. - * - * Revision 1.1 2001/05/31 21:11:53 jongfoster - * - Moved linked list support to new "list.c" file. - * Structure definitions are still in project.h, - * function prototypes are now in "list.h". - * - Added support for "struct list_share", which is identical - * to "struct list" except it saves memory by not duplicating - * the strings. Obviously, this only works if there is some - * other way of managing the memory used by the strings. - * (These list_share lists are used for lists which last - * for only 1 request, and where all the list entries are - * just coming directly from entries in the actionsfile.) - * Note that you still need to destroy list_share lists - * properly to free the nodes - it's only the strings - * which are shared. - * - * - *********************************************************************/ - - -#include "config.h" - -#ifndef _WIN32 -/* FIXME: The following headers are not needed for Win32. Are they - * needed on other platforms? - */ -#include <stdio.h> -#include <sys/types.h> -#include <stdlib.h> -#include <ctype.h> -#endif -#include <string.h> - -#if !defined(_WIN32) && !defined(__OS2__) -#include <unistd.h> -#endif - -#include <assert.h> - -#include "project.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 : init_list - * - * 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 entry = 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. - */ - (void)strlen(cur_entry->str); - } - - /* - * Check for looping back to first - */ - if ((entry++ != 0) && (cur_entry == the_list->first)) - { - return 0; - } - - /* - * Arbitrarily limit list length to prevent infinite loops. - * Note that the 1000 limit was hit by a real user in tracker 911950; - * removing it for now. Real circular references should eventually - * be caught by the check above, anyway. - */ - /* - if (entry > 1000) - { - return 0; - } - */ - - /* - * Check this isn't marked as the last entry, unless of course it's - * *really* the last entry. - */ - if ((the_list->last == cur_entry) && (cur_entry->next != NULL)) - { - /* This is the last entry, but there's data after it !!?? */ - return 0; - } - } - - return (the_list->last == last_entry); -#else - return 1; -#endif -} - -/********************************************************************* - * - * Function : enlist - * - * Description : Append a string into a specified string list. - * - * Parameters : - * 1 : the_list = pointer to list - * 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. - * - *********************************************************************/ -jb_err enlist(struct list *the_list, const char *str) -{ - struct list_entry *cur; - - assert(the_list); - assert(list_is_valid(the_list)); - - if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur)))) - { - return JB_ERR_MEMORY; - } - - if (str) - { - if (NULL == (cur->str = strdup(str))) - { - free(cur); - return JB_ERR_MEMORY; - } - } - /* 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; - } - - assert(list_is_valid(the_list)); - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : enlist_first - * - * Description : Append a string as first element into a specified - * string list. - * - * Parameters : - * 1 : the_list = pointer to list - * 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. - * - *********************************************************************/ -jb_err enlist_first(struct list *the_list, const char *str) -{ - struct list_entry *cur; - - assert(the_list); - assert(list_is_valid(the_list)); - - if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur)))) - { - return JB_ERR_MEMORY; - } - - if (str) - { - if (NULL == (cur->str = strdup(str))) - { - free(cur); - return JB_ERR_MEMORY; - } - } - /* 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; -} - - -/********************************************************************* - * - * Function : enlist_unique - * - * 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. - * - * 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. - * - * 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. - * - *********************************************************************/ -jb_err enlist_unique(struct list *the_list, const char *str, - size_t num_significant_chars) -{ - 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)); - - if (num_significant_chars > 0) - { - for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next) - { - if ( (cur_entry->str != NULL) - && (0 == strncmp(str, cur_entry->str, num_significant_chars))) - { - /* Already there */ - return JB_ERR_OK; - } - } - } - else - { - /* Test whole string */ - for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next) - { - if ( (cur_entry->str != NULL) && (0 == strcmp(str, cur_entry->str))) - { - /* Already there */ - return JB_ERR_OK; - } - } - } - - return enlist(the_list, str); -} - - -/********************************************************************* - * - * Function : enlist_unique_header - * - * Description : Make a HTTP header from the two strings name and value, - * and append the result into a specified string list, - * 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") - * - * 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. - * - *********************************************************************/ -jb_err enlist_unique_header(struct list *the_list, const char *name, - const char *value) -{ - jb_err result = JB_ERR_MEMORY; - char *header; - size_t header_size; - - assert(the_list); - assert(list_is_valid(the_list)); - assert(name); - assert(value); - - /* + 2 for the ': ', + 1 for the \0 */ - header_size = strlen(name) + 2 + strlen(value) + 1; - header = (char *)malloc(header_size); - - if (NULL != header) - { - const size_t bytes_to_compare = strlen(name) + 2; - - snprintf(header, header_size, "%s: %s", name, value); - result = enlist_unique(the_list, header, bytes_to_compare); - free(header); - assert(list_is_valid(the_list)); - } - - return result; - -} - - -/********************************************************************* - * - * Function : list_remove_all - * - * 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. - * - * Parameters : - * 1 : the_list = pointer to list - * - * Returns : N/A - * - *********************************************************************/ -void list_remove_all(struct list *the_list) -{ - struct list_entry *cur_entry; - struct list_entry *next_entry; - - assert(the_list); - assert(list_is_valid(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 = the_list->last = NULL; - - assert(list_is_valid(the_list)); -} - - -/********************************************************************* - * - * Function : list_to_text - * - * Description : "Flatten" a string list into 1 long \r\n delimited string, - * adding an empty line at the end. NULL entries are ignored. - * This function does not change the_list. - * - * XXX: Should probably be renamed as it's only - * useful (and used) to flatten header lists. - * - * Parameters : - * 1 : the_list = pointer to list - * - * Returns : NULL on malloc error, else new long string. - * Caller must free() it. - * - *********************************************************************/ -char *list_to_text(const struct list *the_list) -{ - struct list_entry *cur_entry; - char *text; - size_t text_length; - char *cursor; - size_t bytes_left; - - assert(the_list); - assert(list_is_valid(the_list)); - - /* - * Calculate the lenght of the final text. - * '2' because of the '\r\n' at the end of - * each string and at the end of the text. - */ - text_length = 2; - for (cur_entry = the_list->first; cur_entry; cur_entry = cur_entry->next) - { - if (cur_entry->str) - { - text_length += strlen(cur_entry->str) + 2; - } - } - - bytes_left = text_length + 1; - - text = (char *)malloc(bytes_left); - if (NULL == text) - { - return NULL; - } - - cursor = text; - - for (cur_entry = the_list->first; cur_entry; cur_entry = cur_entry->next) - { - if (cur_entry->str) - { - const int written = snprintf(cursor, bytes_left, "%s\r\n", cur_entry->str); - - assert(written > 0); - assert(written < bytes_left); - - bytes_left -= (size_t)written; - cursor += (size_t)written; - } - } - - assert(bytes_left == 3); - - *cursor++ = '\r'; - *cursor++ = '\n'; - *cursor = '\0'; - - assert(text_length == cursor - text); - assert(text[text_length] == '\0'); - - return text; -} - - -/********************************************************************* - * - * Function : list_remove_item - * - * 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 - * - * Returns : Number of times it was removed. - * - *********************************************************************/ -int list_remove_item(struct list *the_list, const char *str) -{ - struct list_entry *prev = NULL; - struct list_entry *cur; - struct list_entry *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); - free(cur); - } - else - { - prev = cur; - } - cur = next; - } - - the_list->last = prev; - - assert(list_is_valid(the_list)); - - return count; -} - - -/********************************************************************* - * - * Function : list_remove_list - * - * Description : Remove all strings in one list from another list. - * This is currently a brute-force algorithm - * (it compares every pair of strings). - * - * Parameters : - * 1 : dest = list to change - * 2 : src = list of strings to remove - * - * Returns : Total number of strings removed. - * - *********************************************************************/ -int list_remove_list(struct list *dest, const struct list *src) -{ - struct list_entry *cur; - 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) - { - if (cur->str != NULL) - { - count += list_remove_item(dest, cur->str); - } - } - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return count; -} - - -/********************************************************************* - * - * Function : list_duplicate - * - * Description : Copy 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. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, dest will be empty. - * - *********************************************************************/ -jb_err list_duplicate(struct list *dest, const struct list *src) -{ - struct list_entry * cur_src; - struct list_entry * cur_dest; - - assert(src); - assert(dest); - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - list_remove_all(dest); - - /* Need to process first entry specially so we can set dest->first */ - cur_src = src->first; - if (cur_src) - { - cur_dest = dest->first = (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 */ - - /* 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; - } - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : list_append_list_unique - * - * Description : Append a string list to another list. - * Duplicate items are not added. - * - * Parameters : - * 1 : dest = pointer to destination list for merge. - * 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. - * - *********************************************************************/ -jb_err 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)); - - for (cur = src->first; cur; cur = cur->next) - { - if (cur->str) - { - if (enlist_unique(dest, cur->str, 0)) - { - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - } - } - - 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 if 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 : list_contains_item - * - * Description : Tests whether a list item is already set. - * Does not change the list. - * - * Parameters : - * 1 : the_list = list to search in - * 2 : str = string to search for - * - * Returns : TRUE if the item was found, - * FALSE otherwise. - * - *********************************************************************/ -int list_contains_item(const struct list *the_list, const char *str) -{ - struct list_entry *entry; - - assert(the_list); - assert(list_is_valid(the_list)); - assert(str); - - for (entry = the_list->first; entry != NULL; entry = entry->next) - { - if (entry->str == NULL) - { - /* - * NULL pointers are allowed in some lists. - * For example for csp->headers in case a - * header was removed. - */ - continue; - } - - if (0 == strcmp(str, entry->str)) - { - /* Item found */ - return TRUE; - } - } - - return FALSE; -} - - -/********************************************************************* - * - * 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 : free_map - * - * Description : Free the memory occupied by a map and its - * depandant strings - * - * Parameters : - * 1 : the_map = map to be freed. May be NULL. - * - * Returns : N/A - * - *********************************************************************/ -void free_map(struct map *the_map) -{ - struct map_entry *cur_entry; - struct map_entry *next_entry; - - if (the_map == NULL) - { - return; - } - - 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); - } - - the_map->first = the_map->last = NULL; - - 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); - * - * 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. - * - * 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 - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err map(struct map *the_map, - const char *name, int name_needs_copying, - const char *value, int value_needs_copying) -{ - struct map_entry *new_entry; - - assert(the_map); - - if ( (NULL == value) - || (NULL == name) - || (NULL == (new_entry = zalloc(sizeof(*new_entry)))) ) - { - if ((name != NULL) && (!name_needs_copying)) - { - free((char *)name); - } - 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; - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : unmap - * - * Description : Remove all map_entry structs with a given name from - * a given map. - * - * Parameters : - * 1 : the_map = map to look in - * 2 : name = name to unmap - * - * Returns : JB_ERR_OK - * - *********************************************************************/ -jb_err unmap(struct map *the_map, const char *name) -{ - struct map_entry *cur_entry, *last_entry; - - assert(the_map); - assert(name); - - last_entry = the_map->first; - - for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = cur_entry->next) - { - if (!strcmp(name, cur_entry->name)) - { - /* - * Update the incoming pointer - */ - if (cur_entry == the_map->first) - { - the_map->first = cur_entry->next; - } - else - { - last_entry->next = cur_entry->next; - } - - /* - * Update the map's last pointer - */ - if (cur_entry == the_map->last) - { - the_map->last = last_entry; - } - - /* - * Free the map_entry - */ - freez(cur_entry->name); - freez(cur_entry->value); - freez(cur_entry); - - cur_entry = last_entry; - } - else - { - last_entry = cur_entry; - } - } - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : lookup - * - * Description : Look up an item with a given name in a map, and - * return its value - * - * Parameters : - * 1 : the_map = map to look in - * 2 : name = name parameter to look for - * - * 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. - * - *********************************************************************/ -const char *lookup(const struct map *the_map, const char *name) -{ - const struct map_entry *cur_entry; - - assert(the_map); - assert(name); - - for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = cur_entry->next) - { - if (!strcmp(name, cur_entry->name)) - { - return cur_entry->value; - } - } - return ""; -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/list.h b/external/privoxy/list.h deleted file mode 100644 index b116237..0000000 --- a/external/privoxy/list.h +++ /dev/null @@ -1,181 +0,0 @@ -#ifndef LIST_H_INCLUDED -#define LIST_H_INCLUDED -#define LIST_H_VERSION "$Id: list.h,v 1.15 2007/04/17 18:14:06 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/list.h,v $ - * - * Purpose : Declares functions to handle lists. - * Functions declared include: - * `destroy_list', `enlist' and `list_to_text' - * - * Copyright : Written by and Copyright (C) 2001-2007 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: list.h,v $ - * Revision 1.15 2007/04/17 18:14:06 fabiankeil - * Add list_contains_item(). - * - * Revision 1.14 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.12.2.1 2002/11/28 18:14:54 oes - * Added unmap function that removes all items with a given - * name from a map. - * - * Revision 1.12 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.2 2001/06/01 18:49:17 jongfoster - * Replaced "list_share" with "list" - the tiny memory gain was not - * worth the extra complexity. - * - * Revision 1.1 2001/05/31 21:11:53 jongfoster - * - Moved linked list support to new "list.c" file. - * Structure definitions are still in project.h, - * function prototypes are now in "list.h". - * - Added support for "struct list_share", which is identical - * to "struct list" except it saves memory by not duplicating - * the strings. Obviously, this only works if there is some - * other way of managing the memory used by the strings. - * (These list_share lists are used for lists which last - * for only 1 request, and where all the list entries are - * just coming directly from entries in the actionsfile.) - * Note that you still need to destroy list_share lists - * properly to free the nodes - it's only the strings - * which are shared. - * - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -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 char * list_to_text(const struct list *the_list); - -extern int list_contains_item(const struct list *the_list, const char *str); - -/* - * 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 jb_err map (struct map * the_map, - const char * name, int name_needs_copying, - const char * value, int value_needs_copying); -extern jb_err unmap (struct map *the_map, - const char *name); -extern const char * lookup (const struct map * the_map, const char * name); - - -/* Revision control strings from this header and associated .c file */ -extern const char list_rcs[]; -extern const char list_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef LIST_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/loadcfg.c b/external/privoxy/loadcfg.c deleted file mode 100644 index c2e3bd1..0000000 --- a/external/privoxy/loadcfg.c +++ /dev/null @@ -1,2041 +0,0 @@ -const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.93 2009/03/18 21:46:26 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/loadcfg.c,v $ - * - * Purpose : Loads settings from the configuration file into - * 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-2009 the - * 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: loadcfg.c,v $ - * Revision 1.93 2009/03/18 21:46:26 fabiankeil - * Revert the last commit as there's a better way. - * - * Revision 1.92 2009/03/18 20:43:19 fabiankeil - * Don't enable LOG_LEVEL_INFO by default and don't apply the user's - * debug settings until the logfile has been opened (if there is one). - * Patch submitted by Roland in #2624120. - * - * Revision 1.91 2009/03/09 17:29:08 fabiankeil - * As of r1.88, the show-status page can use a single line for - * warnings about ignored directives and the names of the ignored - * directives themselves. Reminded by Lee, finally closes #1856559. - * - * Revision 1.90 2009/03/07 17:58:02 fabiankeil - * Fix two mingw32-only buffer overflows. Note that triggering - * them requires control over the configuration file in which - * case all bets are off anyway. - * - * Revision 1.89 2009/03/01 18:46:33 fabiankeil - * - Help clang understand that we aren't - * dereferencing NULL pointers here. - * - Some style fixes in the modified region. - * - * Revision 1.88 2009/02/28 10:57:10 fabiankeil - * Gimme a break or two. Don't let the show-status page - * link to the website documentation for the user-manual - * directive itself. - * - * Revision 1.87 2009/02/15 07:56:13 fabiankeil - * Increase default socket timeout to 300 seconds. - * - * Revision 1.86 2009/02/08 19:18:57 fabiankeil - * Now that we have the match-all.action file, the other action - * files changed their position in config->actions_file[] back - * to the way it was before standard.action got removed and the - * changes from revision 1.84 have to be reverted. - * - * Revision 1.85 2009/01/22 12:06:26 fabiankeil - * Don't keep connections alive when running single-threaded. - * - * Revision 1.84 2009/01/14 16:14:36 fabiankeil - * Due to the standard.action file removal, the other action - * files changed their position in config->actions_file[]. - * Update mingw32 kludge accordingly. - * - * Revision 1.83 2008/12/20 14:53:55 fabiankeil - * Add config option socket-timeout to control the time - * Privoxy waits for data to arrive on a socket. Useful - * in case of stale ssh tunnels or when fuzz-testing. - * - * Revision 1.82 2008/11/16 12:43:49 fabiankeil - * Turn keep-alive support into a runtime feature - * that is disabled by setting keep-alive-timeout - * to a negative value. - * - * Revision 1.81 2008/11/13 09:08:42 fabiankeil - * Add new config option: keep-alive-timeout. - * - * Revision 1.80 2008/08/31 15:59:03 fabiankeil - * There's no reason to let remote toggling support depend - * on FEATURE_CGI_EDIT_ACTIONS, so make sure it doesn't. - * - * Revision 1.79 2008/08/30 12:03:07 fabiankeil - * Remove FEATURE_COOKIE_JAR. - * - * Revision 1.78 2008/08/02 08:23:22 fabiankeil - * If the enforce-blocks directive is used with FEATURE_FORCE_LOAD - * disabled, log a message that blocks will always be enforced - * instead of complaining about an unrecognized directive. - * Reported by Pietro Leone. - * - * Revision 1.77 2008/05/26 16:13:22 fabiankeil - * Reuse directive_hash and don't hash the same directive twice. - * - * Revision 1.76 2008/05/10 09:03:16 fabiankeil - * - Merge three string_append() calls. - * - Remove useless assertion. - * - * Revision 1.75 2008/03/30 14:52:05 fabiankeil - * Rename load_actions_file() and load_re_filterfile() - * as they load multiple files "now". - * - * Revision 1.74 2008/03/26 18:07:07 fabiankeil - * Add hostname directive. Closes PR#1918189. - * - * Revision 1.73 2008/02/16 16:54:51 fabiankeil - * Fix typo. - * - * Revision 1.72 2008/02/03 13:46:15 fabiankeil - * Add SOCKS5 support. Patch #1862863 by Eric M. Hopper with minor changes. - * - * Revision 1.71 2007/12/23 15:24:56 fabiankeil - * Reword "unrecognized directive" warning, use better - * mark up and add a <br>. Fixes parts of #1856559. - * - * Revision 1.70 2007/12/15 14:24:05 fabiankeil - * Plug memory leak if listen-address only specifies the port. - * - * Revision 1.69 2007/10/27 13:02:27 fabiankeil - * Relocate daemon-mode-related log messages to make sure - * they aren't shown again in case of configuration reloads. - * - * Revision 1.68 2007/10/19 16:32:34 fabiankeil - * Plug memory leak introduced with my last commit. - * - * Revision 1.67 2007/10/14 14:12:41 fabiankeil - * When in daemon mode, close stderr after the configuration file has been - * parsed the first time. If logfile isn't set, stop logging. Fixes BR#897436. - * - * Revision 1.66 2007/08/05 14:02:09 fabiankeil - * #1763173 from Stefan Huehner: declare unload_configfile() static. - * - * Revision 1.65 2007/07/21 11:51:36 fabiankeil - * As Hal noticed, checking dispatch_cgi() as the last cruncher - * looks like a bug if CGI requests are blocked unintentionally, - * so don't do it unless the user enabled the new config option - * "allow-cgi-request-crunching". - * - * Revision 1.64 2007/05/21 10:44:08 fabiankeil - * - Use strlcpy() instead of strcpy(). - * - Stop treating actions files special. Expect a complete file name - * (with or without path) like it's done for the rest of the files. - * Closes FR#588084. - * - Remove an unnecessary temporary memory allocation. - * - Don't log anything to the console when running as - * daemon and no errors occurred. - * - * Revision 1.63 2007/04/09 18:11:36 fabiankeil - * Don't mistake VC++'s _snprintf() for a snprintf() replacement. - * - * Revision 1.62 2007/03/17 15:20:05 fabiankeil - * New config option: enforce-blocks. - * - * Revision 1.61 2007/03/16 16:47:35 fabiankeil - * - Mention other reasons why acl directive loading might have failed. - * - Don't log the acl source if the acl destination is to blame. - * - * Revision 1.60 2007/01/27 13:09:16 fabiankeil - * Add new config option "templdir" to - * change the templates directory. - * - * Revision 1.59 2006/12/31 17:56:38 fabiankeil - * Added config option accept-intercepted-requests - * and disabled it by default. - * - * Revision 1.58 2006/12/31 14:24:29 fabiankeil - * Fix gcc43 compiler warnings. - * - * Revision 1.57 2006/12/21 12:57:48 fabiankeil - * Add config option "split-large-forms" - * to work around the browser bug reported - * in BR #1570678. - * - * Revision 1.56 2006/12/17 17:04:51 fabiankeil - * Move the <br> in the generated HTML for the config - * options from the beginning of the string to its end. - * Keeps the white space in balance. - * - * Revision 1.55 2006/11/28 15:31:52 fabiankeil - * Fix memory leak in case of config file reloads. - * - * Revision 1.54 2006/10/21 16:04:22 fabiankeil - * Modified kludge for win32 to make ming32 menu - * "Options/Edit Filters" (sort of) work again. - * Same limitations as for the action files apply. - * Fixes BR 1567373. - * - * Revision 1.53 2006/09/06 18:45:03 fabiankeil - * Incorporate modified version of Roland Rosenfeld's patch to - * optionally access the user-manual via Privoxy. Closes patch 679075. - * - * Formatting changed to Privoxy style, added call to - * cgi_error_no_template if the requested file doesn't - * exist and modified check whether or not Privoxy itself - * should serve the manual. Should work cross-platform now. - * - * Revision 1.52 2006/09/06 10:43:32 fabiankeil - * Added config option enable-remote-http-toggle - * to specify if Privoxy should recognize special - * headers (currently only X-Filter) to change its - * behaviour. Disabled by default. - * - * Revision 1.51 2006/09/06 09:23:37 fabiankeil - * Make number of retries in case of forwarded-connect problems - * a config file option (forwarded-connect-retries) and use 0 as - * default. - * - * Revision 1.50 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.48.2.7 2006/02/02 17:29:16 david__schmidt - * Don't forget to malloc space for the null terminator... - * - * Revision 1.48.2.6 2006/01/29 23:10:56 david__schmidt - * Multiple filter file support - * - * Revision 1.48.2.5 2003/05/08 15:17:25 oes - * Closed two memory leaks; hopefully the last remaining ones - * (in the main execution paths, anyway). - * - * Revision 1.48.2.4 2003/04/11 12:06:14 oes - * Addressed bug #719435 - * - Extraneous filterfile directives now logged as errors - * - This and unrecnonised directives now really obvious on status page - * - * Revision 1.48.2.3 2003/03/11 11:53:59 oes - * Cosmetic: Renamed cryptic variable - * - * Revision 1.48.2.2 2002/11/12 16:28:20 oes - * Move unrelated variable declaration out of #ifdef FEATURE_ACL; fixes bug #636655 - * - * Revision 1.48.2.1 2002/08/21 17:58:05 oes - * Temp kludge to let user and default action file be edited through win32 GUI (FR 592080) - * - * Revision 1.48 2002/05/14 21:30:38 oes - * savearg now uses own linking code instead of (now special-cased) add_help_link - * - * Revision 1.47 2002/05/12 21:36:29 jongfoster - * Correcting function comments - * - * Revision 1.46 2002/04/26 12:55:14 oes - * - New option "user-manual", defaults to our site - * via project.h #define - * - savearg now embeds option names in help links - * - * Revision 1.45 2002/04/24 02:11:54 oes - * Jon's multiple AF patch: Allow up to MAX_AF_FILES actionsfile options - * - * Revision 1.44 2002/04/08 20:37:13 swa - * fixed JB spelling - * - * Revision 1.43 2002/04/08 20:36:50 swa - * fixed JB spelling - * - * Revision 1.42 2002/04/05 15:50:15 oes - * fix for invalid HTML proxy_args - * - * Revision 1.41 2002/03/31 17:19:00 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.40 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.15 2001/06/07 23:13:40 jongfoster - * Merging ACL and forward files into config file. - * Cosmetic: Sorting config file options alphabetically. - * Cosmetic: Adding brief syntax comments to config file options. - * - * Revision 1.14 2001/06/07 14:46:25 joergs - * Missing make_path() added for re_filterfile. - * - * Revision 1.13 2001/06/05 22:33:54 jongfoster - * - * Fixed minor memory leak. - * Also now uses make_path to prepend the pathnames. - * - * Revision 1.12 2001/06/05 20:04:09 jongfoster - * Now uses _snprintf() in place of snprintf() under Win32. - * - * Revision 1.11 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.10 2001/06/03 19:11:54 oes - * introduced confdir option - * - * Revision 1.9 2001/06/01 20:06:24 jongfoster - * Removed support for "tinygif" option - moved to actions file. - * - * Revision 1.8 2001/05/31 21:27:13 jongfoster - * Removed many options from the config file and into the - * "actions" file: add_forwarded, suppress_vanilla_wafer, - * wafer, add_header, user_agent, referer, from - * Also globally replaced "permission" with "action". - * - * Revision 1.7 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.6 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.5 2001/05/25 22:34:30 jongfoster - * Hard tabs->Spaces - * - * Revision 1.4 2001/05/22 18:46:04 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.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:58:58 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> -#include <stdlib.h> -#include <string.h> -#include <signal.h> -#include <fcntl.h> -#include <errno.h> -#include <ctype.h> -#include <assert.h> - -#ifdef _WIN32 - -# ifndef STRICT -# define STRICT -# endif -# include <windows.h> - -# include "win32.h" -# ifndef _WIN_CONSOLE -# include "w32log.h" -# endif /* ndef _WIN_CONSOLE */ - -#else /* ifndef _WIN32 */ - -#ifndef __OS2__ -# include <unistd.h> -# include <sys/wait.h> -#endif -# include <sys/time.h> -# include <sys/stat.h> -# include <signal.h> - -#endif - -#include "loadcfg.h" -#include "list.h" -#include "jcc.h" -#include "filters.h" -#include "loaders.h" -#include "miscutil.h" -#include "errlog.h" -#include "ssplit.h" -#include "encode.h" -#include "urlmatch.h" -#include "cgi.h" -#include "gateway.h" - -const char loadcfg_h_rcs[] = LOADCFG_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_isupper(__X) isupper((int)(unsigned char)(__X)) -#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) - -#ifdef FEATURE_TOGGLE -/* Privoxy is enabled by default. */ -int global_toggle_state = 1; -#endif /* def FEATURE_TOGGLE */ - -/* The filename of the configfile */ -const char *configfile = NULL; - -/* - * CGI functions will later need access to the invocation args, - * so we will make argc and argv global. - */ -int Argc = 0; -const char **Argv = NULL; - -static struct file_list *current_configfile = NULL; - - -/* - * This takes the "cryptic" hash of each keyword and aliases them to - * something a little more readable. This also makes changing the - * hash values easier if they should change or the hash algorthm changes. - * Use the included "hash" program to find out what the hash will be - * for any string supplied on the command line. (Or just put it in the - * config file and read the number from the error message in the log). - * - * Please keep this list sorted alphabetically (but with the Windows - * console and GUI specific options last). - */ - -#define hash_actions_file 1196306641ul /* "actionsfile" */ -#define hash_accept_intercepted_requests 1513024973ul /* "accept-intercepted-requests" */ -#define hash_admin_address 4112573064ul /* "admin-address" */ -#define hash_allow_cgi_request_crunching 258915987ul /* "allow-cgi-request-crunching" */ -#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_enable_remote_http_toggle 110543988ul /* "enable-remote-http-toggle" */ -#define hash_enforce_blocks 1862427469ul /* "enforce-blocks" */ -#define hash_filterfile 250887266ul /* "filterfile" */ -#define hash_forward 2029845ul /* "forward" */ -#define hash_forward_socks4 3963965521ul /* "forward-socks4" */ -#define hash_forward_socks4a 2639958518ul /* "forward-socks4a" */ -#define hash_forward_socks5 3963965522ul /* "forward-socks5" */ -#define hash_forwarded_connect_retries 101465292ul /* "forwarded-connect-retries" */ -#define hash_hostname 10308071ul /* "hostname" */ -#define hash_keep_alive_timeout 3878599515ul /* "keep-alive-timeout" */ -#define hash_listen_address 1255650842ul /* "listen-address" */ -#define hash_logdir 422889ul /* "logdir" */ -#define hash_logfile 2114766ul /* "logfile" */ -#define hash_permit_access 3587953268ul /* "permit-access" */ -#define hash_proxy_info_url 3903079059ul /* "proxy-info-url" */ -#define hash_single_threaded 4250084780ul /* "single-threaded" */ -#define hash_socket_timeout 1809001761ul /* "socket-timeout" */ -#define hash_split_large_cgi_forms 671658948ul /* "split-large-cgi-forms" */ -#define hash_suppress_blocklists 1948693308ul /* "suppress-blocklists" */ -#define hash_templdir 11067889ul /* "templdir" */ -#define hash_toggle 447966ul /* "toggle" */ -#define hash_trust_info_url 430331967ul /* "trust-info-url" */ -#define hash_trustfile 56494766ul /* "trustfile" */ -#define hash_usermanual 1416668518ul /* "user-manual" */ -#define hash_activity_animation 1817904738ul /* "activity-animation" */ -#define hash_close_button_minimizes 3651284693ul /* "close-button-minimizes" */ -#define hash_hide_console 2048809870ul /* "hide-console" */ -#define hash_log_buffer_size 2918070425ul /* "log-buffer-size" */ -#define hash_log_font_name 2866730124ul /* "log-font-name" */ -#define hash_log_font_size 2866731014ul /* "log-font-size" */ -#define hash_log_highlight_messages 4032101240ul /* "log-highlight-messages" */ -#define hash_log_max_lines 2868344173ul /* "log-max-lines" */ -#define hash_log_messages 2291744899ul /* "log-messages" */ -#define hash_show_on_task_bar 215410365ul /* "show-on-task-bar" */ - - -static void savearg(char *command, char *argument, struct configuration_spec * config); - -/********************************************************************* - * - * Function : unload_configfile - * - * Description : Free the config structure and all components. - * - * Parameters : - * 1 : data: struct configuration_spec to unload - * - * Returns : N/A - * - *********************************************************************/ -static void unload_configfile (void * data) -{ - struct configuration_spec * config = (struct configuration_spec *)data; - struct forward_spec *cur_fwd = config->forward; - int i; - -#ifdef FEATURE_ACL - struct access_control_list *cur_acl = config->acl; - - while (cur_acl != NULL) - { - struct access_control_list * next_acl = cur_acl->next; - free(cur_acl); - cur_acl = next_acl; - } - config->acl = NULL; -#endif /* def FEATURE_ACL */ - - while (cur_fwd != NULL) - { - struct forward_spec * next_fwd = cur_fwd->next; - free_url_spec(cur_fwd->url); - - freez(cur_fwd->gateway_host); - freez(cur_fwd->forward_host); - free(cur_fwd); - cur_fwd = next_fwd; - } - config->forward = NULL; - - freez(config->confdir); - freez(config->logdir); - freez(config->templdir); - freez(config->hostname); - - freez(config->haddr); - freez(config->logfile); - - for (i = 0; i < MAX_AF_FILES; i++) - { - freez(config->actions_file_short[i]); - freez(config->actions_file[i]); - freez(config->re_filterfile_short[i]); - freez(config->re_filterfile[i]); - } - - freez(config->admin_address); - freez(config->proxy_info_url); - freez(config->proxy_args); - freez(config->usermanual); - -#ifdef FEATURE_TRUST - freez(config->trustfile); - list_remove_all(config->trust_info); -#endif /* def FEATURE_TRUST */ - - for (i = 0; i < MAX_AF_FILES; i++) - { - freez(config->re_filterfile[i]); - } - - freez(config); -} - - -#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 - - -/********************************************************************* - * - * Function : load_config - * - * Description : Load the config file and all parameters. - * - * XXX: more than thousand lines long - * and thus in serious need of refactoring. - * - * Parameters : None - * - * Returns : The configuration_spec, or NULL on error. - * - *********************************************************************/ -struct configuration_spec * load_config(void) -{ - char buf[BUFFER_SIZE]; - char *p, *q; - FILE *configfp = NULL; - struct configuration_spec * config = NULL; - struct client_state * fake_csp; - struct file_list *fs; - unsigned long linenum = 0; - int i; - char *logfile = NULL; -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - int keep_alive_timeout = DEFAULT_KEEP_ALIVE_TIMEOUT; -#endif - - if (!check_file_changed(current_configfile, configfile, &fs)) - { - /* No need to load */ - return ((struct configuration_spec *)current_configfile->f); - } - if (NULL == fs) - { - log_error(LOG_LEVEL_FATAL, - "can't check configuration file '%s': %E", configfile); - return NULL; - } - - if (NULL != current_configfile) - { - log_error(LOG_LEVEL_INFO, "Reloading configuration file '%s'", configfile); - } - -#ifdef FEATURE_TOGGLE - global_toggle_state = 1; -#endif /* def FEATURE_TOGGLE */ - - fs->f = config = (struct configuration_spec *)zalloc(sizeof(*config)); - - if (NULL == config) - { - freez(fs->filename); - freez(fs); - log_error(LOG_LEVEL_FATAL, "can't allocate memory for configuration"); - return NULL; - } - - /* - * This is backwards from how it's usually done. - * 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 - * cast each time would be very ugly, and the extra indirection - * would waste CPU cycles. Therefore we store "config" in - * "csp->config", and "fs" in "csp->config->config_file_list". - */ - config->config_file_list = fs; - - /* - * Set to defaults - */ - config->multi_threaded = 1; - config->hport = HADDR_PORT; - config->buffer_limit = 4096 * 1024; - config->usermanual = strdup(USER_MANUAL_URL); - config->proxy_args = strdup(""); - config->forwarded_connect_retries = 0; - config->socket_timeout = 300; /* XXX: Should be a macro. */ - config->feature_flags &= ~RUNTIME_FEATURE_CGI_TOGGLE; - config->feature_flags &= ~RUNTIME_FEATURE_SPLIT_LARGE_FORMS; - config->feature_flags &= ~RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS; - - configfp = fopen(configfile, "r"); - if (NULL == configfp) - { - log_error(LOG_LEVEL_FATAL, - "can't open configuration file '%s': %E", configfile); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - - while (read_config_line(buf, sizeof(buf), configfp, &linenum) != NULL) - { - char cmd[BUFFER_SIZE]; - char arg[BUFFER_SIZE]; - char tmp[BUFFER_SIZE]; -#ifdef FEATURE_ACL - struct access_control_list *cur_acl; -#endif /* def FEATURE_ACL */ - struct forward_spec *cur_fwd; - int vec_count; - char *vec[3]; - unsigned long directive_hash; - - strlcpy(tmp, buf, sizeof(tmp)); - - /* Copy command (i.e. up to space or tab) into cmd */ - p = buf; - q = cmd; - while (*p && (*p != ' ') && (*p != '\t')) - { - *q++ = *p++; - } - *q = '\0'; - - /* Skip over the whitespace in buf */ - while (*p && ((*p == ' ') || (*p == '\t'))) - { - p++; - } - - /* Copy the argument into arg */ - strlcpy(arg, p, sizeof(arg)); - - /* Should never happen, but check this anyway */ - if (*cmd == '\0') - { - continue; - } - - /* Make sure the command field is lower case */ - for (p = cmd; *p; p++) - { - if (ijb_isupper(*p)) - { - *p = (char)ijb_tolower(*p); - } - } - - directive_hash = hash_string(cmd); - switch (directive_hash) - { -/* ************************************************************************* - * actionsfile actions-file-name - * In confdir by default - * *************************************************************************/ - case hash_actions_file : - i = 0; - while ((i < MAX_AF_FILES) && (NULL != config->actions_file[i])) - { - i++; - } - - if (i >= MAX_AF_FILES) - { - log_error(LOG_LEVEL_FATAL, "Too many 'actionsfile' directives in config file - limit is %d.\n" - "(You can increase this limit by changing MAX_AF_FILES in project.h and recompiling).", - MAX_AF_FILES); - } - config->actions_file_short[i] = strdup(arg); - config->actions_file[i] = make_path(config->confdir, arg); - - break; -/* ************************************************************************* - * accept-intercepted-requests - * *************************************************************************/ - case hash_accept_intercepted_requests: - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS; - } - break; - -/* ************************************************************************* - * admin-address email-address - * *************************************************************************/ - case hash_admin_address : - freez(config->admin_address); - config->admin_address = strdup(arg); - break; - -/* ************************************************************************* - * allow-cgi-request-crunching - * *************************************************************************/ - case hash_allow_cgi_request_crunching: - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_CGI_CRUNCHING; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_CGI_CRUNCHING; - } - break; - -/* ************************************************************************* - * buffer-limit n - * *************************************************************************/ - case hash_buffer_limit : - config->buffer_limit = (size_t)(1024 * atoi(arg)); - break; - -/* ************************************************************************* - * confdir directory-name - * *************************************************************************/ - case hash_confdir : - freez(config->confdir); - config->confdir = make_path( NULL, arg); - break; - -/* ************************************************************************* - * debug n - * Specifies debug level, multiple values are ORed together. - * *************************************************************************/ - case hash_debug : - config->debug |= atoi(arg); - break; - -/* ************************************************************************* - * deny-access source-ip[/significant-bits] [dest-ip[/significant-bits]] - * *************************************************************************/ -#ifdef FEATURE_ACL - case hash_deny_access: - strlcpy(tmp, arg, sizeof(tmp)); - vec_count = ssplit(tmp, " \t", vec, SZ(vec), 1, 1); - - if ((vec_count != 1) && (vec_count != 2)) - { - log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " - "deny-access directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Wrong number of parameters for " - "deny-access directive in configuration file.<br><br>\n"); - break; - } - - /* allocate a new node */ - cur_acl = (struct access_control_list *) zalloc(sizeof(*cur_acl)); - - if (cur_acl == NULL) - { - log_error(LOG_LEVEL_FATAL, "can't allocate memory for configuration"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - break; - } - cur_acl->action = ACL_DENY; - - if (acl_addr(vec[0], cur_acl->src) < 0) - { - log_error(LOG_LEVEL_ERROR, "Invalid source address, port or netmask " - "for deny-access directive in configuration file: "%s"", vec[0]); - string_append(&config->proxy_args, - "<br>\nWARNING: Invalid source address, port or netmask " - "for deny-access directive in configuration file: ""); - string_append(&config->proxy_args, - vec[0]); - string_append(&config->proxy_args, - ""<br><br>\n"); - freez(cur_acl); - break; - } - if (vec_count == 2) - { - if (acl_addr(vec[1], cur_acl->dst) < 0) - { - log_error(LOG_LEVEL_ERROR, "Invalid destination address, port or netmask " - "for deny-access directive in configuration file: "%s"", vec[1]); - string_append(&config->proxy_args, - "<br>\nWARNING: Invalid destination address, port or netmask " - "for deny-access directive in configuration file: ""); - string_append(&config->proxy_args, - vec[1]); - string_append(&config->proxy_args, - ""<br><br>\n"); - freez(cur_acl); - break; - } - } - - /* - * Add it to the list. Note we reverse the list to get the - * behaviour the user expects. With both the ACL and - * 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 - * when we scan it we stop as soon as we get a match. - */ - cur_acl->next = config->acl; - config->acl = cur_acl; - - break; -#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; - } - break; -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - -/* ************************************************************************* - * enable-remote-toggle 0|1 - * *************************************************************************/ -#ifdef FEATURE_TOGGLE - 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; - } - break; -#endif /* def FEATURE_TOGGLE */ - -/* ************************************************************************* - * enable-remote-http-toggle 0|1 - * *************************************************************************/ - case hash_enable_remote_http_toggle: - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_HTTP_TOGGLE; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_HTTP_TOGGLE; - } - break; - -/* ************************************************************************* - * enforce-blocks 0|1 - * *************************************************************************/ - case hash_enforce_blocks: -#ifdef FEATURE_FORCE_LOAD - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_ENFORCE_BLOCKS; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_ENFORCE_BLOCKS; - } -#else - log_error(LOG_LEVEL_ERROR, "Ignoring directive 'enforce-blocks'. " - "FEATURE_FORCE_LOAD is disabled, blocks will always be enforced."); -#endif /* def FEATURE_FORCE_LOAD */ - break; - -/* ************************************************************************* - * filterfile file-name - * In confdir by default. - * *************************************************************************/ - case hash_filterfile : - i = 0; - while ((i < MAX_AF_FILES) && (NULL != config->re_filterfile[i])) - { - i++; - } - - if (i >= MAX_AF_FILES) - { - log_error(LOG_LEVEL_FATAL, "Too many 'filterfile' directives in config file - limit is %d.\n" - "(You can increase this limit by changing MAX_AF_FILES in project.h and recompiling).", - MAX_AF_FILES); - } - config->re_filterfile_short[i] = strdup(arg); - config->re_filterfile[i] = make_path(config->confdir, arg); - - break; - -/* ************************************************************************* - * forward url-pattern (.|http-proxy-host[:port]) - * *************************************************************************/ - case hash_forward: - strlcpy(tmp, arg, sizeof(tmp)); - vec_count = ssplit(tmp, " \t", vec, SZ(vec), 1, 1); - - if (vec_count != 2) - { - log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for forward " - "directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Wrong number of parameters for " - "forward directive in configuration file."); - break; - } - - /* allocate a new node */ - cur_fwd = zalloc(sizeof(*cur_fwd)); - if (cur_fwd == NULL) - { - log_error(LOG_LEVEL_FATAL, "can't allocate memory for configuration"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - break; - } - - cur_fwd->type = SOCKS_NONE; - - /* Save the URL pattern */ - if (create_url_spec(cur_fwd->url, vec[0])) - { - log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward " - "directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Bad URL specifier for " - "forward directive in configuration file."); - break; - } - - /* Parse the parent HTTP proxy host:port */ - p = vec[1]; - - if (strcmp(p, ".") != 0) - { - cur_fwd->forward_host = strdup(p); - - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) - { - *p++ = '\0'; - cur_fwd->forward_port = atoi(p); - } - - if (cur_fwd->forward_port <= 0) - { - cur_fwd->forward_port = 8000; - } - } - - /* Add to list. */ - cur_fwd->next = config->forward; - config->forward = cur_fwd; - - break; - -/* ************************************************************************* - * forward-socks4 url-pattern socks-proxy[:port] (.|http-proxy[:port]) - * *************************************************************************/ - case hash_forward_socks4: - strlcpy(tmp, arg, sizeof(tmp)); - vec_count = ssplit(tmp, " \t", vec, SZ(vec), 1, 1); - - if (vec_count != 3) - { - log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " - "forward-socks4 directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Wrong number of parameters for " - "forward-socks4 directive in configuration file."); - break; - } - - /* allocate a new node */ - cur_fwd = zalloc(sizeof(*cur_fwd)); - if (cur_fwd == NULL) - { - log_error(LOG_LEVEL_FATAL, "can't allocate memory for configuration"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - break; - } - - cur_fwd->type = SOCKS_4; - - /* Save the URL pattern */ - if (create_url_spec(cur_fwd->url, vec[0])) - { - log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4 " - "directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Bad URL specifier for " - "forward-socks4 directive in configuration file."); - break; - } - - /* Parse the SOCKS proxy host[:port] */ - p = vec[1]; - - if (strcmp(p, ".") != 0) - { - cur_fwd->gateway_host = strdup(p); - - if (NULL != (p = strchr(cur_fwd->gateway_host, ':'))) - { - *p++ = '\0'; - cur_fwd->gateway_port = atoi(p); - } - if (cur_fwd->gateway_port <= 0) - { - cur_fwd->gateway_port = 1080; - } - } - - /* Parse the parent HTTP proxy host[:port] */ - p = vec[2]; - - if (strcmp(p, ".") != 0) - { - cur_fwd->forward_host = strdup(p); - - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) - { - *p++ = '\0'; - cur_fwd->forward_port = atoi(p); - } - - if (cur_fwd->forward_port <= 0) - { - cur_fwd->forward_port = 8000; - } - } - - /* Add to list. */ - cur_fwd->next = config->forward; - config->forward = cur_fwd; - - break; - -/* ************************************************************************* - * forward-socks4a url-pattern socks-proxy[:port] (.|http-proxy[:port]) - * *************************************************************************/ - case hash_forward_socks4a: - case hash_forward_socks5: - strlcpy(tmp, arg, sizeof(tmp)); - vec_count = ssplit(tmp, " \t", vec, SZ(vec), 1, 1); - - if (vec_count != 3) - { - log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " - "forward-socks4a directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Wrong number of parameters for " - "forward-socks4a directive in configuration file."); - break; - } - - /* allocate a new node */ - cur_fwd = zalloc(sizeof(*cur_fwd)); - if (cur_fwd == NULL) - { - log_error(LOG_LEVEL_FATAL, "can't allocate memory for configuration"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - break; - } - - if (directive_hash == hash_forward_socks4a) - { - cur_fwd->type = SOCKS_4A; - } - else - { - cur_fwd->type = SOCKS_5; - } - - /* Save the URL pattern */ - if (create_url_spec(cur_fwd->url, vec[0])) - { - log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4a " - "directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Bad URL specifier for " - "forward-socks4a directive in configuration file."); - break; - } - - /* Parse the SOCKS proxy host[:port] */ - p = vec[1]; - - cur_fwd->gateway_host = strdup(p); - - if (NULL != (p = strchr(cur_fwd->gateway_host, ':'))) - { - *p++ = '\0'; - cur_fwd->gateway_port = atoi(p); - } - if (cur_fwd->gateway_port <= 0) - { - cur_fwd->gateway_port = 1080; - } - - /* Parse the parent HTTP proxy host[:port] */ - p = vec[2]; - - if (strcmp(p, ".") != 0) - { - cur_fwd->forward_host = strdup(p); - - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) - { - *p++ = '\0'; - cur_fwd->forward_port = atoi(p); - } - - if (cur_fwd->forward_port <= 0) - { - cur_fwd->forward_port = 8000; - } - } - - /* Add to list. */ - cur_fwd->next = config->forward; - config->forward = cur_fwd; - - break; - -/* ************************************************************************* - * forwarded-connect-retries n - * *************************************************************************/ - case hash_forwarded_connect_retries : - config->forwarded_connect_retries = atoi(arg); - break; - -/* ************************************************************************* - * hostname hostname-to-show-on-cgi-pages - * *************************************************************************/ - case hash_hostname : - freez(config->hostname); - config->hostname = strdup(arg); - if (NULL == config->hostname) - { - log_error(LOG_LEVEL_FATAL, "Out of memory saving hostname."); - } - break; - -/* ************************************************************************* - * keep-alive-timeout timeout - * *************************************************************************/ -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - case hash_keep_alive_timeout : - if (*arg != '\0') - { - int timeout = atoi(arg); - if (0 <= timeout) - { - config->feature_flags |= RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE; - keep_alive_timeout = timeout; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE; - } - } - break; -#endif - -/* ************************************************************************* - * listen-address [ip][:port] - * *************************************************************************/ - case hash_listen_address : - freez(config->haddr); - config->haddr = strdup(arg); - break; - -/* ************************************************************************* - * logdir directory-name - * *************************************************************************/ - case hash_logdir : - freez(config->logdir); - config->logdir = make_path(NULL, arg); - break; - -/* ************************************************************************* - * logfile log-file-name - * In logdir by default - * *************************************************************************/ - case hash_logfile : - if (!no_daemon) - { - logfile = make_path(config->logdir, arg); - if (NULL == logfile) - { - log_error(LOG_LEVEL_FATAL, "Out of memory while creating logfile path"); - } - } - break; - -/* ************************************************************************* - * permit-access source-ip[/significant-bits] [dest-ip[/significant-bits]] - * *************************************************************************/ -#ifdef FEATURE_ACL - case hash_permit_access: - strlcpy(tmp, arg, sizeof(tmp)); - vec_count = ssplit(tmp, " \t", vec, SZ(vec), 1, 1); - - if ((vec_count != 1) && (vec_count != 2)) - { - log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " - "permit-access directive in configuration file."); - string_append(&config->proxy_args, - "<br>\nWARNING: Wrong number of parameters for " - "permit-access directive in configuration file.<br><br>\n"); - - break; - } - - /* allocate a new node */ - cur_acl = (struct access_control_list *) zalloc(sizeof(*cur_acl)); - - if (cur_acl == NULL) - { - log_error(LOG_LEVEL_FATAL, "can't allocate memory for configuration"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - break; - } - cur_acl->action = ACL_PERMIT; - - if (acl_addr(vec[0], cur_acl->src) < 0) - { - log_error(LOG_LEVEL_ERROR, "Invalid source address, port or netmask " - "for permit-access directive in configuration file: "%s"", vec[0]); - string_append(&config->proxy_args, - "<br>\nWARNING: Invalid source address, port or netmask for " - "permit-access directive in configuration file: ""); - string_append(&config->proxy_args, - vec[0]); - string_append(&config->proxy_args, - ""<br><br>\n"); - freez(cur_acl); - break; - } - if (vec_count == 2) - { - if (acl_addr(vec[1], cur_acl->dst) < 0) - { - log_error(LOG_LEVEL_ERROR, "Invalid destination address, port or netmask " - "for permit-access directive in configuration file: "%s"", vec[1]); - string_append(&config->proxy_args, - "<br>\nWARNING: Invalid destination address, port or netmask for " - "permit-access directive in configuration file: ""); - string_append(&config->proxy_args, - vec[1]); - string_append(&config->proxy_args, - ""<br><br>\n"); - freez(cur_acl); - break; - } - } - - /* - * Add it to the list. Note we reverse the list to get the - * behaviour the user expects. With both the ACL and - * 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 - * when we scan it we stop as soon as we get a match. - */ - cur_acl->next = config->acl; - config->acl = cur_acl; - - break; -#endif /* def FEATURE_ACL */ - -/* ************************************************************************* - * proxy-info-url url - * *************************************************************************/ - case hash_proxy_info_url : - freez(config->proxy_info_url); - config->proxy_info_url = strdup(arg); - break; - -/* ************************************************************************* - * single-threaded - * *************************************************************************/ - case hash_single_threaded : - config->multi_threaded = 0; - break; - -/* ************************************************************************* - * socket-timeout numer_of_seconds - * *************************************************************************/ - case hash_socket_timeout : - if (*arg != '\0') - { - int socket_timeout = atoi(arg); - if (0 < socket_timeout) - { - config->socket_timeout = socket_timeout; - } - else - { - log_error(LOG_LEVEL_FATAL, - "Invalid socket-timeout: '%s'", arg); - } - } - break; - -/* ************************************************************************* - * split-large-cgi-forms - * *************************************************************************/ - case hash_split_large_cgi_forms : - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_SPLIT_LARGE_FORMS; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_SPLIT_LARGE_FORMS; - } - break; - -/* ************************************************************************* - * templdir directory-name - * *************************************************************************/ - case hash_templdir : - freez(config->templdir); - config->templdir = make_path(NULL, arg); - break; - -/* ************************************************************************* - * toggle (0|1) - * *************************************************************************/ -#ifdef FEATURE_TOGGLE - case hash_toggle : - global_toggle_state = atoi(arg); - break; -#endif /* def FEATURE_TOGGLE */ - -/* ************************************************************************* - * trust-info-url url - * *************************************************************************/ -#ifdef FEATURE_TRUST - case hash_trust_info_url : - enlist(config->trust_info, arg); - break; -#endif /* def FEATURE_TRUST */ - -/* ************************************************************************* - * trustfile filename - * (In confdir by default.) - * *************************************************************************/ -#ifdef FEATURE_TRUST - case hash_trustfile : - freez(config->trustfile); - config->trustfile = make_path(config->confdir, arg); - break; -#endif /* def FEATURE_TRUST */ - -/* ************************************************************************* - * usermanual url - * *************************************************************************/ - case hash_usermanual : - /* - * XXX: If this isn't the first config directive, the - * show-status page links to the website documentation - * for the directives that were already parsed. Lame. - */ - freez(config->usermanual); - config->usermanual = strdup(arg); - break; - -/* ************************************************************************* - * Win32 Console options: - * *************************************************************************/ - -/* ************************************************************************* - * hide-console - * *************************************************************************/ -#ifdef _WIN_CONSOLE - case hash_hide_console : - hideConsole = 1; - break; -#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); - break; - -/* ************************************************************************* - * close-button-minimizes (0|1) - * *************************************************************************/ - case hash_close_button_minimizes : - g_bCloseHidesWindow = atoi(arg); - break; - -/* ************************************************************************* - * log-buffer-size (0|1) - * *************************************************************************/ - case hash_log_buffer_size : - g_bLimitBufferSize = atoi(arg); - break; - -/* ************************************************************************* - * log-font-name fontname - * *************************************************************************/ - case hash_log_font_name : - if (strlcpy(g_szFontFaceName, arg, - sizeof(g_szFontFaceName)) >= sizeof(g_szFontFaceName)) - { - log_error(LOG_LEVEL_FATAL, - "log-font-name argument '%s' is longer than %u characters.", - arg, sizeof(g_szFontFaceName)-1); - } - break; - -/* ************************************************************************* - * log-font-size n - * *************************************************************************/ - case hash_log_font_size : - g_nFontSize = atoi(arg); - break; - -/* ************************************************************************* - * log-highlight-messages (0|1) - * *************************************************************************/ - case hash_log_highlight_messages : - g_bHighlightMessages = atoi(arg); - break; - -/* ************************************************************************* - * log-max-lines n - * *************************************************************************/ - case hash_log_max_lines : - g_nMaxBufferLines = atoi(arg); - break; - -/* ************************************************************************* - * log-messages (0|1) - * *************************************************************************/ - case hash_log_messages : - g_bLogMessages = atoi(arg); - break; - -/* ************************************************************************* - * show-on-task-bar (0|1) - * *************************************************************************/ - case hash_show_on_task_bar : - g_bShowOnTaskBar = atoi(arg); - break; - -#endif /* defined(_WIN32) && ! defined(_WIN_CONSOLE) */ - - -/* ************************************************************************* - * Warnings about unsupported features - * *************************************************************************/ -#ifndef FEATURE_ACL - case hash_deny_access: -#endif /* ndef FEATURE_ACL */ -#ifndef FEATURE_CGI_EDIT_ACTIONS - case hash_enable_edit_actions: -#endif /* ndef FEATURE_CGI_EDIT_ACTIONS */ -#ifndef FEATURE_TOGGLE - case hash_enable_remote_toggle: -#endif /* ndef FEATURE_TOGGLE */ -#ifndef FEATURE_ACL - case hash_permit_access: -#endif /* ndef FEATURE_ACL */ -#ifndef FEATURE_TOGGLE - case hash_toggle : -#endif /* ndef FEATURE_TOGGLE */ -#ifndef FEATURE_TRUST - case hash_trustfile : - case hash_trust_info_url : -#endif /* ndef FEATURE_TRUST */ - -#ifndef _WIN_CONSOLE - case hash_hide_console : -#endif /* ndef _WIN_CONSOLE */ - -#if defined(_WIN_CONSOLE) || ! defined(_WIN32) - case hash_activity_animation : - case hash_close_button_minimizes : - case hash_log_buffer_size : - case hash_log_font_name : - case hash_log_font_size : - case hash_log_highlight_messages : - case hash_log_max_lines : - case hash_log_messages : - case hash_show_on_task_bar : -#endif /* defined(_WIN_CONSOLE) || ! defined(_WIN32) */ - /* These warnings are annoying - so hide them. -- Jon */ - /* log_error(LOG_LEVEL_INFO, "Unsupported directive "%s" ignored.", cmd); */ - break; - -/* *************************************************************************/ - 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, "Ignoring unrecognized directive '%s' (%luul) in line %lu " - "in configuration file (%s).", buf, directive_hash, linenum, configfile); - string_append(&config->proxy_args, - " <strong class='warning'>Warning: Ignoring unrecognized directive:</strong>"); - break; - -/* *************************************************************************/ - } /* end switch( hash_string(cmd) ) */ - - /* Save the argument for the show-status page. */ - savearg(cmd, arg, config); - - } /* end while ( read_config_line(...) ) */ - - fclose(configfp); - - set_debug_level(config->debug); - - freez(config->logfile); - - if (!no_daemon) - { - if (NULL != logfile) - { - config->logfile = logfile; - init_error_log(Argv[0], config->logfile); - } - else - { - disable_logging(); - } - } - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - if (config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) - { - if (config->multi_threaded) - { - set_keep_alive_timeout(keep_alive_timeout); - } - else - { - /* - * While we could use keep-alive without multiple threads - * if we didn't bother with enforcing the connection timeout, - * that might make Tor users sad, even though they shouldn't - * enable the single-threaded option anyway. - */ - config->feature_flags &= ~RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE; - log_error(LOG_LEVEL_ERROR, - "Config option single-threaded disables connection keep-alive."); - } - } -#endif - - if (NULL == config->proxy_args) - { - log_error(LOG_LEVEL_FATAL, "Out of memory loading config - insufficient memory for config->proxy_args"); - } - - if (config->actions_file[0]) - { - add_loader(load_action_files, config); - } - - if (config->re_filterfile[0]) - { - add_loader(load_re_filterfiles, config); - } - -#ifdef FEATURE_TRUST - if (config->trustfile) - { - add_loader(load_trustfile, config); - } -#endif /* def FEATURE_TRUST */ - - if ( NULL == config->haddr ) - { - config->haddr = strdup( HADDR_DEFAULT ); - } - - if ( NULL != config->haddr ) - { - if (NULL != (p = strchr(config->haddr, ':'))) - { - *p++ = '\0'; - if (*p) - { - config->hport = atoi(p); - } - } - - if (config->hport <= 0) - { - *--p = ':'; - log_error(LOG_LEVEL_FATAL, "invalid bind port spec %s", config->haddr); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - if (*config->haddr == '\0') - { - /* - * Only the port specified. We stored it in config->hport - * and don't need its text representation anymore. - */ - freez(config->haddr); - } - } - - /* - * Want to run all the loaders once now. - * - * Need to set up a fake csp, so they can get to the config. - */ - fake_csp = (struct client_state *) zalloc (sizeof(*fake_csp)); - fake_csp->config = config; - - if (run_loader(fake_csp)) - { - freez(fake_csp); - log_error(LOG_LEVEL_FATAL, "A loader failed while loading config file. Exiting."); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - freez(fake_csp); - -/* FIXME: this is a kludge for win32 */ -#if defined(_WIN32) && !defined (_WIN_CONSOLE) - - g_default_actions_file = config->actions_file[1]; /* FIXME Hope this is default.action */ - g_user_actions_file = config->actions_file[2]; /* FIXME Hope this is user.action */ - g_re_filterfile = config->re_filterfile[0]; /* FIXME Hope this is default.filter */ - -#ifdef FEATURE_TRUST - g_trustfile = config->trustfile; -#endif /* def FEATURE_TRUST */ - - -#endif /* defined(_WIN32) && !defined (_WIN_CONSOLE) */ -/* FIXME: end kludge */ - - - config->need_bind = 1; - - if (current_configfile) - { - struct configuration_spec * oldcfg = (struct configuration_spec *) - current_configfile->f; - /* - * Check if config->haddr,hport == oldcfg->haddr,hport - * - * The following could be written more compactly as a single, - * (unreadably long) if statement. - */ - config->need_bind = 0; - if (config->hport != oldcfg->hport) - { - config->need_bind = 1; - } - else if (config->haddr == NULL) - { - if (oldcfg->haddr != NULL) - { - config->need_bind = 1; - } - } - else if (oldcfg->haddr == NULL) - { - config->need_bind = 1; - } - else if (0 != strcmp(config->haddr, oldcfg->haddr)) - { - config->need_bind = 1; - } - - current_configfile->unloader = unload_configfile; - } - - fs->next = files->next; - files->next = fs; - - current_configfile = fs; - - return (config); -} - - -/********************************************************************* - * - * 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) - * 3 : config = Configuration to save into. - * - * Returns : N/A - * - *********************************************************************/ -static void savearg(char *command, char *argument, struct configuration_spec * config) -{ - char * buf; - char * s; - - assert(command); - assert(argument); - - /* - * Add config option name embedded in - * link to its section in the user-manual - */ - buf = strdup("\n<a href=""); - if (!strncmpic(config->usermanual, "file://", 7) || - !strncmpic(config->usermanual, "http", 4)) - { - string_append(&buf, config->usermanual); - } - else - { - string_append(&buf, "http://" CGI_SITE_2_HOST "/user-manual/"); - } - string_append(&buf, CONFIG_HELP_PREFIX); - string_join (&buf, string_toupper(command)); - string_append(&buf, "">"); - string_append(&buf, command); - string_append(&buf, "</a> "); - - if (NULL == buf) - { - freez(config->proxy_args); - return; - } - - if ( (NULL != argument) && ('\0' != *argument) ) - { - s = html_encode(argument); - if (NULL == s) - { - freez(buf); - freez(config->proxy_args); - return; - } - - if (strncmpic(argument, "http://", 7) == 0) - { - string_append(&buf, "<a href=""); - string_append(&buf, s); - string_append(&buf, "">"); - string_join (&buf, s); - string_append(&buf, "</a>"); - } - else - { - string_join (&buf, s); - } - } - - string_append(&buf, "<br>"); - string_join(&config->proxy_args, buf); -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/loadcfg.h b/external/privoxy/loadcfg.h deleted file mode 100644 index 80fc184..0000000 --- a/external/privoxy/loadcfg.h +++ /dev/null @@ -1,199 +0,0 @@ -#ifndef LOADCFG_H_INCLUDED -#define LOADCFG_H_INCLUDED -#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.13 2006/07/18 14:48:46 david__schmidt Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/loadcfg.h,v $ - * - * Purpose : Loads settings from the configuration file into - * 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/ - * - * 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: loadcfg.h,v $ - * Revision 1.13 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.11.2.1 2003/03/11 11:53:59 oes - * Cosmetic: Renamed cryptic variable - * - * Revision 1.11 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * 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.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:58:58 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Don't need project.h, only this: */ -struct configuration_spec; - -/* Global variables */ - -#ifdef FEATURE_TOGGLE -/* Privoxy's toggle state */ -extern int global_toggle_state; -#endif /* def FEATURE_TOGGLE */ - -extern const char *configfile; - - -/* The load_config function is now going to call: - * init_proxy_args, so it will need argc and argv. - * Since load_config will also be a signal handler, - * we need to have these globally available. - */ -extern int Argc; -extern const char **Argv; -extern short int MustReload; - - -extern struct configuration_spec * load_config(void); - -#ifdef FEATURE_GRACEFUL_TERMINATION -void unload_current_config_file(void); -#endif - -/* Revision control strings from this header and associated .c file */ -extern const char loadcfg_rcs[]; -extern const char loadcfg_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef LOADCFG_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/loaders.c b/external/privoxy/loaders.c deleted file mode 100644 index b796634..0000000 --- a/external/privoxy/loaders.c +++ /dev/null @@ -1,1762 +0,0 @@ -const char loaders_rcs[] = "$Id: loaders.c,v 1.71 2009/03/04 18:24:47 fabiankeil 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 - * unload files that are no longer in use. - * - * Copyright : Written by and Copyright (C) 2001-2009 the - * 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: loaders.c,v $ - * Revision 1.71 2009/03/04 18:24:47 fabiankeil - * No need to create empty strings manually, strdup("") FTW. - * - * Revision 1.70 2009/03/01 18:34:24 fabiankeil - * Help clang understand that we aren't dereferencing - * NULL pointers here. - * - * Revision 1.69 2008/09/21 13:36:52 fabiankeil - * If change-x-forwarded-for{add} is used and the client - * sends multiple X-Forwarded-For headers, append the client's - * IP address to each one of them. "Traditionally" we would - * lose all but the last one. - * - * Revision 1.68 2008/09/19 15:26:28 fabiankeil - * Add change-x-forwarded-for{} action to block or add - * X-Forwarded-For headers. Mostly based on code removed - * before 3.0.7. - * - * Revision 1.67 2008/03/30 14:52:08 fabiankeil - * Rename load_actions_file() and load_re_filterfile() - * as they load multiple files "now". - * - * Revision 1.66 2008/03/21 11:16:30 fabiankeil - * Garbage-collect csp->my_ip_addr_str and csp->my_hostname. - * - * Revision 1.65 2007/12/07 18:29:23 fabiankeil - * Remove now-obsolete csp member x_forwarded. - * - * Revision 1.64 2007/06/01 14:12:38 fabiankeil - * Add unload_forward_spec() in preparation for forward-override{}. - * - * Revision 1.63 2007/05/14 10:41:15 fabiankeil - * Ditch the csp member cookie_list[] which isn't used anymore. - * - * Revision 1.62 2007/04/30 15:02:18 fabiankeil - * Introduce dynamic pcrs jobs that can resolve variables. - * - * Revision 1.61 2007/04/15 16:39:21 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.60 2007/03/20 15:16:34 fabiankeil - * Use dedicated header filter actions instead of abusing "filter". - * Replace "filter-client-headers" and "filter-client-headers" - * with "server-header-filter" and "client-header-filter". - * - * Revision 1.59 2007/01/25 13:38:20 fabiankeil - * Freez csp->error_message in sweep(). - * - * Revision 1.58 2006/12/31 14:25:20 fabiankeil - * Fix gcc43 compiler warnings. - * - * Revision 1.57 2006/12/21 12:22:22 fabiankeil - * html_encode filter descriptions. - * - * Have "Ignoring job ..." error messages - * print the filter file name correctly. - * - * Revision 1.56 2006/09/07 10:40:30 fabiankeil - * Turns out trusted referrers above our arbitrary - * limit are downgraded too ordinary trusted URLs. - * Adjusted error message. - * - * Revision 1.55 2006/09/07 10:25:39 fabiankeil - * Fix typo. - * - * Revision 1.54 2006/09/07 10:22:20 fabiankeil - * If too many trusted referrers are used, - * print only one error message instead of logging - * every single trusted referrer above the arbitrary - * limit. - * - * Revision 1.53 2006/08/31 16:25:06 fabiankeil - * Work around a buffer overflow that caused Privoxy to - * segfault if too many trusted referrers were used. Good - * enough for now, but should be replaced with a real - * solution after the next release. - * - * Revision 1.52 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.50.2.8 2006/01/30 15:16:25 david__schmidt - * Remove a little residual debugging info - * - * Revision 1.50.2.7 2006/01/29 23:10:56 david__schmidt - * Multiple filter file support - * - * Revision 1.50.2.6 2003/10/24 10:17:54 oes - * Nit: Allowed tabs as separators in filter headings - * - * Revision 1.50.2.5 2003/05/08 15:19:15 oes - * sweep: Made loop structure of sweep step mirror that of mark step - * - * Revision 1.50.2.4 2003/05/06 15:57:12 oes - * Bugfix: Update last_active pointer in sweep() before - * leaving an active client. Closes bugs #724395, #727882 - * - * Revision 1.50.2.3 2002/11/20 17:12:30 oes - * Ooops, forgot one change. - * - * Revision 1.50.2.2 2002/11/20 14:38:15 oes - * Fixed delayed/incomplete freeing of client resources and - * simplified loop structure in sweep. - * Thanks to Oliver Stoeneberg for the hint. - * - * Revision 1.50.2.1 2002/07/26 15:19:24 oes - * - PCRS jobs now chained in order of appearance. Previous - * reverse chaining was counter-intuitive. - * - Changed loglevel of PCRS job compile errors to - * LOG_LEVEL_ERROR - * - * Revision 1.50 2002/04/24 02:12:16 oes - * Jon's multiple AF patch: Sweep now takes care of all AFs - * - * Revision 1.49 2002/04/19 16:53:25 jongfoster - * Optimize away a function call by using an equivalent macro - * - * Revision 1.48 2002/04/05 00:56:09 gliptak - * Correcting typo to clean up on realloc failure - * - * Revision 1.47 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.16 2001/06/09 10:55:28 jongfoster - * Changing BUFSIZ ==> BUFFER_SIZE - * - * Revision 1.15 2001/06/07 23:14:14 jongfoster - * Removing ACL and forward file loaders - these - * files have been merged into the config file. - * Cosmetic: Moving unloader funcs next to their - * respective loader funcs - * - * Revision 1.14 2001/06/01 03:27:04 oes - * Fixed line continuation problem - * - * Revision 1.13 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 - * - * Revision 1.12 2001/05/31 17:32:31 oes - * - * - Enhanced domain part globbing with infix and prefix asterisk - * matching and optional unanchored operation - * - * Revision 1.11 2001/05/29 23:25:24 oes - * - * - load_config_line() and load_permissions_file() now use chomp() - * - * Revision 1.10 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.9 2001/05/26 17:12:07 jongfoster - * Fatal errors loading configuration files now give better error messages. - * - * Revision 1.8 2001/05/26 00:55:20 jongfoster - * Removing duplicated code. load_forwardfile() now uses create_url_spec() - * - * 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/23 12:27:33 oes - * - * Fixed ugly indentation of my last changes - * - * Revision 1.5 2001/05/23 10:39:05 oes - * - Added support for escaping the comment character - * in config files by a backslash - * - Added support for line continuation in config - * files - * - Fixed a buffer overflow bug with long config lines - * - * Revision 1.4 2001/05/22 18:56:28 oes - * CRLF -> LF - * - * 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:58:59 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <string.h> -#include <errno.h> -#include <sys/stat.h> -#include <ctype.h> -#include <assert.h> - -#if !defined(_WIN32) && !defined(__OS2__) -#include <unistd.h> -#endif - -#include "project.h" -#include "list.h" -#include "loaders.h" -#include "filters.h" -#include "parsers.h" -#include "jcc.h" -#include "miscutil.h" -#include "errlog.h" -#include "actions.h" -#include "urlmatch.h" -#include "encode.h" - -const char loaders_h_rcs[] = LOADERS_H_VERSION; - -/* - * Currently active files. - * These are also entered in the main linked list of files. - */ - -#ifdef FEATURE_TRUST -static struct file_list *current_trustfile = NULL; -#endif /* def FEATURE_TRUST */ - -static int load_one_re_filterfile(struct client_state *csp, int fileid); - -static struct file_list *current_re_filterfile[MAX_AF_FILES] = { - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL -}; - -/* - * Pseudo filter type for load_one_re_filterfile - */ -#define NO_NEW_FILTER -1 - - -/********************************************************************* - * - * Function : sweep - * - * Description : Basically a mark and sweep garbage collector, it is run - * (by the parent thread) every once in a while to reclaim memory. - * - * It uses a mark and sweep strategy: - * 1) mark all files as inactive - * - * 2) check with each client: - * if it is active, mark its files as active - * if it is inactive, free its resources - * - * 3) free the resources of all of the files that - * are still marked as inactive (and are obsolete). - * - * N.B. files that are not obsolete don't have an unloader defined. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void sweep(void) -{ - struct file_list *fl, *nfl; - struct client_state *csp, *last_active; - int i; - - /* clear all of the file's active flags */ - for ( fl = files->next; NULL != fl; fl = fl->next ) - { - fl->active = 0; - } - - last_active = clients; - csp = clients->next; - - while (NULL != csp) - { - if (csp->flags & CSP_FLAG_ACTIVE) - { - /* Mark this client's files as active */ - - /* - * Always have a configuration file. - * (Also note the slightly non-standard extra - * indirection here.) - */ - csp->config->config_file_list->active = 1; - - /* - * Actions files - */ - for (i = 0; i < MAX_AF_FILES; i++) - { - if (csp->actions_list[i]) - { - csp->actions_list[i]->active = 1; - } - } - - /* - * Filter files - */ - for (i = 0; i < MAX_AF_FILES; i++) - { - if (csp->rlist[i]) - { - csp->rlist[i]->active = 1; - } - } - - /* - * Trust file - */ -#ifdef FEATURE_TRUST - if (csp->tlist) - { - csp->tlist->active = 1; - } -#endif /* def FEATURE_TRUST */ - - last_active = csp; - csp = csp->next; - - } - else - /* - * This client is not active. Free its resources. - */ - { - last_active->next = csp->next; - - freez(csp->ip_addr_str); - freez(csp->iob->buf); - freez(csp->error_message); - - if (csp->action->flags & ACTION_FORWARD_OVERRIDE && - NULL != csp->fwd) - { - unload_forward_spec(csp->fwd); - } - free_http_request(csp->http); - - destroy_list(csp->headers); - destroy_list(csp->tags); - - free_current_action(csp->action); - -#ifdef FEATURE_STATISTICS - urls_read++; - if (csp->flags & CSP_FLAG_REJECTED) - { - urls_rejected++; - } -#endif /* def FEATURE_STATISTICS */ - - freez(csp); - - csp = last_active->next; - } - } - - nfl = files; - fl = files->next; - - while (fl != NULL) - { - if ( ( 0 == fl->active ) && ( NULL != fl->unloader ) ) - { - nfl->next = fl->next; - - (fl->unloader)(fl->f); - - freez(fl->filename); - freez(fl); - - fl = nfl->next; - } - else - { - nfl = fl; - fl = fl->next; - } - } - -} - - -/********************************************************************* - * - * 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 - * 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. - * May be NULL (which is treated as out of - * date). - * 2 : filename = Name of file to check. - * 3 : newfl = New file list. [Output only] - * 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. - * - * Returns : If file unchanged: 0 (and sets newfl == NULL) - * If file changed: 1 and sets newfl != NULL - * On error: 1 and sets newfl == NULL - * - *********************************************************************/ -int check_file_changed(const struct file_list * current, - const char * filename, - struct file_list ** newfl) -{ - struct file_list *fs; - struct stat statbuf[1]; - - *newfl = NULL; - - if (stat(filename, statbuf) < 0) - { - /* Error, probably file not found. */ - return 1; - } - - if (current - && (current->lastmodified == statbuf->st_mtime) - && (0 == strcmp(current->filename, filename))) - { - return 0; - } - - fs = (struct file_list *)zalloc(sizeof(struct file_list)); - if (fs == NULL) - { - /* Out of memory error */ - return 1; - } - - - fs->filename = strdup(filename); - fs->lastmodified = statbuf->st_mtime; - - if (fs->filename == NULL) - { - /* Out of memory error */ - freez (fs); - return 1; - } - *newfl = fs; - return 1; -} - - -/********************************************************************* - * - * Function : simple_read_line - * - * Description : Read a single line from a file and return it. - * This is basically a version of fgets() that malloc()s - * it's own line buffer. Note that the buffer will - * always be a multiple of BUFFER_SIZE bytes long. - * Therefore if you are going to keep the string for - * an extended period of time, you should probably - * strdup() it and free() the original, to save memory. - * - * - * Parameters : - * 1 : dest = destination for newly malloc'd pointer to - * line data. Will be set to NULL on error. - * 2 : fp = File to read from - * 3 : newline = Standard for newlines in the file. - * Will be unchanged if it's value on input is not - * NEWLINE_UNKNOWN. - * On output, may be changed from NEWLINE_UNKNOWN to - * actual convention in file. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_FILE on EOF. - * - *********************************************************************/ -jb_err simple_read_line(FILE *fp, char **dest, int *newline) -{ - size_t len = 0; - size_t buflen = BUFFER_SIZE; - char * buf; - char * p; - int ch; - int realnewline = NEWLINE_UNKNOWN; - - if (NULL == (buf = malloc(buflen))) - { - return JB_ERR_MEMORY; - } - - p = buf; - -/* - * Character codes. If you have a wierd compiler and the following are - * incorrect, you also need to fix NEWLINE() in loaders.h - */ -#define CHAR_CR '\r' /* ASCII 13 */ -#define CHAR_LF '\n' /* ASCII 10 */ - - for (;;) - { - ch = getc(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) - { - 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; - } - - *p++ = (char)ch; - - 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 - * - * 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. - * - * 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. - * - *********************************************************************/ -jb_err edit_read_line(FILE *fp, - char **raw_out, - char **prefix_out, - char **data_out, - int *newline, - unsigned long *line_number) -{ - 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) - { - raw = strdup(""); - if (NULL == raw) - { - return JB_ERR_MEMORY; - } - } - if (prefix_out) - { - prefix = strdup(""); - if (NULL == prefix) - { - freez(raw); - return JB_ERR_MEMORY; - } - } - if (data_out) - { - data = strdup(""); - if (NULL == data) - { - freez(raw); - freez(prefix); - return JB_ERR_MEMORY; - } - } - - /* Main loop. Loop while we need more data & it's not EOF. */ - - while ( (contflag || is_empty) - && (JB_ERR_OK == (rval = simple_read_line(fp, &linebuf, newline)))) - { - if (line_number) - { - (*line_number)++; - } - if (raw) - { - string_append(&raw,linebuf); - if (string_append(&raw,NEWLINE(*newline))) - { - freez(prefix); - freez(data); - free(linebuf); - return JB_ERR_MEMORY; - } - } - - /* Line continuation? Trim escape and set flag. */ - p = linebuf + strlen(linebuf) - 1; - contflag = ((*linebuf != '\0') && (*p == '\')); - if (contflag) - { - *p = '\0'; - } - - /* Trim leading spaces if we're at the start of the line */ - linestart = linebuf; - assert(NULL != data); - if (*data == '\0') - { - /* Trim leading spaces */ - while (*linestart && isspace((int)(unsigned char)*linestart)) - { - linestart++; - } - } - - /* Handle comment characters. */ - p = linestart; - while ((p = strchr(p, '#')) != NULL) - { - /* Found a comment char.. */ - 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 "#". */ - } - 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) - { - is_empty = 0; - if (data) - { - if (string_append(&data, linestart)) - { - freez(raw); - freez(prefix); - free(linebuf); - return JB_ERR_MEMORY; - } - } - } - - 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 - { - freez(data); - } - return JB_ERR_OK; - } -} - - -/********************************************************************* - * - * 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) - { - log_error(LOG_LEVEL_FATAL, "Out of memory loading a config file"); - } - return NULL; - } - else - { - assert(buf2); - assert(strlen(buf2) + 1U < buflen); - strncpy(buf, buf2, buflen - 1); - free(buf2); - buf[buflen - 1] = '\0'; - return buf; - } -} - - -#ifdef FEATURE_TRUST -/********************************************************************* - * - * Function : unload_trustfile - * - * Description : Unloads a trustfile. - * - * Parameters : - * 1 : f = the data structure associated with the trustfile. - * - * Returns : N/A - * - *********************************************************************/ -static void unload_trustfile(void *f) -{ - struct block_spec *cur = (struct block_spec *)f; - struct block_spec *next; - - while (cur != NULL) - { - next = cur->next; - - free_url_spec(cur->url); - free(cur); - - cur = next; - } - -} - - -#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 */ - - -/********************************************************************* - * - * Function : load_trustfile - * - * Description : Read and parse a trustfile and add to files list. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int load_trustfile(struct client_state *csp) -{ - FILE *fp; - - struct block_spec *b, *bl; - struct url_spec **tl; - - char buf[BUFFER_SIZE], *p, *q; - int reject, trusted; - struct file_list *fs; - unsigned long linenum = 0; - int trusted_referrers = 0; - - if (!check_file_changed(current_trustfile, csp->config->trustfile, &fs)) - { - /* No need to load */ - if (csp) - { - csp->tlist = current_trustfile; - } - return(0); - } - if (!fs) - { - goto load_trustfile_error; - } - - fs->f = bl = (struct block_spec *)zalloc(sizeof(*bl)); - if (bl == NULL) - { - goto load_trustfile_error; - } - - if ((fp = fopen(csp->config->trustfile, "r")) == NULL) - { - goto load_trustfile_error; - } - - tl = csp->config->trust_list; - - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) - { - trusted = 0; - reject = 1; - - if (*buf == '+') - { - trusted = 1; - *buf = '~'; - } - - if (*buf == '~') - { - reject = 0; - p = buf; - q = p+1; - while ((*p++ = *q++) != '\0') - { - /* nop */ - } - } - - /* skip blank lines */ - if (*buf == '\0') - { - continue; - } - - /* allocate a new node */ - if ((b = zalloc(sizeof(*b))) == NULL) - { - fclose(fp); - goto load_trustfile_error; - } - - /* add it to the list */ - b->next = bl->next; - bl->next = b; - - b->reject = reject; - - /* Save the URL pattern */ - if (create_url_spec(b->url, buf)) - { - fclose(fp); - goto load_trustfile_error; - } - - /* - * save a pointer to URL's spec in the list of trusted URL's, too - */ - if (trusted) - { - if(++trusted_referrers < MAX_TRUSTED_REFERRERS) - { - *tl++ = b->url; - } - } - } - - if(trusted_referrers >= MAX_TRUSTED_REFERRERS) - { - /* - * FIXME: ... after Privoxy 3.0.4 is out. - */ - log_error(LOG_LEVEL_ERROR, "Too many trusted referrers. Current limit is %d, you are using %d.\n" - " Additional trusted referrers are treated like ordinary trusted URLs.\n" - " (You can increase this limit by changing MAX_TRUSTED_REFERRERS in project.h and recompiling).", - MAX_TRUSTED_REFERRERS, trusted_referrers); - } - - *tl = NULL; - - fclose(fp); - - /* the old one is now obsolete */ - if (current_trustfile) - { - current_trustfile->unloader = unload_trustfile; - } - - fs->next = files->next; - files->next = fs; - current_trustfile = fs; - - if (csp) - { - csp->tlist = fs; - } - - return(0); - -load_trustfile_error: - log_error(LOG_LEVEL_FATAL, "can't load trustfile '%s': %E", - csp->config->trustfile); - return(-1); - -} -#endif /* def FEATURE_TRUST */ - - -/********************************************************************* - * - * Function : unload_re_filterfile - * - * Description : Unload the re_filter list by freeing all chained - * re_filterfile specs and their data. - * - * Parameters : - * 1 : f = the data structure associated with the filterfile. - * - * Returns : N/A - * - *********************************************************************/ -static void unload_re_filterfile(void *f) -{ - struct re_filterfile_spec *a, *b = (struct re_filterfile_spec *)f; - - while (b != NULL) - { - a = b->next; - - destroy_list(b->patterns); - pcrs_free_joblist(b->joblist); - freez(b->name); - freez(b->description); - freez(b); - - b = a; - } - - return; -} - -/********************************************************************* - * - * Function : unload_forward_spec - * - * Description : Unload the forward spec settings by freeing all - * memory referenced by members and the memory for - * the spec itself. - * - * Parameters : - * 1 : fwd = the forward spec. - * - * Returns : N/A - * - *********************************************************************/ -void unload_forward_spec(struct forward_spec *fwd) -{ - free_url_spec(fwd->url); - freez(fwd->gateway_host); - freez(fwd->forward_host); - free(fwd); - - 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) -{ - int i; - - for (i = 0; i < MAX_AF_FILES; i++) - { - if (current_re_filterfile[i]) - { - current_re_filterfile[i]->unloader = unload_re_filterfile; - current_re_filterfile[i] = NULL; - } - } -} -#endif - - -/********************************************************************* - * - * Function : load_re_filterfiles - * - * Description : Loads all the filterfiles. - * Generate a chained list of re_filterfile_spec's from - * the "FILTER: " blocks, compiling all their substitutions - * into chained lists of pcrs_job structs. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int load_re_filterfiles(struct client_state *csp) -{ - int i; - int result; - - for (i = 0; i < MAX_AF_FILES; i++) - { - if (csp->config->re_filterfile[i]) - { - result = load_one_re_filterfile(csp, i); - if (result) - { - return result; - } - } - else if (current_re_filterfile[i]) - { - current_re_filterfile[i]->unloader = unload_re_filterfile; - current_re_filterfile[i] = NULL; - } - } - - return 0; -} - - -/********************************************************************* - * - * Function : load_one_re_filterfile - * - * Description : Load a 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. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int load_one_re_filterfile(struct client_state *csp, int fileid) -{ - FILE *fp; - - struct re_filterfile_spec *new_bl, *bl = NULL; - struct file_list *fs; - - char buf[BUFFER_SIZE]; - int error; - unsigned long linenum = 0; - pcrs_job *dummy, *lastjob = NULL; - - /* - * No need to reload if unchanged - */ - if (!check_file_changed(current_re_filterfile[fileid], csp->config->re_filterfile[fileid], &fs)) - { - if (csp) - { - csp->rlist[fileid] = current_re_filterfile[fileid]; - } - return(0); - } - if (!fs) - { - goto load_re_filterfile_error; - } - - /* - * Open the file or fail - */ - if ((fp = fopen(csp->config->re_filterfile[fileid], "r")) == NULL) - { - goto load_re_filterfile_error; - } - - /* - * Read line by line - */ - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) - { - int new_filter = NO_NEW_FILTER; - - if (strncmp(buf, "FILTER:", 7) == 0) - { - new_filter = FT_CONTENT_FILTER; - } - else if (strncmp(buf, "SERVER-HEADER-FILTER:", 21) == 0) - { - new_filter = FT_SERVER_HEADER_FILTER; - } - else if (strncmp(buf, "CLIENT-HEADER-FILTER:", 21) == 0) - { - new_filter = FT_CLIENT_HEADER_FILTER; - } - else if (strncmp(buf, "CLIENT-HEADER-TAGGER:", 21) == 0) - { - new_filter = FT_CLIENT_HEADER_TAGGER; - } - else if (strncmp(buf, "SERVER-HEADER-TAGGER:", 21) == 0) - { - new_filter = FT_SERVER_HEADER_TAGGER; - } - - /* - * 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 (new_filter != NO_NEW_FILTER) - { - new_bl = (struct re_filterfile_spec *)zalloc(sizeof(*bl)); - if (new_bl == NULL) - { - goto load_re_filterfile_error; - } - if (new_filter == FT_CONTENT_FILTER) - { - new_bl->name = chomp(buf + 7); - } - else - { - new_bl->name = chomp(buf + 21); - } - new_bl->type = new_filter; - - /* - * If a filter description is available, - * encode it to HTML and save it. - */ - if (NULL != (new_bl->description = strpbrk(new_bl->name, " \t"))) - { - *new_bl->description++ = '\0'; - new_bl->description = html_encode(chomp(new_bl->description)); - if (NULL == new_bl->description) - { - new_bl->description = strdup("Out of memory while encoding this filter's description to HTML"); - } - } - 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 - { - assert(NULL != bl); - bl->next = new_bl; - } - bl = new_bl; - - log_error(LOG_LEVEL_RE_FILTER, "Reading in filter "%s" ("%s")", bl->name, bl->description); - - continue; - } - - /* - * Else, save the expression, make it a pcrs_job - * and chain it into the current filter's joblist - */ - if (bl != NULL) - { - error = enlist(bl->patterns, buf); - if (JB_ERR_MEMORY == error) - { - log_error(LOG_LEVEL_FATAL, - "Out of memory while enlisting re_filter job '%s' for filter %s.", buf, bl->name); - } - assert(JB_ERR_OK == error); - - if (pcrs_job_is_dynamic(buf)) - { - /* - * Dynamic pattern that might contain variables - * and has to be recompiled for every request - */ - if (bl->joblist != NULL) - { - pcrs_free_joblist(bl->joblist); - bl->joblist = NULL; - } - bl->dynamic = 1; - log_error(LOG_LEVEL_RE_FILTER, - "Adding dynamic re_filter job '%s' to filter %s succeeded.", buf, bl->name); - continue; - } - else if (bl->dynamic) - { - /* - * A previous job was dynamic and as we - * recompile the whole filter anyway, it - * makes no sense to compile this job now. - */ - log_error(LOG_LEVEL_RE_FILTER, - "Adding static re_filter job '%s' to dynamic filter %s succeeded.", buf, bl->name); - continue; - } - - if ((dummy = pcrs_compile_command(buf, &error)) == NULL) - { - log_error(LOG_LEVEL_ERROR, - "Adding re_filter job '%s' to filter %s failed with error %d.", buf, bl->name, error); - continue; - } - else - { - if (bl->joblist == NULL) - { - bl->joblist = dummy; - } - else if (NULL != lastjob) - { - lastjob->next = dummy; - } - lastjob = dummy; - log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job '%s' to filter %s succeeded.", buf, bl->name); - } - } - else - { - log_error(LOG_LEVEL_ERROR, "Ignoring job %s outside filter block in %s, line %d", - buf, csp->config->re_filterfile[fileid], linenum); - } - } - - fclose(fp); - - /* - * Schedule the now-obsolete old data for unloading - */ - if ( NULL != current_re_filterfile[fileid] ) - { - current_re_filterfile[fileid]->unloader = unload_re_filterfile; - } - - /* - * Chain this file into the global list of loaded files - */ - fs->next = files->next; - files->next = fs; - current_re_filterfile[fileid] = fs; - - if (csp) - { - csp->rlist[fileid] = fs; - } - - return( 0 ); - -load_re_filterfile_error: - log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", - csp->config->re_filterfile[fileid]); - return(-1); - -} - - -/********************************************************************* - * - * Function : add_loader - * - * Description : Called from `load_config'. Called once for each input - * file found in config. - * - * Parameters : - * 1 : loader = pointer to a function that can parse and load - * the appropriate config file. - * 2 : config = The configuration_spec to add the loader to. - * - * Returns : N/A - * - *********************************************************************/ -void add_loader(int (*loader)(struct client_state *), - struct configuration_spec * config) -{ - int i; - - for (i=0; i < NLOADERS; i++) - { - if (config->loaders[i] == NULL) - { - config->loaders[i] = loader; - break; - } - } - -} - - -/********************************************************************* - * - * Function : run_loader - * - * Description : Called from `load_config' and `listen_loop'. This - * function keeps the "csp" current with any file mods - * since the last loop. If a file is unchanged, the - * loader functions do NOT reload the file. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * Must be non-null. Reads: "csp->config" - * Writes: various data members. - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int run_loader(struct client_state *csp) -{ - int ret = 0; - int i; - - for (i=0; i < NLOADERS; i++) - { - if (csp->config->loaders[i] == NULL) - { - break; - } - ret |= (csp->config->loaders[i])(csp); - } - return(ret); - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/loaders.h b/external/privoxy/loaders.h deleted file mode 100644 index ded18e3..0000000 --- a/external/privoxy/loaders.h +++ /dev/null @@ -1,250 +0,0 @@ -#ifndef LOADERS_H_INCLUDED -#define LOADERS_H_INCLUDED -#define LOADERS_H_VERSION "$Id: loaders.h,v 1.23 2008/03/30 14:52:10 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/loaders.h,v $ - * - * Purpose : Functions to load and unload the various - * configuration files. Also contains code to manage - * 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/ - * - * 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: loaders.h,v $ - * Revision 1.23 2008/03/30 14:52:10 fabiankeil - * Rename load_actions_file() and load_re_filterfile() - * as they load multiple files "now". - * - * Revision 1.22 2007/06/01 14:12:38 fabiankeil - * Add unload_forward_spec() in preparation for forward-override{}. - * - * Revision 1.21 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.19 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * 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 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.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:59:00 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#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 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_action_files(struct client_state *csp); -extern int load_re_filterfiles(struct client_state *csp); - -#ifdef FEATURE_TRUST -extern int load_trustfile(struct client_state *csp); -#endif /* def FEATURE_TRUST */ - -#ifdef FEATURE_GRACEFUL_TERMINATION -#ifdef FEATURE_TRUST -void unload_current_trust_file(void); -#endif -void unload_current_re_filterfile(void); -#endif /* FEATURE_GRACEFUL_TERMINATION */ - -void unload_forward_spec(struct forward_spec *fwd); - -extern void add_loader(int (*loader)(struct client_state *), - struct configuration_spec * config); -extern int run_loader(struct client_state *csp); - -/* Revision control strings from this header and associated .c file */ -extern const char loaders_rcs[]; -extern const char loaders_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef LOADERS_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/match-all.action b/external/privoxy/match-all.action deleted file mode 100644 index 904d85b..0000000 --- a/external/privoxy/match-all.action +++ /dev/null @@ -1,14 +0,0 @@ -############################################################################# -# $Id: match-all.action,v 1.2 2009/02/14 10:41:07 fabiankeil Exp $ -# -# This file contains the actions that are applied to all requests and -# may be overruled later on by other actions files. Less experienced -# users should only edit this file through the actions file editor. -# -############################################################################# -{ \ -+change-x-forwarded-for{block} \ -+hide-from-header{block} \ -+set-image-blocker{pattern} \ -} -/ # Match all URLs diff --git a/external/privoxy/miscutil.c b/external/privoxy/miscutil.c deleted file mode 100644 index 74aa32e..0000000 --- a/external/privoxy/miscutil.c +++ /dev/null @@ -1,1907 +0,0 @@ -const char miscutil_rcs[] = "$Id: miscutil.c,v 1.62 2008/12/04 18:16:41 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/miscutil.c,v $ - * - * Purpose : zalloc, hash_string, safe_strerror, strcmpic, - * strncmpic, 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-2007 - * 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 - * - * The timegm replacement function was taken from GnuPG, - * Copyright (C) 2004 Free Software Foundation, Inc. - * - * The snprintf replacement function is written by - * Mark Martinec who also holds the copyright. It can be - * used under the terms of the GPL or the terms of the - * "Frontier Artistic License". - * - * 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: miscutil.c,v $ - * Revision 1.62 2008/12/04 18:16:41 fabiankeil - * Fix some cparser warnings. - * - * Revision 1.61 2008/10/18 11:09:23 fabiankeil - * Improve seed used by pick_from_range() on mingw32. - * - * Revision 1.60 2008/09/07 12:35:05 fabiankeil - * Add mutex lock support for _WIN32. - * - * Revision 1.59 2008/09/04 08:13:58 fabiankeil - * Prepare for critical sections on Windows by adding a - * layer of indirection before the pthread mutex functions. - * - * Revision 1.58 2008/04/17 14:53:30 fabiankeil - * Move simplematch() into urlmatch.c as it's only - * used to match (old-school) domain patterns. - * - * Revision 1.57 2008/03/24 15:29:51 fabiankeil - * Pet gcc43. - * - * Revision 1.56 2007/12/01 12:59:05 fabiankeil - * Some sanity checks for pick_from_range(). - * - * Revision 1.55 2007/11/03 17:34:49 fabiankeil - * Log the "weak randomization factor" warning only - * once for mingw32 and provide some more details. - * - * Revision 1.54 2007/09/19 20:28:37 fabiankeil - * If privoxy_strlcpy() is called with a "buffer" size - * of 0, don't touch whatever destination points to. - * - * Revision 1.53 2007/09/09 18:20:20 fabiankeil - * Turn privoxy_strlcpy() into a function and try to work with - * b0rked snprintf() implementations too. Reported by icmp30. - * - * Revision 1.52 2007/08/19 12:32:34 fabiankeil - * Fix a conversion warning. - * - * Revision 1.51 2007/06/17 16:12:22 fabiankeil - * #ifdef _WIN32 the last commit. According to David Shaw, - * one of the gnupg developers, the changes are mingw32-specific. - * - * Revision 1.50 2007/06/10 14:59:59 fabiankeil - * Change replacement timegm() to better match our style, plug a small - * but guaranteed memory leak and fix "time zone breathing" on mingw32. - * - * Revision 1.49 2007/05/11 11:48:15 fabiankeil - * - Delete strsav() which was replaced - * by string_append() years ago. - * - Add a strlcat() look-alike. - * - Use strlcat() and strlcpy() in those parts - * of the code that are run on unixes. - * - * Revision 1.48 2007/04/09 17:48:51 fabiankeil - * Check for HAVE_SNPRINTF instead of __OS2__ - * before including the portable snprintf() code. - * - * Revision 1.47 2007/03/17 11:52:15 fabiankeil - * - Use snprintf instead of sprintf. - * - Mention copyright for the replacement - * functions in the copyright header. - * - * Revision 1.46 2007/01/18 15:03:20 fabiankeil - * Don't include replacement timegm() if - * putenv() or tzset() isn't available. - * - * Revision 1.45 2006/12/26 17:31:41 fabiankeil - * Mutex protect rand() if POSIX threading - * is used, warn the user if that's not possible - * and stop using it on _WIN32 where it could - * cause crashes. - * - * Revision 1.44 2006/11/07 12:46:43 fabiankeil - * Silence compiler warning on NetBSD 3.1. - * - * Revision 1.43 2006/09/23 13:26:38 roro - * Replace TABs by spaces in source code. - * - * Revision 1.42 2006/09/09 14:01:45 fabiankeil - * Integrated Oliver Yeoh's domain pattern fix - * to make sure *x matches xx. Closes Patch 1217393 - * and Bug 1170767. - * - * Revision 1.41 2006/08/18 16:03:17 david__schmidt - * Tweak for OS/2 build happiness. - * - * Revision 1.40 2006/08/17 17:15:10 fabiankeil - * - Back to timegm() using GnuPG's replacement if necessary. - * Using mktime() and localtime() could add a on hour offset if - * the randomize factor was big enough to lead to a summer/wintertime - * switch. - * - * - Removed now-useless Privoxy 3.0.3 compatibility glue. - * - * - Moved randomization code into pick_from_range(). - * - * - Changed parse_header_time definition. - * time_t isn't guaranteed to be signed and - * if it isn't, -1 isn't available as error code. - * Changed some variable types in client_if_modified_since() - * because of the same reason. - * - * Revision 1.39 2006/07/18 14:48:46 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.37.2.4 2003/12/01 14:45:14 oes - * Fixed two more problems with wildcarding in simplematch() - * - * Revision 1.37.2.3 2003/11/20 11:39:24 oes - * Bugfix: The "?" wildcard for domain names had never been implemented. Ooops! - * - * Revision 1.37.2.2 2002/11/12 14:28:18 oes - * Proper backtracking in simplematch; fixes bug #632888 - * - * Revision 1.37.2.1 2002/09/25 12:58:51 oes - * Made strcmpic and strncmpic safe against NULL arguments - * (which are now treated as empty strings). - * - * Revision 1.37 2002/04/26 18:29:43 jongfoster - * Fixing this Visual C++ warning: - * miscutil.c(710) : warning C4090: '=' : different 'const' qualifiers - * - * Revision 1.36 2002/04/26 12:55:38 oes - * New function string_toupper - * - * Revision 1.35 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.12 2001/06/09 10:55:28 jongfoster - * Changing BUFSIZ ==> BUFFER_SIZE - * - * Revision 1.11 2001/06/07 23:09:19 jongfoster - * Cosmetic indentation changes. - * - * Revision 1.10 2001/06/07 14:51:38 joergs - * make_path() no longer adds '/' if the dir already ends in '/'. - * - * Revision 1.9 2001/06/07 14:43:17 swa - * slight mistake in make_path, unix path style is /. - * - * Revision 1.8 2001/06/05 22:32:01 jongfoster - * New function make_path() to splice directory and file names together. - * - * Revision 1.7 2001/06/03 19:12:30 oes - * introduced bindup() - * - * Revision 1.6 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. - * - * Revision 1.5 2001/06/01 10:31:51 oes - * Added character class matching to trivimatch; renamed to simplematch - * - * Revision 1.4 2001/05/31 17:32:31 oes - * - * - Enhanced domain part globbing with infix and prefix asterisk - * matching and optional unanchored operation - * - * Revision 1.3 2001/05/29 23:10:09 oes - * - * - * - Introduced chomp() - * - Moved strsav() from showargs to miscutil - * - * Revision 1.2 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.1.1.1 2001/05/15 13:59:00 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> -#include <stdlib.h> -#if !defined(_WIN32) && !defined(__OS2__) -#include <unistd.h> -#endif /* #if !defined(_WIN32) && !defined(__OS2__) */ -#include <string.h> -#include <ctype.h> -#include <assert.h> - -#if !defined(HAVE_TIMEGM) && defined(HAVE_TZSET) && defined(HAVE_PUTENV) -#include <time.h> -#endif /* !defined(HAVE_TIMEGM) && defined(HAVE_TZSET) && defined(HAVE_PUTENV) */ - -#include "project.h" -#include "miscutil.h" -#include "errlog.h" -#include "jcc.h" - -const char miscutil_h_rcs[] = MISCUTIL_H_VERSION; - -/********************************************************************* - * - * Function : zalloc - * - * Description : Malloc some memory and set it to '\0'. - * The way calloc() ought to be -acjc - * - * Parameters : - * 1 : size = Size of memory chunk to return. - * - * Returns : Pointer to newly malloc'd memory chunk. - * - *********************************************************************/ -void *zalloc(size_t size) -{ - void * ret; - - if ((ret = (void *)malloc(size)) != NULL) - { - memset(ret, 0, size); - } - - return(ret); - -} - - -#if defined(unix) -/********************************************************************* - * - * Function : write_pid_file - * - * Description : Writes a pid file with the pid of the main process - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void write_pid_file(void) -{ - FILE *fp; - - /* - * If no --pidfile option was given, - * we can live without one. - */ - if (pidfile == NULL) return; - - if ((fp = fopen(pidfile, "w")) == NULL) - { - log_error(LOG_LEVEL_INFO, "can't open pidfile '%s': %E", pidfile); - } - else - { - fprintf(fp, "%u\n", (unsigned int) getpid()); - fclose (fp); - } - return; - -} -#endif /* def unix */ - - -/********************************************************************* - * - * Function : hash_string - * - * Description : Take a string and compute a (hopefuly) unique numeric - * integer value. This has several uses, but being able - * to "switch" a string the one of my favorites. - * - * Parameters : - * 1 : s : string to be hashed. - * - * Returns : an unsigned long variable with the hashed value. - * - *********************************************************************/ -unsigned int hash_string( const char* s ) -{ - unsigned int h = 0; - - for ( ; *s; ++s ) - { - h = 5 * h + (unsigned int)*s; - } - - return (h); - -} - - -#ifdef __MINGW32__ -/********************************************************************* - * - * Function : strdup - * - * Description : For some reason (which is beyond me), gcc and WIN32 - * don't like strdup. When a "free" is executed on a - * strdup'd ptr, it can at times freez up! So I just - * replaced it and problem was solved. - * - * Parameters : - * 1 : s = string to duplicate - * - * Returns : Pointer to newly malloc'ed copy of the string. - * - *********************************************************************/ -char *strdup( const char *s ) -{ - char * result = (char *)malloc( strlen(s)+1 ); - - if (result != NULL) - { - strcpy( result, s ); - } - - return( result ); -} - -#endif /* def __MINGW32__ */ - - - -/********************************************************************* - * - * Function : safe_strerror - * - * Description : Variant of the library routine strerror() which will - * work on systems without the library routine, and - * which should never return NULL. - * - * Parameters : - * 1 : err = the `errno' of the last operation. - * - * Returns : An "English" string of the last `errno'. Allocated - * with strdup(), so caller frees. May be NULL if the - * system is out of memory. - * - *********************************************************************/ -char *safe_strerror(int err) -{ - char *s = NULL; - char buf[BUFFER_SIZE]; - - -#ifdef HAVE_STRERROR - s = strerror(err); -#endif /* HAVE_STRERROR */ - - if (s == NULL) - { - snprintf(buf, sizeof(buf), "(errno = %d)", err); - s = buf; - } - - return(strdup(s)); - -} - - -/********************************************************************* - * - * Function : strcmpic - * - * Description : Case insensitive string comparison - * - * Parameters : - * 1 : s1 = string 1 to compare - * 2 : s2 = string 2 to compare - * - * Returns : 0 if s1==s2, Negative if s1<s2, Positive if s1>s2 - * - *********************************************************************/ -int strcmpic(const char *s1, const char *s2) -{ - if (!s1) s1 = ""; - if (!s2) s2 = ""; - - while (*s1 && *s2) - { - if ( ( *s1 != *s2 ) && ( ijb_tolower(*s1) != ijb_tolower(*s2) ) ) - { - break; - } - s1++, s2++; - } - return(ijb_tolower(*s1) - ijb_tolower(*s2)); - -} - - -/********************************************************************* - * - * Function : strncmpic - * - * Description : Case insensitive string comparison (upto n characters) - * - * Parameters : - * 1 : s1 = string 1 to compare - * 2 : s2 = string 2 to compare - * 3 : n = maximum characters to compare - * - * Returns : 0 if s1==s2, Negative if s1<s2, Positive if s1>s2 - * - *********************************************************************/ -int strncmpic(const char *s1, const char *s2, size_t n) -{ - if (n <= (size_t)0) return(0); - if (!s1) s1 = ""; - if (!s2) s2 = ""; - - while (*s1 && *s2) - { - if ( ( *s1 != *s2 ) && ( ijb_tolower(*s1) != ijb_tolower(*s2) ) ) - { - break; - } - - if (--n <= (size_t)0) break; - - s1++, s2++; - } - return(ijb_tolower(*s1) - ijb_tolower(*s2)); - -} - - -/********************************************************************* - * - * Function : chomp - * - * Description : In-situ-eliminate all leading and trailing whitespace - * from a string. - * - * Parameters : - * 1 : s : string to be chomped. - * - * Returns : chomped string - * - *********************************************************************/ -char *chomp(char *string) -{ - char *p, *q, *r; - - /* - * strip trailing whitespace - */ - p = string + strlen(string); - while (p > string && ijb_isspace(*(p-1))) - { - p--; - } - *p = '\0'; - - /* - * find end of leading whitespace - */ - q = r = string; - while (*q && ijb_isspace(*q)) - { - q++; - } - - /* - * if there was any, move the rest forwards - */ - if (q != string) - { - while (q <= p) - { - *r++ = *q++; - } - } - - return(string); - -} - - -/********************************************************************* - * - * 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; - size_t new_size; - - assert(target_string); - assert(text_to_append); - - if (*target_string == NULL) - { - return JB_ERR_MEMORY; - } - - if (*text_to_append == '\0') - { - return JB_ERR_OK; - } - - old_len = strlen(*target_string); - - new_size = strlen(text_to_append) + old_len + 1; - - if (NULL == (new_string = realloc(*target_string, new_size))) - { - free(*target_string); - - *target_string = NULL; - return JB_ERR_MEMORY; - } - - strlcpy(new_string + old_len, text_to_append, new_size - old_len); - - *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) - { - freez(*target_string); - return JB_ERR_MEMORY; - } - - err = string_append(target_string, text_to_append); - - freez(text_to_append); - - return err; -} - - -/********************************************************************* - * - * Function : string_toupper - * - * Description : Produce a copy of string with all convertible - * characters converted to uppercase. - * - * Parameters : - * 1 : string = string to convert - * - * Returns : Uppercase copy of string if possible, - * NULL on out-of-memory or if string was NULL. - * - *********************************************************************/ -char *string_toupper(const char *string) -{ - char *result, *p; - const char *q; - - if (!string || ((result = (char *) zalloc(strlen(string) + 1)) == NULL)) - { - return NULL; - } - - q = string; - p = result; - - while (*q != '\0') - { - *p++ = (char)toupper((int) *q++); - } - - return result; - -} - - -/********************************************************************* - * - * Function : bindup - * - * Description : Duplicate the first n characters of a string that may - * contain '\0' characters. - * - * Parameters : - * 1 : string = string to be duplicated - * 2 : len = number of bytes to duplicate - * - * Returns : pointer to copy, or NULL if failiure - * - *********************************************************************/ -char *bindup(const char *string, size_t len) -{ - char *duplicate; - - if (NULL == (duplicate = (char *)malloc(len))) - { - return NULL; - } - else - { - memcpy(duplicate, string, len); - } - - return duplicate; - -} - - -/********************************************************************* - * - * Function : make_path - * - * Description : Takes a directory name and a file name, returns - * the complete path. Handles windows/unix differences. - * If the file name is already an absolute path, or if - * the directory name is NULL or empty, it returns - * the filename. - * - * Parameters : - * 1 : dir: Name of directory or NULL for none. - * 2 : file: Name of file. Should not be NULL or empty. - * - * Returns : "dir/file" (Or on windows, "dir\file"). - * It allocates the string on the heap. Caller frees. - * Returns NULL in error (i.e. NULL file or out of - * memory) - * - *********************************************************************/ -char * make_path(const char * dir, const char * file) -{ -#ifdef AMIGA - char path[512]; - - if(dir) - { - if(dir[0] == '.') - { - if(dir[1] == '/') - { - strncpy(path,dir+2,512); - } - else - { - strncpy(path,dir+1,512); - } - } - else - { - strncpy(path,dir,512); - } - path[511]=0; - } - else - { - path[0]=0; - } - if(AddPart(path,file,512)) - { - return strdup(path); - } - else - { - return NULL; - } -#else /* ndef AMIGA */ - - if ((file == NULL) || (*file == '\0')) - { - return NULL; /* Error */ - } - - if ((dir == NULL) || (*dir == '\0') /* No directory specified */ -#if defined(_WIN32) || defined(__OS2__) - || (*file == '\') || (file[1] == ':') /* Absolute path (DOS) */ -#else /* ifndef _WIN32 || __OS2__ */ - || (*file == '/') /* Absolute path (U*ix) */ -#endif /* ifndef _WIN32 || __OS2__ */ - ) - { - return strdup(file); - } - else - { - char * path; - size_t path_size = strlen(dir) + strlen(file) + 2; /* +2 for trailing (back)slash and \0 */ - -#if defined(unix) - if ( *dir != '/' && basedir && *basedir ) - { - /* - * Relative path, so start with the base directory. - */ - path_size += strlen(basedir) + 1; /* +1 for the slash */ - path = malloc(path_size); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); - strlcpy(path, basedir, path_size); - strlcat(path, "/", path_size); - strlcat(path, dir, path_size); - } - else -#endif /* defined unix */ - { - path = malloc(path_size); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); - strlcpy(path, dir, path_size); - } - -#if defined(_WIN32) || defined(__OS2__) - if(path[strlen(path)-1] != '\') - { - strlcat(path, "\", path_size); - } -#else /* ifndef _WIN32 || __OS2__ */ - if(path[strlen(path)-1] != '/') - { - strlcat(path, "/", path_size); - } -#endif /* ifndef _WIN32 || __OS2__ */ - strlcat(path, file, path_size); - - return path; - } -#endif /* ndef AMIGA */ -} - - -/********************************************************************* - * - * Function : pick_from_range - * - * Description : Pick a positive number out of a given range. - * Should only be used if randomness would be nice, - * but isn't really necessary. - * - * Parameters : - * 1 : range: Highest possible number to pick. - * - * Returns : Picked number. - * - *********************************************************************/ -long int pick_from_range(long int range) -{ - long int number; -#ifdef _WIN32 - static unsigned long seed = 0; -#endif /* def _WIN32 */ - - assert(range != 0); - assert(range > 0); - - if (range <= 0) return 0; - -#ifdef HAVE_RANDOM - number = random() % range + 1; -#elif defined(MUTEX_LOCKS_AVAILABLE) - privoxy_mutex_lock(&rand_mutex); -#ifdef _WIN32 - if (!seed) - { - seed = (unsigned long)(GetCurrentThreadId()+GetTickCount()); - } - srand(seed); - seed = (unsigned long)((rand() << 16) + rand()); -#endif /* def _WIN32 */ - number = (unsigned long)((rand() << 16) + (rand())) % (unsigned long)(range + 1); - privoxy_mutex_unlock(&rand_mutex); -#else - /* - * XXX: Which platforms reach this and are there - * better options than just using rand() and hoping - * that it's safe? - */ - log_error(LOG_LEVEL_INFO, "No thread-safe PRNG available? Header time randomization " - "might cause crashes, predictable results or even combine these fine options."); - number = rand() % (long int)(range + 1); - -#endif /* (def HAVE_RANDOM) */ - - return number; -} - - -#ifdef USE_PRIVOXY_STRLCPY -/********************************************************************* - * - * Function : privoxy_strlcpy - * - * Description : strlcpy(3) look-alike for those without decent libc. - * - * Parameters : - * 1 : destination: buffer to copy into. - * 2 : source: String to copy. - * 3 : size: Size of destination buffer. - * - * Returns : The length of the string that privoxy_strlcpy() tried to create. - * - *********************************************************************/ -size_t privoxy_strlcpy(char *destination, const char *source, const size_t size) -{ - if (0 < size) - { - snprintf(destination, size, "%s", source); - /* - * Platforms that lack strlcpy() also tend to have - * a broken snprintf implementation that doesn't - * guarantee nul termination. - * - * XXX: the configure script should detect and reject those. - */ - destination[size-1] = '\0'; - } - return strlen(source); -} -#endif /* def USE_PRIVOXY_STRLCPY */ - - -#ifndef HAVE_STRLCAT -/********************************************************************* - * - * Function : privoxy_strlcat - * - * Description : strlcat(3) look-alike for those without decent libc. - * - * Parameters : - * 1 : destination: C string. - * 2 : source: String to copy. - * 3 : size: Size of destination buffer. - * - * Returns : The length of the string that privoxy_strlcat() tried to create. - * - *********************************************************************/ -size_t privoxy_strlcat(char *destination, const char *source, const size_t size) -{ - const size_t old_length = strlen(destination); - return old_length + strlcpy(destination + old_length, source, size - old_length); -} -#endif /* ndef HAVE_STRLCAT */ - - -#if !defined(HAVE_TIMEGM) && defined(HAVE_TZSET) && defined(HAVE_PUTENV) -/********************************************************************* - * - * Function : timegm - * - * Description : libc replacement function for the inverse of gmtime(). - * Copyright (C) 2004 Free Software Foundation, Inc. - * - * Code originally copied from GnuPG, modifications done - * for Privoxy: style changed, #ifdefs for _WIN32 added - * to have it work on mingw32. - * - * XXX: It's very unlikely to happen, but if the malloc() - * call fails the time zone will be permanently set to UTC. - * - * Parameters : - * 1 : tm: Broken-down time struct. - * - * Returns : tm converted into time_t seconds. - * - *********************************************************************/ -time_t timegm(struct tm *tm) -{ - time_t answer; - char *zone; - - zone = getenv("TZ"); - putenv("TZ=UTC"); - tzset(); - answer = mktime(tm); - if (zone) - { - char *old_zone; - - old_zone = malloc(3 + strlen(zone) + 1); - if (old_zone) - { - strcpy(old_zone, "TZ="); - strcat(old_zone, zone); - putenv(old_zone); -#ifdef _WIN32 - free(old_zone); -#endif /* def _WIN32 */ - } - } - else - { -#ifdef HAVE_UNSETENV - unsetenv("TZ"); -#elif defined(_WIN32) - putenv("TZ="); -#else - putenv("TZ"); -#endif - } - tzset(); - - return answer; -} -#endif /* !defined(HAVE_TIMEGM) && defined(HAVE_TZSET) && defined(HAVE_PUTENV) */ - - -#ifndef HAVE_SNPRINTF -/* - * What follows is a portable snprintf routine, written by Mark Martinec. - * See: http://www.ijs.si/software/snprintf/ - - snprintf.c - - a portable implementation of snprintf, - including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf - - snprintf is a routine to convert numeric and string arguments to - formatted strings. It is similar to sprintf(3) provided in a system's - C library, yet it requires an additional argument - the buffer size - - and it guarantees never to store anything beyond the given buffer, - regardless of the format or arguments to be formatted. Some newer - operating systems do provide snprintf in their C library, but many do - not or do provide an inadequate (slow or idiosyncratic) version, which - calls for a portable implementation of this routine. - -Author - - Mark Martinec mark.martinec@ijs.si, April 1999, June 2000 - Copyright © 1999, Mark Martinec - - */ - -#define PORTABLE_SNPRINTF_VERSION_MAJOR 2 -#define PORTABLE_SNPRINTF_VERSION_MINOR 2 - -#if defined(NEED_ASPRINTF) || defined(NEED_ASNPRINTF) || defined(NEED_VASPRINTF) || defined(NEED_VASNPRINTF) -# if defined(NEED_SNPRINTF_ONLY) -# undef NEED_SNPRINTF_ONLY -# endif -# if !defined(PREFER_PORTABLE_SNPRINTF) -# define PREFER_PORTABLE_SNPRINTF -# endif -#endif - -#if defined(SOLARIS_BUG_COMPATIBLE) && !defined(SOLARIS_COMPATIBLE) -#define SOLARIS_COMPATIBLE -#endif - -#if defined(HPUX_BUG_COMPATIBLE) && !defined(HPUX_COMPATIBLE) -#define HPUX_COMPATIBLE -#endif - -#if defined(DIGITAL_UNIX_BUG_COMPATIBLE) && !defined(DIGITAL_UNIX_COMPATIBLE) -#define DIGITAL_UNIX_COMPATIBLE -#endif - -#if defined(PERL_BUG_COMPATIBLE) && !defined(PERL_COMPATIBLE) -#define PERL_COMPATIBLE -#endif - -#if defined(LINUX_BUG_COMPATIBLE) && !defined(LINUX_COMPATIBLE) -#define LINUX_COMPATIBLE -#endif - -#include <sys/types.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> -#include <assert.h> -#include <errno.h> - -#ifdef isdigit -#undef isdigit -#endif -#define isdigit(c) ((c) >= '0' && (c) <= '9') - -/* For copying strings longer or equal to 'breakeven_point' - * it is more efficient to call memcpy() than to do it inline. - * The value depends mostly on the processor architecture, - * but also on the compiler and its optimization capabilities. - * The value is not critical, some small value greater than zero - * will be just fine if you don't care to squeeze every drop - * of performance out of the code. - * - * Small values favor memcpy, large values favor inline code. - */ -#if defined(__alpha__) || defined(__alpha) -# define breakeven_point 2 /* AXP (DEC Alpha) - gcc or cc or egcs */ -#endif -#if defined(__i386__) || defined(__i386) -# define breakeven_point 12 /* Intel Pentium/Linux - gcc 2.96 */ -#endif -#if defined(__hppa) -# define breakeven_point 10 /* HP-PA - gcc */ -#endif -#if defined(__sparc__) || defined(__sparc) -# define breakeven_point 33 /* Sun Sparc 5 - gcc 2.8.1 */ -#endif - -/* some other values of possible interest: */ -/* #define breakeven_point 8 */ /* VAX 4000 - vaxc */ -/* #define breakeven_point 19 */ /* VAX 4000 - gcc 2.7.0 */ - -#ifndef breakeven_point -# define breakeven_point 6 /* some reasonable one-size-fits-all value */ -#endif - -#define fast_memcpy(d,s,n) \ - { register size_t nn = (size_t)(n); \ - if (nn >= breakeven_point) memcpy((d), (s), nn); \ - else if (nn > 0) { /* proc call overhead is worth only for large strings*/\ - register char *dd; register const char *ss; \ - for (ss=(s), dd=(d); nn>0; nn--) *dd++ = *ss++; } } - -#define fast_memset(d,c,n) \ - { register size_t nn = (size_t)(n); \ - if (nn >= breakeven_point) memset((d), (int)(c), nn); \ - else if (nn > 0) { /* proc call overhead is worth only for large strings*/\ - register char *dd; register const int cc=(int)(c); \ - for (dd=(d); nn>0; nn--) *dd++ = cc; } } - -/* prototypes */ - -#if defined(NEED_ASPRINTF) -int asprintf (char **ptr, const char *fmt, /*args*/ ...); -#endif -#if defined(NEED_VASPRINTF) -int vasprintf (char **ptr, const char *fmt, va_list ap); -#endif -#if defined(NEED_ASNPRINTF) -int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...); -#endif -#if defined(NEED_VASNPRINTF) -int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap); -#endif - -#if defined(HAVE_SNPRINTF) -/* declare our portable snprintf routine under name portable_snprintf */ -/* declare our portable vsnprintf routine under name portable_vsnprintf */ -#else -/* declare our portable routines under names snprintf and vsnprintf */ -#define portable_snprintf snprintf -#if !defined(NEED_SNPRINTF_ONLY) -#define portable_vsnprintf vsnprintf -#endif -#endif - -#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF) -int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...); -#if !defined(NEED_SNPRINTF_ONLY) -int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap); -#endif -#endif - -/* declarations */ - -static char credits[] = "\n\ -@(#)snprintf.c, v2.2: Mark Martinec, mark.martinec@ijs.si\n\ -@(#)snprintf.c, v2.2: Copyright 1999, Mark Martinec. Frontier Artistic License applies.\n\ -@(#)snprintf.c, v2.2: http://www.ijs.si/software/snprintf/%5Cn"; - -#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 /* ndef HAVE_SNPRINTF */ -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/miscutil.h b/external/privoxy/miscutil.h deleted file mode 100644 index a0498ac..0000000 --- a/external/privoxy/miscutil.h +++ /dev/null @@ -1,259 +0,0 @@ -#ifndef MISCUTIL_H_INCLUDED -#define MISCUTIL_H_INCLUDED -#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.30 2008/04/17 14:53:31 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/miscutil.h,v $ - * - * Purpose : zalloc, hash_string, safe_strerror, strcmpic, - * strncmpic, 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-2007 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: miscutil.h,v $ - * Revision 1.30 2008/04/17 14:53:31 fabiankeil - * Move simplematch() into urlmatch.c as it's only - * used to match (old-school) domain patterns. - * - * Revision 1.29 2007/09/09 18:20:20 fabiankeil - * Turn privoxy_strlcpy() into a function and try to work with - * b0rked snprintf() implementations too. Reported by icmp30. - * - * Revision 1.28 2007/05/11 11:48:16 fabiankeil - * - Delete strsav() which was replaced - * by string_append() years ago. - * - Add a strlcat() look-alike. - * - Use strlcat() and strlcpy() in those parts - * of the code that are run on unixes. - * - * Revision 1.27 2007/04/09 17:48:51 fabiankeil - * Check for HAVE_SNPRINTF instead of __OS2__ - * before including the portable snprintf() code. - * - * Revision 1.26 2007/04/08 17:04:51 fabiankeil - * Add macro for strlcpy() in case the libc lacks it. - * - * Revision 1.25 2007/01/18 15:03:20 fabiankeil - * Don't include replacement timegm() if - * putenv() or tzset() isn't available. - * - * Revision 1.24 2006/08/17 17:15:10 fabiankeil - * - Back to timegm() using GnuPG's replacement if necessary. - * Using mktime() and localtime() could add a on hour offset if - * the randomize factor was big enough to lead to a summer/wintertime - * switch. - * - * - Removed now-useless Privoxy 3.0.3 compatibility glue. - * - * - Moved randomization code into pick_from_range(). - * - * - Changed parse_header_time definition. - * time_t isn't guaranteed to be signed and - * if it isn't, -1 isn't available as error code. - * Changed some variable types in client_if_modified_since() - * because of the same reason. - * - * Revision 1.23 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.21 2002/04/26 12:55:38 oes - * New function string_toupper - * - * Revision 1.20 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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. - * - * Revision 1.6 2001/06/03 19:12:30 oes - * introduced bindup() - * - * Revision 1.5 2001/06/01 10:31:51 oes - * Added character class matching to trivimatch; renamed to simplematch - * - * Revision 1.4 2001/05/31 17:32:31 oes - * - * - Enhanced domain part globbing with infix and prefix asterisk - * matching and optional unanchored operation - * - * Revision 1.3 2001/05/29 23:10:09 oes - * - * - * - Introduced chomp() - * - Moved strsav() from showargs to miscutil - * - * Revision 1.2 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.1.1.1 2001/05/15 13:59:00 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "project.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -extern const char *basedir; -extern void *zalloc(size_t size); - -#if defined(unix) -extern void write_pid_file(void); -#endif /* unix */ - -extern unsigned int hash_string(const char* s); - -extern char *safe_strerror(int err); - -extern int strcmpic(const char *s1, const char *s2); -extern int strncmpic(const char *s1, const char *s2, size_t n); - -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 *string_toupper(const char *string); -extern char *chomp(char *string); -extern char *bindup(const char *string, size_t len); - -extern char *make_path(const char * dir, const char * file); - -long int pick_from_range(long int range); - -#ifdef __MINGW32__ -extern char *strdup(const char *s); -#endif /* def __MINGW32__ */ - -#ifndef HAVE_SNPRINTF -extern int snprintf(char *, size_t, const char *, /*args*/ ...); -#endif /* ndef HAVE_SNPRINTF */ - -#if !defined(HAVE_TIMEGM) && defined(HAVE_TZSET) && defined(HAVE_PUTENV) -time_t timegm(struct tm *tm); -#endif /* !defined(HAVE_TIMEGM) && defined(HAVE_TZSET) && defined(HAVE_PUTENV) */ - -/* Here's looking at you, Ulrich. */ -#if !defined(HAVE_STRLCPY) -size_t privoxy_strlcpy(char *destination, const char *source, size_t size); -#define strlcpy privoxy_strlcpy -#define USE_PRIVOXY_STRLCPY 1 -#define HAVE_STRLCPY 1 -#endif /* ndef HAVE_STRLCPY*/ - -#ifndef HAVE_STRLCAT -size_t privoxy_strlcat(char *destination, const char *source, size_t size); -#define strlcat privoxy_strlcat -#endif /* ndef HAVE_STRLCAT */ - -/* Revision control strings from this header and associated .c file */ -extern const char miscutil_rcs[]; -extern const char miscutil_h_rcs[]; - -#if defined(__cplusplus) -} -#endif - -#endif /* ndef MISCUTIL_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/mkinstalldirs b/external/privoxy/mkinstalldirs deleted file mode 100755 index 3f681b3..0000000 --- a/external/privoxy/mkinstalldirs +++ /dev/null @@ -1,40 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman friedman@prep.ai.mit.edu -# Created: 1993-05-16 -# Public domain - -# $Id: mkinstalldirs,v 1.4 2006/07/18 14:48:47 david__schmidt Exp $ - -errstatus=0 - -for file -do - set fnord `echo ":$file" | sed -ne 's/^://#/;s/^://;s/// /g;s/^#///;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/external/privoxy/parsers.c b/external/privoxy/parsers.c deleted file mode 100644 index 021762e..0000000 --- a/external/privoxy/parsers.c +++ /dev/null @@ -1,4740 +0,0 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.154 2009/03/13 14:10:07 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ - * - * Purpose : Declares functions to parse/crunch headers and pages. - * Functions declared include: - * `add_to_iob', `client_cookie_adder', `client_from', - * `client_referrer', `client_send_cookie', `client_ua', - * `client_uagent', `client_x_forwarded', - * `client_x_forwarded_adder', `client_xtra_adder', - * `content_type', `crumble', `destroy_list', `enlist', - * `flush_socket', ``get_header', `sed', `filter_header' - * `server_content_encoding', `server_content_disposition', - * `server_last_modified', `client_accept_language', - * `crunch_client_header', `client_if_modified_since', - * `client_if_none_match', `get_destination_from_headers', - * `parse_header_time', `decompress_iob' and `server_set_cookie'. - * - * Copyright : Written by and Copyright (C) 2001-2009 the - * 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: parsers.c,v $ - * Revision 1.154 2009/03/13 14:10:07 fabiankeil - * Fix some more harmless warnings on amd64. - * - * Revision 1.153 2009/03/07 13:09:17 fabiankeil - * Change csp->expected_content and_csp->expected_content_length from - * size_t to unsigned long long to reduce the likelihood of integer - * overflows that would let us close the connection prematurely. - * Bug found while investigating #2669131, reported by cyberpatrol. - * - * Revision 1.152 2009/03/01 18:43:48 fabiankeil - * Help clang understand that we aren't dereferencing - * NULL pointers here. - * - * Revision 1.151 2009/02/15 14:46:35 fabiankeil - * Don't let hide-referrer{conditional-*}} pass - * Referer headers without http URLs. - * - * Revision 1.150 2008/12/04 18:12:19 fabiankeil - * Fix some cparser warnings. - * - * Revision 1.149 2008/11/21 18:39:53 fabiankeil - * In case of CONNECT requests there's no point - * in trying to keep the connection alive. - * - * Revision 1.148 2008/11/16 12:43:49 fabiankeil - * Turn keep-alive support into a runtime feature - * that is disabled by setting keep-alive-timeout - * to a negative value. - * - * Revision 1.147 2008/11/04 17:20:31 fabiankeil - * HTTP/1.1 responses without Connection - * header imply keep-alive. Act accordingly. - * - * Revision 1.146 2008/10/12 16:46:35 fabiankeil - * Remove obsolete warning about delayed delivery with chunked - * transfer encoding and FEATURE_CONNECTION_KEEP_ALIVE enabled. - * - * Revision 1.145 2008/10/09 18:21:41 fabiankeil - * Flush work-in-progress changes to keep outgoing connections - * alive where possible. Incomplete and mostly #ifdef'd out. - * - * Revision 1.144 2008/09/21 13:59:33 fabiankeil - * Treat unknown change-x-forwarded-for parameters as fatal errors. - * - * Revision 1.143 2008/09/21 13:36:52 fabiankeil - * If change-x-forwarded-for{add} is used and the client - * sends multiple X-Forwarded-For headers, append the client's - * IP address to each one of them. "Traditionally" we would - * lose all but the last one. - * - * Revision 1.142 2008/09/20 10:04:33 fabiankeil - * Remove hide-forwarded-for-headers action which has - * been obsoleted by change-x-forwarded-for{block}. - * - * Revision 1.141 2008/09/19 15:26:28 fabiankeil - * Add change-x-forwarded-for{} action to block or add - * X-Forwarded-For headers. Mostly based on code removed - * before 3.0.7. - * - * Revision 1.140 2008/09/12 17:51:43 fabiankeil - * - A few style fixes. - * - Remove a pointless cast. - * - * Revision 1.139 2008/09/04 08:13:58 fabiankeil - * Prepare for critical sections on Windows by adding a - * layer of indirection before the pthread mutex functions. - * - * Revision 1.138 2008/08/30 12:03:07 fabiankeil - * Remove FEATURE_COOKIE_JAR. - * - * Revision 1.137 2008/05/30 15:50:08 fabiankeil - * Remove questionable micro-optimizations - * whose usefulness has never been measured. - * - * Revision 1.136 2008/05/26 16:02:24 fabiankeil - * s@Insufficent@Insufficient@ - * - * Revision 1.135 2008/05/21 20:12:10 fabiankeil - * The whole point of strclean() is to modify the - * first parameter, so don't mark it immutable, - * even though the compiler lets us get away with it. - * - * Revision 1.134 2008/05/21 19:27:25 fabiankeil - * As the wafer actions are gone, we can stop including encode.h. - * - * Revision 1.133 2008/05/21 15:50:47 fabiankeil - * Ditch cast from (char **) to (char **). - * - * Revision 1.132 2008/05/21 15:47:14 fabiankeil - * Streamline sed()'s prototype and declare - * the header parse and add structures static. - * - * Revision 1.131 2008/05/20 20:13:30 fabiankeil - * Factor update_server_headers() out of sed(), ditch the - * first_run hack and make server_patterns_light static. - * - * Revision 1.130 2008/05/19 17:18:04 fabiankeil - * Wrap memmove() calls in string_move() - * to document the purpose in one place. - * - * Revision 1.129 2008/05/17 14:02:07 fabiankeil - * Normalize linear header white space. - * - * Revision 1.128 2008/05/16 16:39:03 fabiankeil - * If a header is split across multiple lines, - * merge them to a single line before parsing them. - * - * Revision 1.127 2008/05/10 13:23:38 fabiankeil - * Don't provide get_header() with the whole client state - * structure when it only needs access to csp->iob. - * - * Revision 1.126 2008/05/03 16:40:45 fabiankeil - * Change content_filters_enabled()'s parameter from - * csp->action to action so it can be also used in the - * CGI code. Don't bother checking if there are filters - * loaded, as that's somewhat besides the point. - * - * Revision 1.125 2008/04/17 14:40:49 fabiankeil - * Provide get_http_time() with the buffer size so it doesn't - * have to blindly assume that the buffer is big enough. - * - * Revision 1.124 2008/04/16 16:38:21 fabiankeil - * Don't pass the whole csp structure to flush_socket() - * when it only needs a file descriptor and a buffer. - * - * Revision 1.123 2008/03/29 12:13:46 fabiankeil - * Remove send-wafer and send-vanilla-wafer actions. - * - * Revision 1.122 2008/03/28 15:13:39 fabiankeil - * Remove inspect-jpegs action. - * - * Revision 1.121 2008/01/05 21:37:03 fabiankeil - * Let client_range() also handle Request-Range headers - * which apparently are still supported by many servers. - * - * Revision 1.120 2008/01/04 17:43:45 fabiankeil - * Improve the warning messages that get logged if the action files - * "enable" filters but no filters of that type have been loaded. - * - * Revision 1.119 2007/12/28 18:32:51 fabiankeil - * In server_content_type(): - * - Don't require leading white space when detecting image content types. - * - Change '... not replaced ...' message to sound less crazy if the text - * type actually is 'text/plain'. - * - Mark the 'text/plain == binary data' assumption for removal. - * - Remove a bunch of trailing white space. - * - * Revision 1.118 2007/12/28 16:56:35 fabiankeil - * Minor server_content_disposition() changes: - * - Don't regenerate the header name all lower-case. - * - Some white space fixes. - * - Remove useless log message in case of ENOMEM. - * - * Revision 1.117 2007/12/06 18:11:50 fabiankeil - * Garbage-collect the code to add a X-Forwarded-For - * header as it seems to be mostly used by accident. - * - * Revision 1.116 2007/12/01 13:04:22 fabiankeil - * Fix a crash on mingw32 with some Last Modified times in the future. - * - * Revision 1.115 2007/11/02 16:52:50 fabiankeil - * Remove a "can't happen" error block which, over - * time, mutated into a "guaranteed to happen" block. - * - * Revision 1.114 2007/10/19 16:56:26 fabiankeil - * - Downgrade "Buffer limit reached" message to LOG_LEVEL_INFO. - * - Use shiny new content_filters_enabled() in client_range(). - * - * Revision 1.113 2007/10/10 17:29:57 fabiankeil - * I forgot about Poland. - * - * Revision 1.112 2007/10/09 16:38:40 fabiankeil - * Remove Range and If-Range headers if content filtering is enabled. - * - * Revision 1.111 2007/10/04 18:07:00 fabiankeil - * Move ACTION_VANILLA_WAFER handling from jcc's chat() into - * client_cookie_adder() to make sure send-vanilla-wafer can be - * controlled through tags (and thus regression-tested). - * - * Revision 1.110 2007/09/29 10:42:37 fabiankeil - * - Remove "scanning headers for" log message again. - * - Some more whitespace fixes. - * - * Revision 1.109 2007/09/08 14:25:48 fabiankeil - * Refactor client_referrer() and add conditional-forge parameter. - * - * Revision 1.108 2007/08/28 18:21:03 fabiankeil - * A bunch of whitespace fixes, pointy hat to me. - * - * Revision 1.107 2007/08/28 18:16:32 fabiankeil - * Fix possible memory corruption in server_http, make sure it's not - * executed for ordinary server headers and mark some problems for later. - * - * Revision 1.106 2007/08/18 14:30:32 fabiankeil - * Let content-type-overwrite{} honour force-text-mode again. - * - * Revision 1.105 2007/08/11 14:49:49 fabiankeil - * - Add prototpyes for the header parsers and make them static. - * - Comment out client_accept_encoding_adder() which isn't used right now. - * - * Revision 1.104 2007/07/14 07:38:19 fabiankeil - * Move the ACTION_FORCE_TEXT_MODE check out of - * server_content_type(). Signal other functions - * whether or not a content type has been declared. - * Part of the fix for BR#1750917. - * - * Revision 1.103 2007/06/01 16:31:54 fabiankeil - * Change sed() to return a jb_err in preparation for forward-override{}. - * - * Revision 1.102 2007/05/27 12:39:32 fabiankeil - * Adjust "X-Filter: No" to disable dedicated header filters. - * - * Revision 1.101 2007/05/14 10:16:41 fabiankeil - * Streamline client_cookie_adder(). - * - * Revision 1.100 2007/04/30 15:53:11 fabiankeil - * Make sure filters with dynamic jobs actually use them. - * - * Revision 1.99 2007/04/30 15:06:26 fabiankeil - * - Introduce dynamic pcrs jobs that can resolve variables. - * - Remove unnecessary update_action_bits_for_all_tags() call. - * - * Revision 1.98 2007/04/17 18:32:10 fabiankeil - * - Make tagging based on tags set by earlier taggers - * of the same kind possible. - * - Log whether or not new tags cause action bits updates - * (in which case a matching tag-pattern section exists). - * - Log if the user tries to set a tag that is already set. - * - * Revision 1.97 2007/04/15 16:39:21 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.96 2007/04/12 12:53:58 fabiankeil - * Log a warning if the content is compressed, filtering is - * enabled and Privoxy was compiled without zlib support. - * Closes FR#1673938. - * - * Revision 1.95 2007/03/25 14:26:40 fabiankeil - * - Fix warnings when compiled with glibc. - * - Don't use crumble() for cookie crunching. - * - Move cookie time parsing into parse_header_time(). - * - Let parse_header_time() return a jb_err code - * instead of a pointer that can only be used to - * check for NULL anyway. - * - * Revision 1.94 2007/03/21 12:23:53 fabiankeil - * - Add better protection against malicious gzip headers. - * - Stop logging the first hundred bytes of decompressed content. - * It looks like it's working and there is always debug 16. - * - Log the content size after decompression in decompress_iob() - * instead of pcrs_filter_response(). - * - * Revision 1.93 2007/03/20 15:21:44 fabiankeil - * - Use dedicated header filter actions instead of abusing "filter". - * Replace "filter-client-headers" and "filter-client-headers" - * with "server-header-filter" and "client-header-filter". - * - Remove filter_client_header() and filter_client_header(), - * filter_header() now checks the shiny new - * CSP_FLAG_CLIENT_HEADER_PARSING_DONE flag instead. - * - * Revision 1.92 2007/03/05 13:25:32 fabiankeil - * - Cosmetical changes for LOG_LEVEL_RE_FILTER messages. - * - Handle "Cookie:" and "Connection:" headers a bit smarter - * (don't crunch them just to recreate them later on). - * - Add another non-standard time format for the cookie - * expiration date detection. - * - Fix a valgrind warning. - * - * Revision 1.91 2007/02/24 12:27:32 fabiankeil - * Improve cookie expiration date detection. - * - * Revision 1.90 2007/02/08 19:12:35 fabiankeil - * Don't run server_content_length() the first time - * sed() parses server headers; only adjust the - * Content-Length header if the page was modified. - * - * Revision 1.89 2007/02/07 16:52:11 fabiankeil - * Fix log messages regarding the cookie time format - * (cookie and request URL were mixed up). - * - * Revision 1.88 2007/02/07 11:27:12 fabiankeil - * - Let decompress_iob() - * - not corrupt the content if decompression fails - * early. (the first byte(s) were lost). - * - use pointer arithmetics with defined outcome for - * a change. - * - Use a different kludge to remember a failed decompression. - * - * Revision 1.87 2007/01/31 16:21:38 fabiankeil - * Search for Max-Forwards headers case-insensitive, - * don't generate the "501 unsupported" message for invalid - * Max-Forwards values and don't increase negative ones. - * - * Revision 1.86 2007/01/30 13:05:26 fabiankeil - * - Let server_set_cookie() check the expiration date - * of cookies and don't touch the ones that are already - * expired. Fixes problems with low quality web applications - * as described in BR 932612. - * - * - Adjust comment in client_max_forwards to reality; - * remove invalid Max-Forwards headers. - * - * Revision 1.85 2007/01/26 15:33:46 fabiankeil - * Stop filter_header() from unintentionally removing - * empty header lines that were enlisted by the continue - * hack. - * - * Revision 1.84 2007/01/24 12:56:52 fabiankeil - * - Repeat the request URL before logging any headers. - * Makes reading the log easier in case of simultaneous requests. - * - If there are more than one Content-Type headers in one request, - * use the first one and remove the others. - * - Remove "newval" variable in server_content_type(). - * It's only used once. - * - * Revision 1.83 2007/01/12 15:03:02 fabiankeil - * Correct a cast, check inflateEnd() exit code - * to see if we have to, replace sprintf calls - * with snprintf. - * - * Revision 1.82 2007/01/01 19:36:37 fabiankeil - * Integrate a modified version of Wil Mahan's - * zlib patch (PR #895531). - * - * Revision 1.81 2006/12/31 22:21:33 fabiankeil - * Skip empty filter files in filter_header() - * but don't ignore the ones that come afterwards. - * Fixes BR 1619208, this time for real. - * - * Revision 1.80 2006/12/29 19:08:22 fabiankeil - * Reverted parts of my last commit - * to keep error handling working. - * - * Revision 1.79 2006/12/29 18:04:40 fabiankeil - * Fixed gcc43 conversion warnings. - * - * Revision 1.78 2006/12/26 17:19:20 fabiankeil - * Bringing back the "useless" localtime() call - * I removed in revision 1.67. On some platforms - * it's necessary to prevent time zone offsets. - * - * Revision 1.77 2006/12/07 18:44:26 fabiankeil - * Rebuild request URL in get_destination_from_headers() - * to make sure redirect{pcrs command} works as expected - * for intercepted requests. - * - * Revision 1.76 2006/12/06 19:52:25 fabiankeil - * Added get_destination_from_headers(). - * - * Revision 1.75 2006/11/13 19:05:51 fabiankeil - * Make pthread mutex locking more generic. Instead of - * checking for OSX and OpenBSD, check for FEATURE_PTHREAD - * and use mutex locking unless there is an _r function - * available. Better safe than sorry. - * - * Fixes "./configure --disable-pthread" and should result - * in less threading-related problems on pthread-using platforms, - * but it still doesn't fix BR#1122404. - * - * Revision 1.74 2006/10/02 16:59:12 fabiankeil - * The special header "X-Filter: No" now disables - * header filtering as well. - * - * Revision 1.73 2006/09/23 13:26:38 roro - * Replace TABs by spaces in source code. - * - * Revision 1.72 2006/09/23 12:37:21 fabiankeil - * Don't print a log message every time filter_headers is - * entered or left. It only creates noise without any real - * information. - * - * Revision 1.71 2006/09/21 19:55:17 fabiankeil - * Fix +hide-if-modified-since{-n}. - * - * Revision 1.70 2006/09/08 12:06:34 fabiankeil - * Have hide-if-modified-since interpret the random - * range value as minutes instead of hours. Allows - * more fine-grained configuration. - * - * Revision 1.69 2006/09/06 16:25:51 fabiankeil - * Always have parse_header_time return a pointer - * that actual makes sense, even though we currently - * only need it to detect problems. - * - * Revision 1.68 2006/09/06 10:43:32 fabiankeil - * Added config option enable-remote-http-toggle - * to specify if Privoxy should recognize special - * headers (currently only X-Filter) to change its - * behaviour. Disabled by default. - * - * Revision 1.67 2006/09/04 11:01:26 fabiankeil - * After filtering de-chunked instances, remove - * "Transfer-Encoding" header entirely instead of changing - * it to "Transfer-Encoding: identity", which is invalid. - * Thanks Michael Shields shields@msrl.com. Fixes PR 1318658. - * - * Don't use localtime in parse_header_time. An empty time struct - * is good enough, it gets overwritten by strptime anyway. - * - * Revision 1.66 2006/09/03 19:38:28 fabiankeil - * Use gmtime_r if available, fallback to gmtime with mutex - * protection for MacOSX and use vanilla gmtime for the rest. - * - * Revision 1.65 2006/08/22 10:55:56 fabiankeil - * Changed client_referrer to use the right type (size_t) for - * hostlenght and to shorten the temporary referrer string with - * '\0' instead of adding a useless line break. - * - * Revision 1.64 2006/08/17 17:15:10 fabiankeil - * - Back to timegm() using GnuPG's replacement if necessary. - * Using mktime() and localtime() could add a on hour offset if - * the randomize factor was big enough to lead to a summer/wintertime - * switch. - * - * - Removed now-useless Privoxy 3.0.3 compatibility glue. - * - * - Moved randomization code into pick_from_range(). - * - * - Changed parse_header_time definition. - * time_t isn't guaranteed to be signed and - * if it isn't, -1 isn't available as error code. - * Changed some variable types in client_if_modified_since() - * because of the same reason. - * - * Revision 1.63 2006/08/14 13:18:08 david__schmidt - * OS/2 compilation compatibility fixups - * - * Revision 1.62 2006/08/14 08:58:42 fabiankeil - * Changed include from strptime.c to strptime.h - * - * Revision 1.61 2006/08/14 08:25:19 fabiankeil - * Split filter-headers{} into filter-client-headers{} - * and filter-server-headers{}. - * Added parse_header_time() to share some code. - * Replaced timegm() with mktime(). - * - * Revision 1.60 2006/08/12 03:54:37 david__schmidt - * Windows service integration - * - * Revision 1.59 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work:http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.58 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.56.2.10 2006/01/21 16:16:08 david__schmidt - * Thanks to Edward Carrel for his patch to modernize OSX'spthreads support. See bug #1409623. - * - * Revision 1.56.2.9 2004/10/03 12:53:45 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.56.2.8 2003/07/11 13:21:25 oes - * Excluded text/plain objects from filtering. This fixes a - * couple of client-crashing, download corruption and - * Privoxy performance issues, whose root cause lies in - * web servers labelling content of unknown type as text/plain. - * - * Revision 1.56.2.7 2003/05/06 12:07:26 oes - * Fixed bug #729900: Suspicious HOST: headers are now killed and regenerated if necessary - * - * Revision 1.56.2.6 2003/04/14 21:28:30 oes - * Completing the previous change - * - * Revision 1.56.2.5 2003/04/14 12:08:16 oes - * Added temporary workaround for bug in PHP < 4.2.3 - * - * Revision 1.56.2.4 2003/03/07 03:41:05 david__schmidt - * Wrapping all *_r functions (the non-_r versions of them) with mutex semaphores for OSX. Hopefully this will take care of all of those pesky crash reports. - * - * Revision 1.56.2.3 2002/11/10 04:20:02 hal9 - * Fix typo: supressed -> suppressed - * - * Revision 1.56.2.2 2002/09/25 14:59:53 oes - * Improved cookie logging - * - * Revision 1.56.2.1 2002/09/25 14:52:45 oes - * Added basic support for OPTIONS and TRACE HTTP methods: - * - New parser function client_max_forwards which decrements - * the Max-Forwards HTTP header field of OPTIONS and TRACE - * requests by one before forwarding - * - New parser function client_host which extracts the host - * and port information from the HTTP header field if the - * request URI was not absolute - * - Don't crumble and re-add the Host: header, but only generate - * and append if missing - * - * Revision 1.56 2002/05/12 15:34:22 jongfoster - * Fixing typo in a comment - * - * Revision 1.55 2002/05/08 16:01:07 oes - * Optimized add_to_iob: - * - Use realloc instead of malloc(), memcpy(), free() - * - Expand to powers of two if possible, to get - * O(log n) reallocs instead of O(n). - * - Moved check for buffer limit here from chat - * - Report failure via returncode - * - * Revision 1.54 2002/04/02 15:03:16 oes - * Tiny code cosmetics - * - * Revision 1.53 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - Removed logentry from cancelled commit - * - * Revision 1.15 2001/06/03 19:12:38 oes - * deleted const struct interceptors - * - * Revision 1.14 2001/06/01 18:49:17 jongfoster - * Replaced "list_share" with "list" - the tiny memory gain was not - * worth the extra complexity. - * - * Revision 1.13 2001/05/31 21:30:33 jongfoster - * Removed list code - it's now in list.[ch] - * Renamed "permission" to "action", and changed many features - * to use the actions file rather than the global config. - * - * Revision 1.12 2001/05/31 17:33:13 oes - * - * CRLF -> LF - * - * Revision 1.11 2001/05/29 20:11:19 joergs - * '/ * inside comment' warning removed. - * - * Revision 1.10 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.9 2001/05/28 17:26:33 jongfoster - * Fixing segfault if last header was crunched. - * Fixing Windows build (snprintf() is _snprintf() under Win32, but we - * can use the cross-platform sprintf() instead.) - * - * Revision 1.8 2001/05/27 22:17:04 oes - * - * - re_process_buffer no longer writes the modified buffer - * to the client, which was very ugly. It now returns the - * buffer, which it is then written by chat. - * - * - content_length now adjusts the Content-Length: header - * for modified documents rather than crunch()ing it. - * (Length info in csp->content_length, which is 0 for - * unmodified documents) - * - * - For this to work, sed() is called twice when filtering. - * - * Revision 1.7 2001/05/27 13:19:06 oes - * Patched Joergs solution for the content-length in. - * - * Revision 1.6 2001/05/26 13:39:32 jongfoster - * Only crunches Content-Length header if applying RE filtering. - * Without this fix, Microsoft Windows Update wouldn't work. - * - * 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 - * 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.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:02:36 oes - * - Made referrer option accept 'L' as a substitute for '§' - * - * Revision 1.1.1.1 2001/05/15 13:59:01 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#ifndef _WIN32 -#include <stdio.h> -#include <sys/types.h> -#endif - -#include <stdlib.h> -#include <ctype.h> -#include <assert.h> -#include <string.h> - -#ifdef __GLIBC__ -/* - * Convince GNU's libc to provide a strptime prototype. - */ -#define __USE_XOPEN -#endif /*__GLIBC__ */ -#include <time.h> - -#ifdef FEATURE_ZLIB -#include <zlib.h> -#endif - -#if !defined(_WIN32) && !defined(__OS2__) -#include <unistd.h> -#endif - -#include "project.h" - -#ifdef FEATURE_PTHREAD -#include "jcc.h" -/* jcc.h is for mutex semapores only */ -#endif /* def FEATURE_PTHREAD */ -#include "list.h" -#include "parsers.h" -#include "ssplit.h" -#include "errlog.h" -#include "jbsockets.h" -#include "miscutil.h" -#include "list.h" -#include "actions.h" -#include "filters.h" - -#ifndef HAVE_STRPTIME -#include "strptime.h" -#endif - -const char parsers_h_rcs[] = PARSERS_H_VERSION; - -/* Fix a problem with Solaris. There should be no effect on other - * platforms. - * Solaris's isspace() is a macro which uses its 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)) - -static char *get_header_line(struct iob *iob); -static jb_err scan_headers(struct client_state *csp); -static jb_err header_tagger(struct client_state *csp, char *header); -static jb_err parse_header_time(const char *header_time, time_t *result); - -static jb_err crumble (struct client_state *csp, char **header); -static jb_err filter_header (struct client_state *csp, char **header); -static jb_err client_connection (struct client_state *csp, char **header); -static jb_err client_referrer (struct client_state *csp, char **header); -static jb_err client_uagent (struct client_state *csp, char **header); -static jb_err client_ua (struct client_state *csp, char **header); -static jb_err client_from (struct client_state *csp, char **header); -static jb_err client_send_cookie (struct client_state *csp, char **header); -static jb_err client_x_forwarded (struct client_state *csp, char **header); -static jb_err client_accept_encoding (struct client_state *csp, char **header); -static jb_err client_te (struct client_state *csp, char **header); -static jb_err client_max_forwards (struct client_state *csp, char **header); -static jb_err client_host (struct client_state *csp, char **header); -static jb_err client_if_modified_since (struct client_state *csp, char **header); -static jb_err client_accept_language (struct client_state *csp, char **header); -static jb_err client_if_none_match (struct client_state *csp, char **header); -static jb_err crunch_client_header (struct client_state *csp, char **header); -static jb_err client_x_filter (struct client_state *csp, char **header); -static jb_err client_range (struct client_state *csp, char **header); -static jb_err server_set_cookie (struct client_state *csp, char **header); -static jb_err server_connection (struct client_state *csp, char **header); -static jb_err server_content_type (struct client_state *csp, char **header); -static jb_err server_adjust_content_length(struct client_state *csp, char **header); -static jb_err server_content_md5 (struct client_state *csp, char **header); -static jb_err server_content_encoding (struct client_state *csp, char **header); -static jb_err server_transfer_coding (struct client_state *csp, char **header); -static jb_err server_http (struct client_state *csp, char **header); -static jb_err crunch_server_header (struct client_state *csp, char **header); -static jb_err server_last_modified (struct client_state *csp, char **header); -static jb_err server_content_disposition(struct client_state *csp, char **header); - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE -static jb_err server_save_content_length(struct client_state *csp, char **header); -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - -static jb_err client_host_adder (struct client_state *csp); -static jb_err client_xtra_adder (struct client_state *csp); -static jb_err client_x_forwarded_for_adder(struct client_state *csp); -static jb_err client_connection_header_adder(struct client_state *csp); -static jb_err server_connection_close_adder(struct client_state *csp); - -static jb_err create_forged_referrer(char **header, const char *hostport); -static jb_err create_fake_referrer(char **header, const char *fake_referrer); -static jb_err handle_conditional_hide_referrer_parameter(char **header, - const char *host, const int parameter_conditional_block); -static const char *get_appropiate_connection_header(const struct client_state *csp); - -/* - * List of functions to run on a list of headers. - */ -struct parsers -{ - /** The header prefix to match */ - const char *str; - - /** The length of the prefix to match */ - const size_t len; - - /** The function to apply to this line */ - const parser_func_ptr parser; -}; - -static const struct parsers client_patterns[] = { - { "referer:", 8, client_referrer }, - { "user-agent:", 11, client_uagent }, - { "ua-", 3, client_ua }, - { "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, client_host }, - { "if-modified-since:", 18, client_if_modified_since }, - { "Keep-Alive:", 11, crumble }, - { "connection:", 11, client_connection }, - { "proxy-connection:", 17, crumble }, - { "max-forwards:", 13, client_max_forwards }, - { "Accept-Language:", 16, client_accept_language }, - { "if-none-match:", 14, client_if_none_match }, - { "Range:", 6, client_range }, - { "Request-Range:", 14, client_range }, - { "If-Range:", 9, client_range }, - { "X-Filter:", 9, client_x_filter }, - { "*", 0, crunch_client_header }, - { "*", 0, filter_header }, - { NULL, 0, NULL } -}; - -static const struct parsers server_patterns[] = { - { "HTTP/", 5, server_http }, - { "set-cookie:", 11, server_set_cookie }, - { "connection:", 11, server_connection }, - { "Content-Type:", 13, server_content_type }, - { "Content-MD5:", 12, server_content_md5 }, - { "Content-Encoding:", 17, server_content_encoding }, -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - { "Content-Length:", 15, server_save_content_length }, -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - { "Transfer-Encoding:", 18, server_transfer_coding }, - { "Keep-Alive:", 11, crumble }, - { "content-disposition:", 20, server_content_disposition }, - { "Last-Modified:", 14, server_last_modified }, - { "*", 0, crunch_server_header }, - { "*", 0, filter_header }, - { NULL, 0, NULL } -}; - -static const add_header_func_ptr add_client_headers[] = { - client_host_adder, - client_x_forwarded_for_adder, - client_xtra_adder, - /* Temporarily disabled: client_accept_encoding_adder, */ - client_connection_header_adder, - NULL -}; - -static const add_header_func_ptr add_server_headers[] = { - server_connection_close_adder, - NULL -}; - -/********************************************************************* - * - * Function : flush_socket - * - * Description : Write any pending "buffered" content. - * - * Parameters : - * 1 : fd = file descriptor of the socket to read - * 2 : iob = The I/O buffer to flush, usually csp->iob. - * - * Returns : On success, the number of bytes written are returned (zero - * indicates nothing was written). On error, -1 is returned, - * and errno is set appropriately. If count is zero and the - * file descriptor refers to a regular file, 0 will be - * returned without causing any other effect. For a special - * file, the results are not portable. - * - *********************************************************************/ -long flush_socket(jb_socket fd, struct iob *iob) -{ - long len = iob->eod - iob->cur; - - if (len <= 0) - { - return(0); - } - - if (write_socket(fd, iob->cur, (size_t)len)) - { - return(-1); - } - iob->eod = iob->cur = iob->buf; - return(len); - -} - - -/********************************************************************* - * - * Function : add_to_iob - * - * Description : Add content to the buffered page, expanding the - * buffer if necessary. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : buf = holds the content to be added to the page - * 3 : n = number of bytes to be added - * - * Returns : JB_ERR_OK on success, JB_ERR_MEMORY if out-of-memory - * or buffer limit reached. - * - *********************************************************************/ -jb_err add_to_iob(struct client_state *csp, char *buf, long n) -{ - struct iob *iob = csp->iob; - size_t used, offset, need, want; - char *p; - - if (n <= 0) return JB_ERR_OK; - - used = (size_t)(iob->eod - iob->buf); - offset = (size_t)(iob->cur - iob->buf); - need = used + (size_t)n + 1; - - /* - * If the buffer can't hold the new data, extend it first. - * Use the next power of two if possible, else use the actual need. - */ - if (need > csp->config->buffer_limit) - { - log_error(LOG_LEVEL_INFO, - "Buffer limit reached while extending the buffer (iob). Needed: %d. Limit: %d", - need, csp->config->buffer_limit); - return JB_ERR_MEMORY; - } - - if (need > iob->size) - { - for (want = csp->iob->size ? csp->iob->size : 512; want <= need;) want *= 2; - - if (want <= csp->config->buffer_limit && NULL != (p = (char *)realloc(iob->buf, want))) - { - iob->size = want; - } - else if (NULL != (p = (char *)realloc(iob->buf, need))) - { - iob->size = need; - } - else - { - log_error(LOG_LEVEL_ERROR, "Extending the buffer (iob) failed: %E"); - return JB_ERR_MEMORY; - } - - /* Update the iob pointers */ - iob->cur = p + offset; - iob->eod = p + used; - iob->buf = p; - } - - /* copy the new data into the iob buffer */ - memcpy(iob->eod, buf, (size_t)n); - - /* point to the end of the data */ - iob->eod += n; - - /* null terminate == cheap insurance */ - *iob->eod = '\0'; - - return JB_ERR_OK; - -} - - -#ifdef FEATURE_ZLIB -/********************************************************************* - * - * Function : decompress_iob - * - * Description : Decompress buffered page, expanding the - * buffer as necessary. csp->iob->cur - * should point to the the beginning of the - * compressed data block. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, - * JB_ERR_MEMORY if out-of-memory limit reached, and - * JB_ERR_COMPRESS if error decompressing buffer. - * - *********************************************************************/ -jb_err decompress_iob(struct client_state *csp) -{ - char *buf; /* new, uncompressed buffer */ - char *cur; /* Current iob position (to keep the original - * iob->cur unmodified if we return early) */ - size_t bufsize; /* allocated size of the new buffer */ - size_t old_size; /* Content size before decompression */ - size_t skip_size; /* Number of bytes at the beginning of the iob - that we should NOT decompress. */ - int status; /* return status of the inflate() call */ - z_stream zstr; /* used by calls to zlib */ - - assert(csp->iob->cur - csp->iob->buf > 0); - assert(csp->iob->eod - csp->iob->cur > 0); - - bufsize = csp->iob->size; - skip_size = (size_t)(csp->iob->cur - csp->iob->buf); - old_size = (size_t)(csp->iob->eod - csp->iob->cur); - - cur = csp->iob->cur; - - if (bufsize < (size_t)10) - { - /* - * This is to protect the parsing of gzipped data, - * but it should(?) be valid for deflated data also. - */ - log_error(LOG_LEVEL_ERROR, "Buffer too small decompressing iob"); - return JB_ERR_COMPRESS; - } - - if (csp->content_type & CT_GZIP) - { - /* - * Our task is slightly complicated by the facts that data - * compressed by gzip does not include a zlib header, and - * that there is no easily accessible interface in zlib to - * handle a gzip header. We strip off the gzip header by - * hand, and later inform zlib not to expect a header. - */ - - /* - * Strip off the gzip header. Please see RFC 1952 for more - * explanation of the appropriate fields. - */ - if ((*cur++ != (char)0x1f) - || (*cur++ != (char)0x8b) - || (*cur++ != Z_DEFLATED)) - { - log_error(LOG_LEVEL_ERROR, "Invalid gzip header when decompressing"); - return JB_ERR_COMPRESS; - } - else - { - int flags = *cur++; - /* - * XXX: These magic numbers should be replaced - * with macros to give a better idea what they do. - */ - if (flags & 0xe0) - { - /* The gzip header has reserved bits set; bail out. */ - log_error(LOG_LEVEL_ERROR, "Invalid gzip header flags when decompressing"); - return JB_ERR_COMPRESS; - } - cur += 6; - - /* Skip extra fields if necessary. */ - if (flags & 0x04) - { - /* - * Skip a given number of bytes, specified - * as a 16-bit little-endian value. - */ - /* - * XXX: This code used to be: - * - * csp->iob->cur += *csp->iob->cur++ + (*csp->iob->cur++ << 8); - * - * which I had to change into: - * - * cur += *cur++ + (*cur++ << 8); - * - * at which point gcc43 finally noticed that the value - * of cur is undefined (it depends on which of the - * summands is evaluated first). - * - * I haven't come across a site where this - * code is actually executed yet, but I hope - * it works anyway. - */ - int skip_bytes; - skip_bytes = *cur++; - skip_bytes = *cur++ << 8; - - assert(skip_bytes == *csp->iob->cur - 2 + ((*csp->iob->cur - 1) << 8)); - - /* - * The number of bytes to skip should be positive - * and we'd like to stay in the buffer. - */ - if ((skip_bytes < 0) || (skip_bytes >= (csp->iob->eod - cur))) - { - log_error(LOG_LEVEL_ERROR, - "Unreasonable amount of bytes to skip (%d). Stopping decompression", - skip_bytes); - return JB_ERR_COMPRESS; - } - log_error(LOG_LEVEL_INFO, - "Skipping %d bytes for gzip compression. Does this sound right?", - skip_bytes); - cur += skip_bytes; - } - - /* Skip the filename if necessary. */ - if (flags & 0x08) - { - /* A null-terminated string is supposed to follow. */ - while (*cur++ && (cur < csp->iob->eod)); - - } - - /* Skip the comment if necessary. */ - if (flags & 0x10) - { - /* A null-terminated string is supposed to follow. */ - while (*cur++ && (cur < csp->iob->eod)); - } - - /* Skip the CRC if necessary. */ - if (flags & 0x02) - { - cur += 2; - } - - if (cur >= csp->iob->eod) - { - /* - * If the current position pointer reached or passed - * the buffer end, we were obviously tricked to skip - * too much. - */ - log_error(LOG_LEVEL_ERROR, - "Malformed gzip header detected. Aborting decompression."); - return JB_ERR_COMPRESS; - } - } - } - else if (csp->content_type & CT_DEFLATE) - { - /* - * XXX: The debug level should be lowered - * before the next stable release. - */ - log_error(LOG_LEVEL_INFO, "Decompressing deflated iob: %d", *cur); - /* - * In theory (that is, according to RFC 1950), deflate-compressed - * data should begin with a two-byte zlib header and have an - * adler32 checksum at the end. It seems that in practice only - * the raw compressed data is sent. Note that this means that - * we are not RFC 1950-compliant here, but the advantage is that - * this actually works. :) - * - * We add a dummy null byte to tell zlib where the data ends, - * and later inform it not to expect a header. - * - * Fortunately, add_to_iob() has thoughtfully null-terminated - * the buffer; we can just increment the end pointer to include - * the dummy byte. - */ - csp->iob->eod++; - } - else - { - log_error(LOG_LEVEL_ERROR, - "Unable to determine compression format for decompression"); - return JB_ERR_COMPRESS; - } - - /* Set up the fields required by zlib. */ - zstr.next_in = (Bytef *)cur; - zstr.avail_in = (unsigned int)(csp->iob->eod - cur); - zstr.zalloc = Z_NULL; - zstr.zfree = Z_NULL; - zstr.opaque = Z_NULL; - - /* - * Passing -MAX_WBITS to inflateInit2 tells the library - * that there is no zlib header. - */ - if (inflateInit2 (&zstr, -MAX_WBITS) != Z_OK) - { - log_error(LOG_LEVEL_ERROR, "Error initializing decompression"); - return JB_ERR_COMPRESS; - } - - /* - * Next, we allocate new storage for the inflated data. - * We don't modify the existing iob yet, so in case there - * is error in decompression we can recover gracefully. - */ - buf = zalloc(bufsize); - if (NULL == buf) - { - log_error(LOG_LEVEL_ERROR, "Out of memory decompressing iob"); - return JB_ERR_MEMORY; - } - - assert(bufsize >= skip_size); - memcpy(buf, csp->iob->buf, skip_size); - zstr.avail_out = bufsize - skip_size; - zstr.next_out = (Bytef *)buf + skip_size; - - /* Try to decompress the whole stream in one shot. */ - while (Z_BUF_ERROR == (status = inflate(&zstr, Z_FINISH))) - { - /* We need to allocate more memory for the output buffer. */ - - char *tmpbuf; /* used for realloc'ing the buffer */ - size_t oldbufsize = bufsize; /* keep track of the old bufsize */ - - /* - * If zlib wants more data then there's a problem, because - * the complete compressed file should have been buffered. - */ - if (0 == zstr.avail_in) - { - log_error(LOG_LEVEL_ERROR, "Unexpected end of compressed iob"); - return JB_ERR_COMPRESS; - } - - /* - * If we tried the limit and still didn't have enough - * memory, just give up. - */ - if (bufsize == csp->config->buffer_limit) - { - log_error(LOG_LEVEL_ERROR, "Buffer limit reached while decompressing iob"); - return JB_ERR_MEMORY; - } - - /* Try doubling the buffer size each time. */ - bufsize *= 2; - - /* Don't exceed the buffer limit. */ - if (bufsize > csp->config->buffer_limit) - { - bufsize = csp->config->buffer_limit; - } - - /* Try to allocate the new buffer. */ - tmpbuf = realloc(buf, bufsize); - if (NULL == tmpbuf) - { - log_error(LOG_LEVEL_ERROR, "Out of memory decompressing iob"); - freez(buf); - return JB_ERR_MEMORY; - } - else - { - char *oldnext_out = (char *)zstr.next_out; - - /* - * Update the fields for inflate() to use the new - * buffer, which may be in a location different from - * the old one. - */ - zstr.avail_out += bufsize - oldbufsize; - zstr.next_out = (Bytef *)tmpbuf + bufsize - zstr.avail_out; - - /* - * Compare with an uglier method of calculating these values - * that doesn't require the extra oldbufsize variable. - */ - assert(zstr.avail_out == tmpbuf + bufsize - (char *)zstr.next_out); - assert((char *)zstr.next_out == tmpbuf + ((char *)oldnext_out - buf)); - assert(zstr.avail_out > 0U); - - buf = tmpbuf; - } - } - - if (Z_STREAM_ERROR == inflateEnd(&zstr)) - { - log_error(LOG_LEVEL_ERROR, - "Inconsistent stream state after decompression: %s", zstr.msg); - /* - * XXX: Intentionally no return. - * - * According to zlib.h, Z_STREAM_ERROR is returned - * "if the stream state was inconsistent". - * - * I assume in this case inflate()'s status - * would also be something different than Z_STREAM_END - * so this check should be redundant, but lets see. - */ - } - - if (status != Z_STREAM_END) - { - /* We failed to decompress the stream. */ - log_error(LOG_LEVEL_ERROR, - "Error in decompressing to the buffer (iob): %s", zstr.msg); - return JB_ERR_COMPRESS; - } - - /* - * Finally, we can actually update the iob, since the - * decompression was successful. First, free the old - * buffer. - */ - freez(csp->iob->buf); - - /* Now, update the iob to use the new buffer. */ - csp->iob->buf = buf; - csp->iob->cur = csp->iob->buf + skip_size; - csp->iob->eod = (char *)zstr.next_out; - csp->iob->size = bufsize; - - /* - * Make sure the new uncompressed iob obeys some minimal - * consistency conditions. - */ - if ((csp->iob->buf < csp->iob->cur) - && (csp->iob->cur <= csp->iob->eod) - && (csp->iob->eod <= csp->iob->buf + csp->iob->size)) - { - const size_t new_size = (size_t)(csp->iob->eod - csp->iob->cur); - if (new_size > (size_t)0) - { - log_error(LOG_LEVEL_RE_FILTER, - "Decompression successful. Old size: %d, new size: %d.", - old_size, new_size); - } - else - { - /* zlib thinks this is OK, so lets do the same. */ - log_error(LOG_LEVEL_INFO, "Decompression didn't result in any content."); - } - } - else - { - /* It seems that zlib did something weird. */ - log_error(LOG_LEVEL_ERROR, - "Unexpected error decompressing the buffer (iob): %d==%d, %d>%d, %d<%d", - csp->iob->cur, csp->iob->buf + skip_size, csp->iob->eod, csp->iob->buf, - csp->iob->eod, csp->iob->buf + csp->iob->size); - return JB_ERR_COMPRESS; - } - - return JB_ERR_OK; - -} -#endif /* defined(FEATURE_ZLIB) */ - - -/********************************************************************* - * - * Function : string_move - * - * Description : memmove wrapper to move the last part of a string - * towards the beginning, overwriting the part in - * the middle. strlcpy() can't be used here as the - * strings overlap. - * - * Parameters : - * 1 : dst = Destination to overwrite - * 2 : src = Source to move. - * - * Returns : N/A - * - *********************************************************************/ -static void string_move(char *dst, char *src) -{ - assert(dst < src); - - /* +1 to copy the terminating nul as well. */ - memmove(dst, src, strlen(src)+1); -} - - -/********************************************************************* - * - * Function : normalize_lws - * - * Description : Reduces unquoted linear white space in headers - * to a single space in accordance with RFC 2616 2.2. - * This simplifies parsing and filtering later on. - * - * XXX: Remove log messages before - * the next stable release? - * - * Parameters : - * 1 : header = A header with linear white space to reduce. - * - * Returns : N/A - * - *********************************************************************/ -static void normalize_lws(char *header) -{ - char *p = header; - - while (*p != '\0') - { - if (ijb_isspace(*p) && ijb_isspace(*(p+1))) - { - char *q = p+1; - - while (ijb_isspace(*q)) - { - q++; - } - log_error(LOG_LEVEL_HEADER, "Reducing white space in '%s'", header); - string_move(p+1, q); - } - - if (*p == '\t') - { - log_error(LOG_LEVEL_HEADER, - "Converting tab to space in '%s'", header); - *p = ' '; - } - else if (*p == '"') - { - char *end_of_token = strstr(p+1, """); - - if (NULL != end_of_token) - { - /* Don't mess with quoted text. */ - p = end_of_token; - } - else - { - log_error(LOG_LEVEL_HEADER, - "Ignoring single quote in '%s'", header); - } - } - p++; - } - - p = strchr(header, ':'); - if ((p != NULL) && (p != header) && ijb_isspace(*(p-1))) - { - /* - * There's still space before the colon. - * We don't want it. - */ - string_move(p-1, p); - } -} - - -/********************************************************************* - * - * Function : get_header - * - * Description : This (odd) routine will parse the csp->iob - * to get the next complete header. - * - * Parameters : - * 1 : iob = The I/O buffer to parse, usually csp->iob. - * - * Returns : Any one of the following: - * - * 1) a pointer to a dynamically allocated string that contains a header line - * 2) NULL indicating that the end of the header was reached - * 3) "" indicating that the end of the iob was reached before finding - * a complete header line. - * - *********************************************************************/ -char *get_header(struct iob *iob) -{ - char *header; - - header = get_header_line(iob); - - if ((header == NULL) || (*header == '\0')) - { - /* - * No complete header read yet, tell the client. - */ - return header; - } - - while ((iob->cur[0] == ' ') || (iob->cur[0] == '\t')) - { - /* - * Header spans multiple lines, append the next one. - */ - char *continued_header; - - continued_header = get_header_line(iob); - if ((continued_header == NULL) || (*continued_header == '\0')) - { - /* - * No complete header read yet, return what we got. - * XXX: Should "unread" header instead. - */ - log_error(LOG_LEVEL_INFO, - "Failed to read a multi-line header properly: '%s'", - header); - break; - } - - if (JB_ERR_OK != string_join(&header, continued_header)) - { - log_error(LOG_LEVEL_FATAL, - "Out of memory while appending multiple headers."); - } - else - { - /* XXX: remove before next stable release. */ - log_error(LOG_LEVEL_HEADER, - "Merged multiple header lines to: '%s'", - header); - } - } - - normalize_lws(header); - - return header; - -} - - -/********************************************************************* - * - * Function : get_header_line - * - * Description : This (odd) routine will parse the csp->iob - * to get the next header line. - * - * Parameters : - * 1 : iob = The I/O buffer to parse, usually csp->iob. - * - * Returns : Any one of the following: - * - * 1) a pointer to a dynamically allocated string that contains a header line - * 2) NULL indicating that the end of the header was reached - * 3) "" indicating that the end of the iob was reached before finding - * a complete header line. - * - *********************************************************************/ -static char *get_header_line(struct iob *iob) -{ - char *p, *q, *ret; - - if ((iob->cur == NULL) - || ((p = strchr(iob->cur, '\n')) == NULL)) - { - return(""); /* couldn't find a complete header */ - } - - *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_line()"); - } - assert(ret != NULL); - - iob->cur = p+1; - - if ((q = strchr(ret, '\r')) != NULL) *q = '\0'; - - /* is this a blank line (i.e. the end of the header) ? */ - if (*ret == '\0') - { - freez(ret); - return NULL; - } - - return ret; - -} - - -/********************************************************************* - * - * 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 = cur_entry->str + length; - while (*ret && ijb_isspace(*ret)) ret++; - return ret; - } - } - } - - /* - * Not found - */ - return NULL; - -} - - -/********************************************************************* - * - * Function : scan_headers - * - * Description : Scans headers, applies tags and updates action bits. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK - * - *********************************************************************/ -static jb_err scan_headers(struct client_state *csp) -{ - struct list_entry *h; /* Header */ - jb_err err = JB_ERR_OK; - - for (h = csp->headers->first; (err == JB_ERR_OK) && (h != NULL) ; h = h->next) - { - /* Header crunch()ed in previous run? -> ignore */ - if (h->str == NULL) continue; - log_error(LOG_LEVEL_HEADER, "scan: %s", h->str); - err = header_tagger(csp, h->str); - } - - return err; -} - - -/********************************************************************* - * - * Function : sed - * - * Description : add, delete or modify lines in the HTTP header streams. - * On entry, it receives a linked list of headers space - * that was allocated dynamically (both the list nodes - * and the header contents). - * - * As a side effect it frees the space used by the original - * header lines. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : filter_server_headers = Boolean to switch between - * server and header filtering. - * - * Returns : JB_ERR_OK in case off success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err sed(struct client_state *csp, int filter_server_headers) -{ - /* XXX: use more descriptive names. */ - struct list_entry *p; - const struct parsers *v; - const add_header_func_ptr *f; - jb_err err = JB_ERR_OK; - - if (filter_server_headers) - { - v = server_patterns; - f = add_server_headers; - } - else - { - v = client_patterns; - f = add_client_headers; - } - - scan_headers(csp); - - while ((err == JB_ERR_OK) && (v->str != NULL)) - { - for (p = csp->headers->first; (err == JB_ERR_OK) && (p != NULL); p = p->next) - { - /* Header crunch()ed in previous run? -> ignore */ - if (p->str == NULL) continue; - - /* Does the current parser handle this header? */ - if ((strncmpic(p->str, v->str, v->len) == 0) || - (v->len == CHECK_EVERY_HEADER_REMAINING)) - { - err = v->parser(csp, &(p->str)); - } - } - v++; - } - - /* place additional headers on the csp->headers list */ - while ((err == JB_ERR_OK) && (*f)) - { - err = (*f)(csp); - f++; - } - - return err; -} - - -/********************************************************************* - * - * Function : update_server_headers - * - * Description : Updates server headers after the body has been modified. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK in case off success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err update_server_headers(struct client_state *csp) -{ - jb_err err = JB_ERR_OK; - - static const struct parsers server_patterns_light[] = { - { "Content-Length:", 15, server_adjust_content_length }, - { "Transfer-Encoding:", 18, server_transfer_coding }, -#ifdef FEATURE_ZLIB - { "Content-Encoding:", 17, server_content_encoding }, -#endif /* def FEATURE_ZLIB */ - { NULL, 0, NULL } - }; - - if (strncmpic(csp->http->cmd, "HEAD", 4)) - { - const struct parsers *v; - struct list_entry *p; - - for (v = server_patterns_light; (err == JB_ERR_OK) && (v->str != NULL); v++) - { - for (p = csp->headers->first; (err == JB_ERR_OK) && (p != NULL); p = p->next) - { - /* Header crunch()ed in previous run? -> ignore */ - if (p->str == NULL) continue; - - /* Does the current parser handle this header? */ - if (strncmpic(p->str, v->str, v->len) == 0) - { - err = v->parser(csp, (char **)&(p->str)); - } - } - } - } - - return err; -} - - -/********************************************************************* - * - * Function : header_tagger - * - * Description : Executes all text substitutions from applying - * tag actions and saves the result as tag. - * - * XXX: Shares enough code with filter_header() and - * pcrs_filter_response() to warrant some helper functions. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = Header that is used as tagger input - * - * Returns : JB_ERR_OK on success and always succeeds - * - *********************************************************************/ -static jb_err header_tagger(struct client_state *csp, char *header) -{ - int wanted_filter_type; - int multi_action_index; - int i; - pcrs_job *job; - - struct file_list *fl; - struct re_filterfile_spec *b; - struct list_entry *tag_name; - - int found_filters = 0; - const size_t header_length = strlen(header); - - if (csp->flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE) - { - wanted_filter_type = FT_SERVER_HEADER_TAGGER; - multi_action_index = ACTION_MULTI_SERVER_HEADER_TAGGER; - } - else - { - wanted_filter_type = FT_CLIENT_HEADER_TAGGER; - multi_action_index = ACTION_MULTI_CLIENT_HEADER_TAGGER; - } - - /* Check if there are any filters */ - for (i = 0; i < MAX_AF_FILES; i++) - { - fl = csp->rlist[i]; - if (NULL != fl) - { - if (NULL != fl->f) - { - found_filters = 1; - break; - } - } - } - - if (0 == found_filters) - { - log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: " - "tagging enabled, but no taggers available."); - return JB_ERR_OK; - } - - for (i = 0; i < MAX_AF_FILES; i++) - { - fl = csp->rlist[i]; - if ((NULL == fl) || (NULL == fl->f)) - { - /* - * Either there are no filter files - * left, or this filter file just - * contains no valid filters. - * - * Continue to be sure we don't miss - * valid filter files that are chained - * after empty or invalid ones. - */ - continue; - } - - /* For all filters, */ - for (b = fl->f; b; b = b->next) - { - if (b->type != wanted_filter_type) - { - /* skip the ones we don't care about, */ - continue; - } - /* leaving only taggers that could apply, of which we use the ones, */ - for (tag_name = csp->action->multi[multi_action_index]->first; - NULL != tag_name; tag_name = tag_name->next) - { - /* that do apply, and */ - if (strcmp(b->name, tag_name->str) == 0) - { - char *modified_tag = NULL; - char *tag = header; - size_t size = header_length; - pcrs_job *joblist = b->joblist; - - if (b->dynamic) joblist = compile_dynamic_pcrs_job_list(csp, b); - - if (NULL == joblist) - { - log_error(LOG_LEVEL_RE_FILTER, - "Tagger %s has empty joblist. Nothing to do.", b->name); - continue; - } - - /* execute their pcrs_joblist on the header. */ - for (job = joblist; NULL != job; job = job->next) - { - const int hits = pcrs_execute(job, tag, size, &modified_tag, &size); - - if (0 < hits) - { - /* Success, continue with the modified version. */ - if (tag != header) - { - freez(tag); - } - tag = modified_tag; - } - else - { - /* Tagger doesn't match */ - if (0 > hits) - { - /* Regex failure, log it but continue anyway. */ - assert(NULL != header); - log_error(LOG_LEVEL_ERROR, - "Problems with tagger '%s' and header '%s': %s", - b->name, *header, pcrs_strerror(hits)); - } - freez(modified_tag); - } - } - - if (b->dynamic) pcrs_free_joblist(joblist); - - /* If this tagger matched */ - if (tag != header) - { - if (0 == size) - { - /* - * There is to technical limitation which makes - * it impossible to use empty tags, but I assume - * no one would do it intentionally. - */ - freez(tag); - log_error(LOG_LEVEL_INFO, - "Tagger '%s' created an empty tag. Ignored.", - b->name); - continue; - } - - if (!list_contains_item(csp->tags, tag)) - { - if (JB_ERR_OK != enlist(csp->tags, tag)) - { - log_error(LOG_LEVEL_ERROR, - "Insufficient memory to add tag '%s', " - "based on tagger '%s' and header '%s'", - tag, b->name, *header); - } - else - { - char *action_message; - /* - * update the action bits right away, to make - * tagging based on tags set by earlier taggers - * of the same kind possible. - */ - if (update_action_bits_for_tag(csp, tag)) - { - action_message = "Action bits updated accordingly."; - } - else - { - action_message = "No action bits update necessary."; - } - - log_error(LOG_LEVEL_HEADER, - "Tagger '%s' added tag '%s'. %s", - b->name, tag, action_message); - } - } - else - { - /* XXX: Is this log-worthy? */ - log_error(LOG_LEVEL_HEADER, - "Tagger '%s' didn't add tag '%s'. " - "Tag already present", b->name, tag); - } - freez(tag); - } /* if the tagger matched */ - } /* if the tagger applies */ - } /* for every tagger that could apply */ - } /* for all filters */ - } /* for all filter files */ - - return JB_ERR_OK; -} - -/* here begins the family of parser functions that reformat header lines */ - -/********************************************************************* - * - * Function : filter_header - * - * Description : Executes all text substitutions from all applying - * +(server|client)-header-filter actions on the header. - * Most of the code was copied from pcrs_filter_response, - * including the rather short variable names - * - * 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 and always succeeds - * - *********************************************************************/ -static jb_err filter_header(struct client_state *csp, char **header) -{ - int hits=0; - int matches; - size_t size = strlen(*header); - - char *newheader = NULL; - pcrs_job *job; - - struct file_list *fl; - struct re_filterfile_spec *b; - struct list_entry *filtername; - - int i, found_filters = 0; - int wanted_filter_type; - int multi_action_index; - - if (csp->flags & CSP_FLAG_NO_FILTERING) - { - return JB_ERR_OK; - } - - if (csp->flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE) - { - wanted_filter_type = FT_SERVER_HEADER_FILTER; - multi_action_index = ACTION_MULTI_SERVER_HEADER_FILTER; - } - else - { - wanted_filter_type = FT_CLIENT_HEADER_FILTER; - multi_action_index = ACTION_MULTI_CLIENT_HEADER_FILTER; - } - - /* - * Need to check the set of re_filterfiles... - */ - for (i = 0; i < MAX_AF_FILES; i++) - { - fl = csp->rlist[i]; - if (NULL != fl) - { - if (NULL != fl->f) - { - found_filters = 1; - break; - } - } - } - - if (0 == found_filters) - { - log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: " - "header filtering enabled, but no matching filters available."); - return JB_ERR_OK; - } - - for (i = 0; i < MAX_AF_FILES; i++) - { - fl = csp->rlist[i]; - if ((NULL == fl) || (NULL == fl->f)) - { - /* - * Either there are no filter files - * left, or this filter file just - * contains no valid filters. - * - * Continue to be sure we don't miss - * valid filter files that are chained - * after empty or invalid ones. - */ - continue; - } - /* - * For all applying +filter actions, look if a filter by that - * name exists and if yes, execute its pcrs_joblist on the - * buffer. - */ - for (b = fl->f; b; b = b->next) - { - if (b->type != wanted_filter_type) - { - /* Skip other filter types */ - continue; - } - - for (filtername = csp->action->multi[multi_action_index]->first; - filtername ; filtername = filtername->next) - { - if (strcmp(b->name, filtername->str) == 0) - { - int current_hits = 0; - pcrs_job *joblist = b->joblist; - - if (b->dynamic) joblist = compile_dynamic_pcrs_job_list(csp, b); - - if (NULL == joblist) - { - log_error(LOG_LEVEL_RE_FILTER, "Filter %s has empty joblist. Nothing to do.", b->name); - continue; - } - - log_error(LOG_LEVEL_RE_FILTER, "filtering '%s' (size %d) with '%s' ...", - *header, size, b->name); - - /* Apply all jobs from the joblist */ - for (job = joblist; NULL != job; job = job->next) - { - matches = pcrs_execute(job, *header, size, &newheader, &size); - if ( 0 < matches ) - { - current_hits += matches; - log_error(LOG_LEVEL_HEADER, "Transforming "%s" to "%s"", *header, newheader); - freez(*header); - *header = newheader; - } - else if ( 0 == matches ) - { - /* Filter doesn't change header */ - freez(newheader); - } - else - { - /* RegEx failure */ - log_error(LOG_LEVEL_ERROR, "Filtering '%s' with '%s' didn't work out: %s", - *header, b->name, pcrs_strerror(matches)); - if (newheader != NULL) - { - log_error(LOG_LEVEL_ERROR, "Freeing what's left: %s", newheader); - freez(newheader); - } - } - } - - if (b->dynamic) pcrs_free_joblist(joblist); - - log_error(LOG_LEVEL_RE_FILTER, "... produced %d hits (new size %d).", current_hits, size); - hits += current_hits; - } - } - } - } - - /* - * Additionally checking for hits is important because if - * the continue hack is triggered, server headers can - * arrive empty to separate multiple heads from each other. - */ - if ((0 == size) && hits) - { - log_error(LOG_LEVEL_HEADER, "Removing empty header %s", *header); - freez(*header); - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : server_connection - * - * Description : Makes sure that the value of the Connection: header - * is "close" and signals server_connection_close_adder - * to do nothing. - * - * 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. - * - *********************************************************************/ -static jb_err server_connection(struct client_state *csp, char **header) -{ - char *old_header = *header; - - /* Do we have a 'Connection: close' header? */ - if (strcmpic(*header, "Connection: close")) - { -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - if ((csp->config->feature_flags & - RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) - && !strcmpic(*header, "Connection: keep-alive")) - { - /* Remember to keep the connection alive. */ - csp->flags |= CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE; - } -#endif /* FEATURE_CONNECTION_KEEP_ALIVE */ - - *header = strdup("Connection: close"); - if (header == NULL) - { - return JB_ERR_MEMORY; - } - log_error(LOG_LEVEL_HEADER, "Replaced: '%s' with '%s'", old_header, *header); - freez(old_header); - } - - /* Signal server_connection_close_adder() to return early. */ - csp->flags |= CSP_FLAG_SERVER_CONNECTION_CLOSE_SET; - - return JB_ERR_OK; -} - -/********************************************************************* - * - * Function : client_connection - * - * Description : Makes sure a proper "Connection:" header is - * set and signals connection_header_adder - * to do nothing. - * - * 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. - * - *********************************************************************/ -static jb_err client_connection(struct client_state *csp, char **header) -{ - char *old_header = *header; - const char *wanted_header = get_appropiate_connection_header(csp); - - if (strcmpic(*header, wanted_header)) - { - *header = strdup(wanted_header); - if (header == NULL) - { - return JB_ERR_MEMORY; - } - log_error(LOG_LEVEL_HEADER, - "Replaced: '%s' with '%s'", old_header, *header); - freez(old_header); - } - - /* Signal client_connection_close_adder() to return early. */ - csp->flags |= CSP_FLAG_CLIENT_CONNECTION_HEADER_SET; - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : crumble - * - * 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err crumble(struct client_state *csp, char **header) -{ - (void)csp; - log_error(LOG_LEVEL_HEADER, "crumble crunched: %s!", *header); - freez(*header); - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : crunch_server_header - * - * Description : Crunch server header if it matches a string supplied by the - * user. 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. - * - * Returns : JB_ERR_OK on success and always succeeds - * - *********************************************************************/ -static jb_err crunch_server_header(struct client_state *csp, char **header) -{ - const char *crunch_pattern; - - /* Do we feel like crunching? */ - if ((csp->action->flags & ACTION_CRUNCH_SERVER_HEADER)) - { - crunch_pattern = csp->action->string[ACTION_STRING_SERVER_HEADER]; - - /* Is the current header the lucky one? */ - if (strstr(*header, crunch_pattern)) - { - log_error(LOG_LEVEL_HEADER, "Crunching server header: %s (contains: %s)", *header, crunch_pattern); - freez(*header); - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : server_content_type - * - * Description : Set the content-type for filterable types (text/.*, - * .*xml.*, javascript and image/gif) unless filtering has been - * forbidden (CT_TABOO) while parsing earlier headers. - * NOTE: Since text/plain is commonly used by web servers - * for files whose correct type is unknown, we don't - * set CT_TEXT for it. - * - * 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. - * - *********************************************************************/ -static jb_err server_content_type(struct client_state *csp, char **header) -{ - /* Remove header if it isn't the first Content-Type header */ - if ((csp->content_type & CT_DECLARED)) - { - /* - * Another, slightly slower, way to see if - * we already parsed another Content-Type header. - */ - assert(NULL != get_header_value(csp->headers, "Content-Type:")); - - log_error(LOG_LEVEL_ERROR, - "Multiple Content-Type headers. Removing and ignoring: '%s'", - *header); - freez(*header); - - return JB_ERR_OK; - } - - /* - * Signal that the Content-Type has been set. - */ - csp->content_type |= CT_DECLARED; - - if (!(csp->content_type & CT_TABOO)) - { - /* - * XXX: The assumption that text/plain is a sign of - * binary data seems to be somewhat unreasonable nowadays - * and should be dropped after 3.0.8 is out. - */ - if ((strstr(*header, "text/") && !strstr(*header, "plain")) - || strstr(*header, "xml") - || strstr(*header, "application/x-javascript")) - { - csp->content_type |= CT_TEXT; - } - else if (strstr(*header, "image/gif")) - { - csp->content_type |= CT_GIF; - } - } - - /* - * Are we messing with the content type? - */ - if (csp->action->flags & ACTION_CONTENT_TYPE_OVERWRITE) - { - /* - * Make sure the user doesn't accidently - * change the content type of binary documents. - */ - if ((csp->content_type & CT_TEXT) || (csp->action->flags & ACTION_FORCE_TEXT_MODE)) - { - freez(*header); - *header = strdup("Content-Type: "); - string_append(header, csp->action->string[ACTION_STRING_CONTENT_TYPE]); - - if (header == NULL) - { - log_error(LOG_LEVEL_HEADER, "Insufficient memory to replace Content-Type!"); - return JB_ERR_MEMORY; - } - log_error(LOG_LEVEL_HEADER, "Modified: %s!", *header); - } - else - { - log_error(LOG_LEVEL_HEADER, "%s not replaced. " - "It doesn't look like a content type that should be filtered. " - "Enable force-text-mode if you know what you're doing.", *header); - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : server_transfer_coding - * - * Description : - Prohibit filtering (CT_TABOO) if transfer coding compresses - * - Raise the CSP_FLAG_CHUNKED flag if coding is "chunked" - * - Remove header 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. - * - *********************************************************************/ -static 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")) - { -#ifdef FEATURE_ZLIB - /* - * XXX: Added to test if we could use CT_GZIP and CT_DEFLATE here. - */ - log_error(LOG_LEVEL_INFO, "Marking content type for %s as CT_TABOO because of %s.", - csp->http->cmd, *header); -#endif /* def FEATURE_ZLIB */ - csp->content_type = CT_TABOO; - } - - /* - * Raise flag if body chunked - */ - if (strstr(*header, "chunked")) - { - csp->flags |= CSP_FLAG_CHUNKED; - - /* - * If the body was modified, it has been de-chunked first - * and the header must be removed. - * - * FIXME: If there is more than one transfer encoding, - * only the "chunked" part should be removed here. - */ - if (csp->flags & CSP_FLAG_MODIFIED) - { - log_error(LOG_LEVEL_HEADER, "Removing: %s", *header); - freez(*header); - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : server_content_encoding - * - * Description : This function is run twice for each request, - * unless FEATURE_ZLIB and filtering are disabled. - * - * The first run is used to check if the content - * is compressed, if FEATURE_ZLIB is disabled - * filtering is then disabled as well, if FEATURE_ZLIB - * is enabled the content is marked for decompression. - * - * The second run is used to remove the Content-Encoding - * header if the decompression was successful. - * - * 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. - * - *********************************************************************/ -static jb_err server_content_encoding(struct client_state *csp, char **header) -{ -#ifdef FEATURE_ZLIB - if ((csp->flags & CSP_FLAG_MODIFIED) - && (csp->content_type & (CT_GZIP | CT_DEFLATE))) - { - /* - * We successfully decompressed the content, - * and have to clean the header now, so the - * client no longer expects compressed data.. - * - * XXX: There is a difference between cleaning - * and removing it completely. - */ - log_error(LOG_LEVEL_HEADER, "Crunching: %s", *header); - freez(*header); - } - else if (strstr(*header, "gzip")) - { - /* Mark for gzip decompression */ - csp->content_type |= CT_GZIP; - } - else if (strstr(*header, "deflate")) - { - /* Mark for zlib decompression */ - csp->content_type |= CT_DEFLATE; - } - else if (strstr(*header, "compress")) - { - /* - * We can't decompress this; therefore we can't filter - * it either. - */ - csp->content_type |= CT_TABOO; - } -#else /* !defined(FEATURE_ZLIB) */ - if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate")) - { - /* - * Body is compressed, turn off pcrs and gif filtering. - */ - csp->content_type |= CT_TABOO; - - /* - * Log a warning if the user expects the content to be filtered. - */ - if ((csp->rlist != NULL) && - (!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER]))) - { - log_error(LOG_LEVEL_INFO, - "Compressed content detected, content filtering disabled. " - "Consider recompiling Privoxy with zlib support or " - "enable the prevent-compression action."); - } - } -#endif /* defined(FEATURE_ZLIB) */ - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : server_adjust_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. - * - *********************************************************************/ -static jb_err server_adjust_content_length(struct client_state *csp, char **header) -{ - const size_t max_header_length = 80; - - /* Regenerate header if the content was modified. */ - if (csp->flags & CSP_FLAG_MODIFIED) - { - freez(*header); - *header = (char *) zalloc(max_header_length); - if (*header == NULL) - { - return JB_ERR_MEMORY; - } - - snprintf(*header, max_header_length, "Content-Length: %d", - (int)csp->content_length); - log_error(LOG_LEVEL_HEADER, "Adjusted Content-Length to %d", - (int)csp->content_length); - } - - return JB_ERR_OK; -} - - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE -/********************************************************************* - * - * Function : server_save_content_length - * - * Description : Save the Content-Length sent by the server. - * - * 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. - * - *********************************************************************/ -static jb_err server_save_content_length(struct client_state *csp, char **header) -{ - unsigned long long content_length = 0; - - assert(*(*header+14) == ':'); - - if (1 != sscanf(*header+14, ": %llu", &content_length)) - { - log_error(LOG_LEVEL_ERROR, "Crunching invalid header: %s", *header); - freez(*header); - } - else - { - csp->expected_content_length = content_length; - csp->flags |= CSP_FLAG_CONTENT_LENGTH_SET; - } - - return JB_ERR_OK; -} -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - - -/********************************************************************* - * - * Function : server_content_md5 - * - * Description : Crumble any Content-MD5 headers if the document was - * modified. FIXME: Should we re-compute instead? - * - * 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. - * - *********************************************************************/ -static jb_err server_content_md5(struct client_state *csp, char **header) -{ - if (csp->flags & CSP_FLAG_MODIFIED) - { - log_error(LOG_LEVEL_HEADER, "Crunching Content-MD5"); - freez(*header); - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : server_content_disposition - * - * Description : If enabled, blocks or modifies the "Content-Disposition" 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err server_content_disposition(struct client_state *csp, char **header) -{ - const char *newval; - - /* - * Are we messing with the Content-Disposition header? - */ - if ((csp->action->flags & ACTION_HIDE_CONTENT_DISPOSITION) == 0) - { - /* Me tinks not */ - return JB_ERR_OK; - } - - newval = csp->action->string[ACTION_STRING_CONTENT_DISPOSITION]; - - if ((newval == NULL) || (0 == strcmpic(newval, "block"))) - { - /* - * Blocking content-disposition header - */ - log_error(LOG_LEVEL_HEADER, "Crunching %s!", *header); - freez(*header); - return JB_ERR_OK; - } - else - { - /* - * Replacing Content-Disposition header - */ - freez(*header); - *header = strdup("Content-Disposition: "); - string_append(header, newval); - - if (*header != NULL) - { - log_error(LOG_LEVEL_HEADER, - "Content-Disposition header crunched and replaced with: %s", *header); - } - } - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : server_last_modified - * - * Description : Changes Last-Modified header to the actual date - * to help hide-if-modified-since. - * 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err server_last_modified(struct client_state *csp, char **header) -{ - const char *newval; - char buf[BUFFER_SIZE]; - - char newheader[50]; -#ifdef HAVE_GMTIME_R - struct tm gmt; -#endif - struct tm *timeptr = NULL; - time_t now, last_modified; - long int rtime; - long int days, hours, minutes, seconds; - - /* - * Are we messing with the Last-Modified header? - */ - if ((csp->action->flags & ACTION_OVERWRITE_LAST_MODIFIED) == 0) - { - /*Nope*/ - return JB_ERR_OK; - } - - newval = csp->action->string[ACTION_STRING_LAST_MODIFIED]; - - if (0 == strcmpic(newval, "block") ) - { - /* - * Blocking Last-Modified header. Useless but why not. - */ - log_error(LOG_LEVEL_HEADER, "Crunching %s!", *header); - freez(*header); - return JB_ERR_OK; - } - else if (0 == strcmpic(newval, "reset-to-request-time")) - { - /* - * Setting Last-Modified Header to now. - */ - get_http_time(0, buf, sizeof(buf)); - freez(*header); - *header = strdup("Last-Modified: "); - string_append(header, buf); - - if (*header == NULL) - { - log_error(LOG_LEVEL_HEADER, "Insufficient memory. Last-Modified header got lost, boohoo."); - } - else - { - log_error(LOG_LEVEL_HEADER, "Reset to present time: %s", *header); - } - } - else if (0 == strcmpic(newval, "randomize")) - { - const char *header_time = *header + sizeof("Last-Modified:"); - - log_error(LOG_LEVEL_HEADER, "Randomizing: %s", *header); - now = time(NULL); -#ifdef HAVE_GMTIME_R - timeptr = gmtime_r(&now, &gmt); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&gmtime_mutex); - timeptr = gmtime(&now); - privoxy_mutex_unlock(&gmtime_mutex); -#else - timeptr = gmtime(&now); -#endif - if (JB_ERR_OK != parse_header_time(header_time, &last_modified)) - { - log_error(LOG_LEVEL_HEADER, "Couldn't parse: %s in %s (crunching!)", header_time, *header); - freez(*header); - } - else - { - rtime = (long int)difftime(now, last_modified); - if (rtime) - { - int negative = 0; - - if (rtime < 0) - { - rtime *= -1; - negative = 1; - log_error(LOG_LEVEL_HEADER, "Server time in the future."); - } - rtime = pick_from_range(rtime); - if (negative) rtime *= -1; - last_modified += rtime; -#ifdef HAVE_GMTIME_R - timeptr = gmtime_r(&last_modified, &gmt); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&gmtime_mutex); - timeptr = gmtime(&last_modified); - privoxy_mutex_unlock(&gmtime_mutex); -#else - timeptr = gmtime(&last_modified); -#endif - strftime(newheader, sizeof(newheader), "%a, %d %b %Y %H:%M:%S GMT", timeptr); - freez(*header); - *header = strdup("Last-Modified: "); - string_append(header, newheader); - - if (*header == NULL) - { - log_error(LOG_LEVEL_ERROR, "Insufficient memory, header crunched without replacement."); - return JB_ERR_MEMORY; - } - - days = rtime / (3600 * 24); - hours = rtime / 3600 % 24; - minutes = rtime / 60 % 60; - seconds = rtime % 60; - - log_error(LOG_LEVEL_HEADER, - "Randomized: %s (added %d da%s %d hou%s %d minut%s %d second%s", - *header, days, (days == 1) ? "y" : "ys", hours, (hours == 1) ? "r" : "rs", - minutes, (minutes == 1) ? "e" : "es", seconds, (seconds == 1) ? ")" : "s)"); - } - else - { - log_error(LOG_LEVEL_HEADER, "Randomized ... or not. No time difference to work with."); - } - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_accept_encoding - * - * 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. - * - * 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. - * - *********************************************************************/ -static jb_err client_accept_encoding(struct client_state *csp, char **header) -{ - if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0) - { - log_error(LOG_LEVEL_HEADER, "Suppressed offer to compress content"); - - freez(*header); - - /* Temporarily disable the correct behaviour to - * work around a PHP bug. - * - * 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 JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_te - * - * Description : Rewrite the client's TE header so that - * if doesn't allow compression, if the action applies. - * - * 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. - * - *********************************************************************/ -static jb_err client_te(struct client_state *csp, char **header) -{ - if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0) - { - freez(*header); - log_error(LOG_LEVEL_HEADER, "Suppressed offer to compress transfer"); - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_referrer - * - * Description : Handle the "referer" 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_referrer(struct client_state *csp, char **header) -{ - const char *parameter; - /* booleans for parameters we have to check multiple times */ - int parameter_conditional_block; - int parameter_conditional_forge; - -#ifdef FEATURE_FORCE_LOAD - /* - * Since the referrer can include the prefix even - * if the request itself is non-forced, we must - * clean it unconditionally. - * - * XXX: strclean is too broad - */ - strclean(*header, FORCE_PREFIX); -#endif /* def FEATURE_FORCE_LOAD */ - - if ((csp->action->flags & ACTION_HIDE_REFERER) == 0) - { - /* Nothing left to do */ - return JB_ERR_OK; - } - - parameter = csp->action->string[ACTION_STRING_REFERER]; - assert(parameter != NULL); - parameter_conditional_block = (0 == strcmpic(parameter, "conditional-block")); - parameter_conditional_forge = (0 == strcmpic(parameter, "conditional-forge")); - - if (!parameter_conditional_block && !parameter_conditional_forge) - { - /* - * As conditional-block and conditional-forge are the only - * parameters that rely on the original referrer, we can - * remove it now for all the others. - */ - freez(*header); - } - - if (0 == strcmpic(parameter, "block")) - { - log_error(LOG_LEVEL_HEADER, "Referer crunched!"); - return JB_ERR_OK; - } - else if (parameter_conditional_block || parameter_conditional_forge) - { - return handle_conditional_hide_referrer_parameter(header, - csp->http->hostport, parameter_conditional_block); - } - else if (0 == strcmpic(parameter, "forge")) - { - return create_forged_referrer(header, csp->http->hostport); - } - else - { - /* interpret parameter as user-supplied referer to fake */ - return create_fake_referrer(header, parameter); - } -} - - -/********************************************************************* - * - * Function : client_accept_language - * - * Description : Handle the "Accept-Language" 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_accept_language(struct client_state *csp, char **header) -{ - const char *newval; - - /* - * Are we messing with the Accept-Language? - */ - if ((csp->action->flags & ACTION_HIDE_ACCEPT_LANGUAGE) == 0) - { - /*I don't think so*/ - return JB_ERR_OK; - } - - newval = csp->action->string[ACTION_STRING_LANGUAGE]; - - if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) - { - /* - * Blocking Accept-Language header - */ - log_error(LOG_LEVEL_HEADER, "Crunching Accept-Language!"); - freez(*header); - return JB_ERR_OK; - } - else - { - /* - * Replacing Accept-Language header - */ - freez(*header); - *header = strdup("Accept-Language: "); - string_append(header, newval); - - if (*header == NULL) - { - log_error(LOG_LEVEL_ERROR, - "Insufficient memory. Accept-Language header crunched without replacement."); - } - else - { - log_error(LOG_LEVEL_HEADER, - "Accept-Language header crunched and replaced with: %s", *header); - } - } - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : crunch_client_header - * - * Description : Crunch client header if it matches a string supplied by the - * user. 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. - * - * Returns : JB_ERR_OK on success and always succeeds - * - *********************************************************************/ -static jb_err crunch_client_header(struct client_state *csp, char **header) -{ - const char *crunch_pattern; - - /* Do we feel like crunching? */ - if ((csp->action->flags & ACTION_CRUNCH_CLIENT_HEADER)) - { - crunch_pattern = csp->action->string[ACTION_STRING_CLIENT_HEADER]; - - /* Is the current header the lucky one? */ - if (strstr(*header, crunch_pattern)) - { - log_error(LOG_LEVEL_HEADER, "Crunching client header: %s (contains: %s)", *header, crunch_pattern); - freez(*header); - } - } - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_uagent - * - * Description : Handle the "user-agent" config setting properly - * and remember its original value to enable browser - * bug workarounds. Called from `sed'. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_uagent(struct client_state *csp, char **header) -{ - const char *newval; - - if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) - { - return JB_ERR_OK; - } - - newval = csp->action->string[ACTION_STRING_USER_AGENT]; - if (newval == NULL) - { - return JB_ERR_OK; - } - - freez(*header); - *header = strdup("User-Agent: "); - string_append(header, newval); - - log_error(LOG_LEVEL_HEADER, "Modified: %s", *header); - - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_ua - * - * 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_ua(struct client_state *csp, char **header) -{ - if ((csp->action->flags & ACTION_HIDE_USER_AGENT) != 0) - { - log_error(LOG_LEVEL_HEADER, "crunched User-Agent!"); - freez(*header); - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_from - * - * Description : Handle the "from" 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_from(struct client_state *csp, char **header) -{ - const char *newval; - - if ((csp->action->flags & ACTION_HIDE_FROM) == 0) - { - return JB_ERR_OK; - } - - freez(*header); - - newval = csp->action->string[ACTION_STRING_FROM]; - - /* - * Are we blocking the e-mail address? - */ - if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) - { - log_error(LOG_LEVEL_HEADER, "crunched From!"); - return JB_ERR_OK; - } - - log_error(LOG_LEVEL_HEADER, " modified"); - - *header = strdup("From: "); - string_append(header, newval); - - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_send_cookie - * - * Description : Crunches the "cookie" header if necessary. - * Called from `sed'. - * - * XXX: Stupid name, doesn't send squat. - * - * 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. - * - *********************************************************************/ -static jb_err client_send_cookie(struct client_state *csp, char **header) -{ - if (csp->action->flags & ACTION_NO_COOKIE_READ) - { - log_error(LOG_LEVEL_HEADER, "Crunched outgoing cookie: %s", *header); - freez(*header); - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_x_forwarded - * - * Description : Handle the "x-forwarded-for" config setting properly, - * 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. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err client_x_forwarded(struct client_state *csp, char **header) -{ - if (0 != (csp->action->flags & ACTION_CHANGE_X_FORWARDED_FOR)) - { - const char *parameter = csp->action->string[ACTION_STRING_CHANGE_X_FORWARDED_FOR]; - - if (0 == strcmpic(parameter, "block")) - { - freez(*header); - log_error(LOG_LEVEL_HEADER, "crunched x-forwarded-for!"); - } - else if (0 == strcmpic(parameter, "add")) - { - string_append(header, ", "); - string_append(header, csp->ip_addr_str); - - if (*header == NULL) - { - return JB_ERR_MEMORY; - } - log_error(LOG_LEVEL_HEADER, - "Appended client IP address to %s", *header); - csp->flags |= CSP_FLAG_X_FORWARDED_FOR_APPENDED; - } - else - { - log_error(LOG_LEVEL_FATAL, - "Invalid change-x-forwarded-for parameter: '%s'", parameter); - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_max_forwards - * - * Description : If the HTTP method is OPTIONS or TRACE, subtract one - * from the value of the Max-Forwards header field. - * - * 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. - * - *********************************************************************/ -static jb_err client_max_forwards(struct client_state *csp, char **header) -{ - int max_forwards; - - if ((0 == strcmpic(csp->http->gpc, "trace")) || - (0 == strcmpic(csp->http->gpc, "options"))) - { - assert(*(*header+12) == ':'); - if (1 == sscanf(*header+12, ": %d", &max_forwards)) - { - if (max_forwards > 0) - { - snprintf(*header, strlen(*header)+1, "Max-Forwards: %d", --max_forwards); - log_error(LOG_LEVEL_HEADER, - "Max-Forwards value for %s request reduced to %d.", - csp->http->gpc, max_forwards); - } - else if (max_forwards < 0) - { - log_error(LOG_LEVEL_ERROR, "Crunching invalid header: %s", *header); - freez(*header); - } - } - else - { - log_error(LOG_LEVEL_ERROR, "Crunching invalid header: %s", *header); - freez(*header); - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_host - * - * Description : If the request URI did not contain host and - * port information, parse and evaluate the Host - * header field. - * - * Also, kill ill-formed HOST: headers as sent by - * Apple's iTunes software when used with a proxy. - * - * 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. - * - *********************************************************************/ -static jb_err client_host(struct client_state *csp, char **header) -{ - char *p, *q; - - /* - * If the header field name is all upper-case, chances are that it's - * an ill-formed one from iTunes. BTW, killing innocent headers here is - * not a problem -- they are regenerated later. - */ - if ((*header)[1] == 'O') - { - log_error(LOG_LEVEL_HEADER, "Killed all-caps Host header line: %s", *header); - freez(*header); - return JB_ERR_OK; - } - - if (!csp->http->hostport || (*csp->http->hostport == '*') || - *csp->http->hostport == ' ' || *csp->http->hostport == '\0') - { - - if (NULL == (p = strdup((*header)+6))) - { - return JB_ERR_MEMORY; - } - chomp(p); - if (NULL == (q = strdup(p))) - { - freez(p); - return JB_ERR_MEMORY; - } - - freez(csp->http->hostport); - csp->http->hostport = p; - freez(csp->http->host); - csp->http->host = q; - q = strchr(csp->http->host, ':'); - if (q != NULL) - { - /* Terminate hostname and evaluate port string */ - *q++ = '\0'; - csp->http->port = atoi(q); - } - else - { - csp->http->port = csp->http->ssl ? 443 : 80; - } - - log_error(LOG_LEVEL_HEADER, "New host and port from Host field: %s = %s:%d", - csp->http->hostport, csp->http->host, csp->http->port); - } - - /* Signal client_host_adder() to return right away */ - csp->flags |= CSP_FLAG_HOST_HEADER_IS_SET; - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_if_modified_since - * - * Description : Remove or modify the If-Modified-Since header. - * - * 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. - * - *********************************************************************/ -static jb_err client_if_modified_since(struct client_state *csp, char **header) -{ - char newheader[50]; -#ifdef HAVE_GMTIME_R - struct tm gmt; -#endif - struct tm *timeptr = NULL; - time_t tm = 0; - const char *newval; - long int rtime; - long int hours, minutes, seconds; - int negative = 0; - char * endptr; - - if ( 0 == strcmpic(*header, "If-Modified-Since: Wed, 08 Jun 1955 12:00:00 GMT")) - { - /* - * The client got an error message because of a temporary problem, - * the problem is gone and the client now tries to revalidate our - * error message on the real server. The revalidation would always - * end with the transmission of the whole document and there is - * no need to expose the bogus If-Modified-Since header. - */ - log_error(LOG_LEVEL_HEADER, "Crunching useless If-Modified-Since header."); - freez(*header); - } - else if (csp->action->flags & ACTION_HIDE_IF_MODIFIED_SINCE) - { - newval = csp->action->string[ACTION_STRING_IF_MODIFIED_SINCE]; - - if ((0 == strcmpic(newval, "block"))) - { - log_error(LOG_LEVEL_HEADER, "Crunching %s", *header); - freez(*header); - } - else /* add random value */ - { - const char *header_time = *header + sizeof("If-Modified-Since:"); - - if (JB_ERR_OK != parse_header_time(header_time, &tm)) - { - log_error(LOG_LEVEL_HEADER, "Couldn't parse: %s in %s (crunching!)", header_time, *header); - freez(*header); - } - else - { - rtime = strtol(newval, &endptr, 0); - if (rtime) - { - log_error(LOG_LEVEL_HEADER, "Randomizing: %s (random range: %d minut%s)", - *header, rtime, (rtime == 1 || rtime == -1) ? "e": "es"); - if (rtime < 0) - { - rtime *= -1; - negative = 1; - } - rtime *= 60; - rtime = pick_from_range(rtime); - } - else - { - log_error(LOG_LEVEL_ERROR, "Random range is 0. Assuming time transformation test.", - *header); - } - tm += rtime * (negative ? -1 : 1); -#ifdef HAVE_GMTIME_R - timeptr = gmtime_r(&tm, &gmt); -#elif FEATURE_PTHREAD - privoxy_mutex_lock(&gmtime_mutex); - timeptr = gmtime(&tm); - privoxy_mutex_unlock(&gmtime_mutex); -#else - timeptr = gmtime(&tm); -#endif - strftime(newheader, sizeof(newheader), "%a, %d %b %Y %H:%M:%S GMT", timeptr); - - freez(*header); - *header = strdup("If-Modified-Since: "); - string_append(header, newheader); - - if (*header == NULL) - { - log_error(LOG_LEVEL_HEADER, "Insufficient memory, header crunched without replacement."); - return JB_ERR_MEMORY; - } - - hours = rtime / 3600; - minutes = rtime / 60 % 60; - seconds = rtime % 60; - - log_error(LOG_LEVEL_HEADER, - "Randomized: %s (%s %d hou%s %d minut%s %d second%s", - *header, (negative) ? "subtracted" : "added", hours, - (hours == 1) ? "r" : "rs", minutes, (minutes == 1) ? "e" : "es", - seconds, (seconds == 1) ? ")" : "s)"); - } - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_if_none_match - * - * Description : Remove the If-None-Match header. - * - * 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. - * - *********************************************************************/ -static jb_err client_if_none_match(struct client_state *csp, char **header) -{ - if (csp->action->flags & ACTION_CRUNCH_IF_NONE_MATCH) - { - log_error(LOG_LEVEL_HEADER, "Crunching %s", *header); - freez(*header); - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_x_filter - * - * Description : Disables filtering if the client set "X-Filter: No". - * 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. - * - * Returns : JB_ERR_OK on success - * - *********************************************************************/ -jb_err client_x_filter(struct client_state *csp, char **header) -{ - if ( 0 == strcmpic(*header, "X-Filter: No")) - { - if (!(csp->config->feature_flags & RUNTIME_FEATURE_HTTP_TOGGLE)) - { - log_error(LOG_LEVEL_INFO, "Ignored the client's request to fetch without filtering."); - } - else - { - if (csp->action->flags & ACTION_FORCE_TEXT_MODE) - { - log_error(LOG_LEVEL_HEADER, - "force-text-mode overruled the client's request to fetch without filtering!"); - } - else - { - csp->content_type = CT_TABOO; /* XXX: This hack shouldn't be necessary */ - csp->flags |= CSP_FLAG_NO_FILTERING; - log_error(LOG_LEVEL_HEADER, "Accepted the client's request to fetch without filtering."); - } - log_error(LOG_LEVEL_HEADER, "Crunching %s", *header); - freez(*header); - } - } - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_range - * - * Description : Removes Range, Request-Range and If-Range headers if - * content filtering is enabled. If the client's version - * of the document has been altered by Privoxy, the server - * could interpret the range differently than the client - * intended in which case the user could end up with - * corrupted content. - * - * 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 - * - *********************************************************************/ -static jb_err client_range(struct client_state *csp, char **header) -{ - if (content_filters_enabled(csp->action)) - { - log_error(LOG_LEVEL_HEADER, "Content filtering is enabled." - " Crunching: '%s' to prevent range-mismatch problems.", *header); - freez(*header); - } - - return JB_ERR_OK; -} - -/* the following functions add headers directly to the header list */ - -/********************************************************************* - * - * Function : client_host_adder - * - * Description : Adds the Host: header field if it is missing. - * Called from `sed'. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_host_adder(struct client_state *csp) -{ - char *p; - jb_err err; - - if (csp->flags & CSP_FLAG_HOST_HEADER_IS_SET) - { - /* Header already set by the client, nothing to do. */ - return JB_ERR_OK; - } - - if ( !csp->http->hostport || !*(csp->http->hostport)) - { - /* XXX: When does this happen and why is it OK? */ - log_error(LOG_LEVEL_INFO, "Weirdness in client_host_adder detected and ignored."); - return JB_ERR_OK; - } - - /* - * remove 'user:pass@' from 'proto://user:pass@host' - */ - if ( (p = strchr( csp->http->hostport, '@')) != NULL ) - { - p++; - } - else - { - p = csp->http->hostport; - } - - /* XXX: Just add it, we already made sure that it will be unique */ - log_error(LOG_LEVEL_HEADER, "addh-unique: Host: %s", p); - err = enlist_unique_header(csp->headers, "Host", p); - return err; - -} - - -#if 0 -/********************************************************************* - * - * 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. - * - *********************************************************************/ -static 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); - } - - return JB_ERR_OK; -} -#endif - - -/********************************************************************* - * - * Function : client_xtra_adder - * - * Description : Used in the add_client_headers list. Called from `sed'. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_xtra_adder(struct client_state *csp) -{ - struct list_entry *lst; - jb_err err; - - for (lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]->first; - lst ; lst = lst->next) - { - log_error(LOG_LEVEL_HEADER, "addh: %s", lst->str); - err = enlist(csp->headers, lst->str); - if (err) - { - return err; - } - - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : client_x_forwarded_for_adder - * - * Description : Used in the add_client_headers list. Called from `sed'. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_x_forwarded_for_adder(struct client_state *csp) -{ - char *header = NULL; - jb_err err; - - if (!((csp->action->flags & ACTION_CHANGE_X_FORWARDED_FOR) - && (0 == strcmpic(csp->action->string[ACTION_STRING_CHANGE_X_FORWARDED_FOR], "add"))) - || (csp->flags & CSP_FLAG_X_FORWARDED_FOR_APPENDED)) - { - /* - * If we aren't adding X-Forwarded-For headers, - * or we already appended an existing X-Forwarded-For - * header, there's nothing left to do here. - */ - return JB_ERR_OK; - } - - header = strdup("X-Forwarded-For: "); - string_append(&header, csp->ip_addr_str); - - if (header == NULL) - { - return JB_ERR_MEMORY; - } - - log_error(LOG_LEVEL_HEADER, "addh: %s", header); - err = enlist(csp->headers, header); - freez(header); - - return err; -} - - -/********************************************************************* - * - * Function : server_connection_close_adder - * - * Description : "Temporary" fix for the needed but missing HTTP/1.1 - * support. Adds a "Connection: close" header to csp->headers - * unless the header was already present. 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. - * - *********************************************************************/ -static jb_err server_connection_close_adder(struct client_state *csp) -{ - const unsigned int flags = csp->flags; - const char *response_status_line = csp->headers->first->str; - - if ((flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE) - && (flags & CSP_FLAG_SERVER_CONNECTION_CLOSE_SET)) - { - return JB_ERR_OK; - } - - /* - * XXX: if we downgraded the response, this check will fail. - */ - if ((csp->config->feature_flags & - RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) - && (NULL != response_status_line) - && !strncmpic(response_status_line, "HTTP/1.1", 8)) - { - log_error(LOG_LEVEL_HEADER, "A HTTP/1.1 response " - "without Connection header implies keep-alive."); - csp->flags |= CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE; - } - - log_error(LOG_LEVEL_HEADER, "Adding: Connection: close"); - - return enlist(csp->headers, "Connection: close"); -} - - -/********************************************************************* - * - * Function : client_connection_header_adder - * - * Description : Adds a proper "Connection:" header to csp->headers - * unless the header was already present. Called from `sed'. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -static jb_err client_connection_header_adder(struct client_state *csp) -{ - const unsigned int flags = csp->flags; - const char *wanted_header = get_appropiate_connection_header(csp); - - if (!(flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE) - && (flags & CSP_FLAG_CLIENT_CONNECTION_HEADER_SET)) - { - return JB_ERR_OK; - } - - log_error(LOG_LEVEL_HEADER, "Adding: %s", wanted_header); - - return enlist(csp->headers, wanted_header); -} - - -/********************************************************************* - * - * Function : server_http - * - * 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. - * - * 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. - * - *********************************************************************/ -static jb_err server_http(struct client_state *csp, char **header) -{ - sscanf(*header, "HTTP/%*d.%*d %d", &(csp->http->status)); - if (csp->http->status == 206) - { - csp->content_type = CT_TABOO; - } - - if ((csp->action->flags & ACTION_DOWNGRADE) != 0) - { - /* XXX: Should we do a real validity check here? */ - if (strlen(*header) > 8) - { - (*header)[7] = '0'; - log_error(LOG_LEVEL_HEADER, "Downgraded answer to HTTP/1.0"); - } - else - { - /* - * XXX: Should we block the request or - * enlist a valid status code line here? - */ - log_error(LOG_LEVEL_INFO, "Malformed server response detected. " - "Downgrading to HTTP/1.0 impossible."); - } - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : server_set_cookie - * - * Description : Handle the server "cookie" header properly. - * Log cookie to the jar file. Then "crunch", - * accept or rewrite it to a session cookie. - * Called from `sed'. - * - * TODO: Allow the user to specify a new expiration - * time to cause the cookie to expire even before the - * browser is closed. - * - * 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. - * - *********************************************************************/ -static jb_err server_set_cookie(struct client_state *csp, char **header) -{ - time_t now; - time_t cookie_time; - - time(&now); - - if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0) - { - log_error(LOG_LEVEL_HEADER, "Crunching incoming cookie: %s", *header); - freez(*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); - } - - /* - * Check the expiration date to see - * if the cookie is still valid, if yes, - * rewrite it to a session cookie. - */ - if ((strncmpic(cur_tag, "expires=", 8) == 0) && *(cur_tag + 8)) - { - char *expiration_date = cur_tag + 8; /* Skip "[Ee]xpires=" */ - - /* Did we detect the date properly? */ - if (JB_ERR_OK != parse_header_time(expiration_date, &cookie_time)) - { - /* - * Nope, treat it as if it was still valid. - * - * XXX: Should we remove the whole cookie instead? - */ - log_error(LOG_LEVEL_ERROR, - "Can't parse '%s', send by %s. Unsupported time format?", cur_tag, csp->http->url); - string_move(cur_tag, next_tag); - changed = 1; - } - else - { - /* - * Yes. Check if the cookie is still valid. - * - * If the cookie is already expired it's probably - * a delete cookie and even if it isn't, the browser - * will discard it anyway. - */ - - /* - * XXX: timegm() isn't available on some AmigaOS - * versions and our replacement doesn't work. - * - * Our options are to either: - * - * - disable session-cookies-only completely if timegm - * is missing, - * - * - to simply remove all expired tags, like it has - * been done until Privoxy 3.0.6 and to live with - * the consequence that it can cause login/logout - * problems on servers that don't validate their - * input properly, or - * - * - to replace it with mktime in which - * case there is a slight chance of valid cookies - * passing as already expired. - * - * This is the way it's currently done and it's not - * as bad as it sounds. If the missing GMT offset is - * enough to change the result of the expiration check - * the cookie will be only valid for a few hours - * anyway, which in many cases will be shorter - * than a browser session. - */ - if (cookie_time - now < 0) - { - log_error(LOG_LEVEL_HEADER, - "Cookie '%s' is already expired and can pass unmodified.", *header); - /* Just in case some clown sets more then one expiration date */ - cur_tag = next_tag; - } - else - { - /* - * Still valid, delete expiration date by copying - * the rest of the string over it. - */ - string_move(cur_tag, next_tag); - - /* 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) - { - assert(NULL != *header); - log_error(LOG_LEVEL_HEADER, "Cookie rewritten to a temporary one: %s", - *header); - } - } - - return JB_ERR_OK; -} - - -#ifdef FEATURE_FORCE_LOAD -/********************************************************************* - * - * Function : strclean - * - * Description : In-Situ-Eliminate all occurances of substring in - * string - * - * Parameters : - * 1 : string = string to clean - * 2 : substring = substring to eliminate - * - * Returns : Number of eliminations - * - *********************************************************************/ -int strclean(char *string, const char *substring) -{ - int hits = 0; - size_t len; - char *pos, *p; - - len = strlen(substring); - - while((pos = strstr(string, substring)) != NULL) - { - p = pos + len; - do - { - *(p - len) = *p; - } - while (*p++ != '\0'); - - hits++; - } - - return(hits); -} -#endif /* def FEATURE_FORCE_LOAD */ - - -/********************************************************************* - * - * Function : parse_header_time - * - * Description : Parses time formats used in HTTP header strings - * to get the numerical respresentation. - * - * Parameters : - * 1 : header_time = HTTP header time as string. - * 2 : result = storage for header_time in seconds - * - * Returns : JB_ERR_OK if the time format was recognized, or - * JB_ERR_PARSE otherwise. - * - *********************************************************************/ -static jb_err parse_header_time(const char *header_time, time_t *result) -{ - struct tm gmt; - - /* - * Zero out gmt to prevent time zone offsets. - * - * While this is only necessary on some platforms - * (mingw32 for example), I don't know how to - * detect these automatically and doing it everywhere - * shouldn't hurt. - */ - memset(&gmt, 0, sizeof(gmt)); - - /* Tue, 02 Jun 2037 20:00:00 */ - if ((NULL == strptime(header_time, "%a, %d %b %Y %H:%M:%S", &gmt)) - /* Tue, 02-Jun-2037 20:00:00 */ - && (NULL == strptime(header_time, "%a, %d-%b-%Y %H:%M:%S", &gmt)) - /* Tue, 02-Jun-37 20:00:00 */ - && (NULL == strptime(header_time, "%a, %d-%b-%y %H:%M:%S", &gmt)) - /* Tuesday, 02-Jun-2037 20:00:00 */ - && (NULL == strptime(header_time, "%A, %d-%b-%Y %H:%M:%S", &gmt)) - /* Tuesday Jun 02 20:00:00 2037 */ - && (NULL == strptime(header_time, "%A %b %d %H:%M:%S %Y", &gmt))) - { - return JB_ERR_PARSE; - } - - *result = timegm(&gmt); - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : get_destination_from_headers - * - * Description : Parse the "Host:" header to get the request's destination. - * Only needed if the client's request was forcefully - * redirected into Privoxy. - * - * Code mainly copied from client_host() which is currently - * run too late for this purpose. - * - * Parameters : - * 1 : headers = List of headers (one of them hopefully being - * the "Host:" header) - * 2 : http = storage for the result (host, port and hostport). - * - * Returns : JB_ERR_MEMORY in case of memory problems, - * JB_ERR_PARSE if the host header couldn't be found, - * JB_ERR_OK otherwise. - * - *********************************************************************/ -jb_err get_destination_from_headers(const struct list *headers, struct http_request *http) -{ - char *q; - char *p; - char *host; - - host = get_header_value(headers, "Host:"); - - if (NULL == host) - { - log_error(LOG_LEVEL_ERROR, "No "Host:" header found."); - return JB_ERR_PARSE; - } - - if (NULL == (p = strdup((host)))) - { - log_error(LOG_LEVEL_ERROR, "Out of memory while parsing "Host:" header"); - return JB_ERR_MEMORY; - } - chomp(p); - if (NULL == (q = strdup(p))) - { - freez(p); - log_error(LOG_LEVEL_ERROR, "Out of memory while parsing "Host:" header"); - return JB_ERR_MEMORY; - } - - freez(http->hostport); - http->hostport = p; - freez(http->host); - http->host = q; - q = strchr(http->host, ':'); - if (q != NULL) - { - /* Terminate hostname and evaluate port string */ - *q++ = '\0'; - http->port = atoi(q); - } - else - { - http->port = http->ssl ? 443 : 80; - } - - /* Rebuild request URL */ - freez(http->url); - http->url = strdup(http->ssl ? "https://" : "http://"); - string_append(&http->url, http->hostport); - string_append(&http->url, http->path); - if (http->url == NULL) - { - return JB_ERR_MEMORY; - } - - log_error(LOG_LEVEL_HEADER, "Destination extracted from "Host:" header. New request URL: %s", - http->url); - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : create_forged_referrer - * - * Description : Helper for client_referrer to forge a referer as - * 'http://%5Bhostname:port/' to fool stupid - * checks for in-site links - * - * Parameters : - * 1 : header = Pointer to header pointer - * 2 : hostport = Host and optionally port as string - * - * Returns : JB_ERR_OK in case of success, or - * JB_ERR_MEMORY in case of memory problems. - * - *********************************************************************/ -static jb_err create_forged_referrer(char **header, const char *hostport) -{ - assert(NULL == *header); - - *header = strdup("Referer: http://"); - string_append(header, hostport); - string_append(header, "/"); - - if (NULL == *header) - { - return JB_ERR_MEMORY; - } - - log_error(LOG_LEVEL_HEADER, "Referer forged to: %s", *header); - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : create_fake_referrer - * - * Description : Helper for client_referrer to create a fake referrer - * based on a string supplied by the user. - * - * Parameters : - * 1 : header = Pointer to header pointer - * 2 : hosthost = Referrer to fake - * - * Returns : JB_ERR_OK in case of success, or - * JB_ERR_MEMORY in case of memory problems. - * - *********************************************************************/ -static jb_err create_fake_referrer(char **header, const char *fake_referrer) -{ - assert(NULL == *header); - - if ((0 != strncmpic(fake_referrer, "http://", 7)) && (0 != strncmpic(fake_referrer, "https://", 8))) - { - log_error(LOG_LEVEL_HEADER, - "Parameter: +hide-referrer{%s} is a bad idea, but I don't care.", fake_referrer); - } - *header = strdup("Referer: "); - string_append(header, fake_referrer); - - if (NULL == *header) - { - return JB_ERR_MEMORY; - } - - log_error(LOG_LEVEL_HEADER, "Referer replaced with: %s", *header); - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : handle_conditional_hide_referrer_parameter - * - * Description : Helper for client_referrer to crunch or forge - * the referrer header if the host has changed. - * - * Parameters : - * 1 : header = Pointer to header pointer - * 2 : host = The target host (may include the port) - * 3 : parameter_conditional_block = Boolean to signal - * if we're in conditional-block mode. If not set, - * we're in conditional-forge mode. - * - * Returns : JB_ERR_OK in case of success, or - * JB_ERR_MEMORY in case of memory problems. - * - *********************************************************************/ -static jb_err handle_conditional_hide_referrer_parameter(char **header, - const char *host, const int parameter_conditional_block) -{ - char *referer = strdup(*header); - const size_t hostlenght = strlen(host); - const char *referer_url = NULL; - - if (NULL == referer) - { - freez(*header); - return JB_ERR_MEMORY; - } - - /* referer begins with 'Referer: http[s]://' */ - if ((hostlenght+17) < strlen(referer)) - { - /* - * Shorten referer to make sure the referer is blocked - * if www.example.org/www.example.com-shall-see-the-referer/ - * links to www.example.com/ - */ - referer[hostlenght+17] = '\0'; - } - referer_url = strstr(referer, "http://"); - if ((NULL == referer_url) || (NULL == strstr(referer_url, host))) - { - /* Host has changed, Referer is invalid or a https URL. */ - if (parameter_conditional_block) - { - log_error(LOG_LEVEL_HEADER, "New host is: %s. Crunching %s!", host, *header); - freez(*header); - } - else - { - freez(*header); - freez(referer); - return create_forged_referrer(header, host); - } - } - freez(referer); - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : get_appropiate_connection_header - * - * Description : Returns an appropiate Connection header - * depending on whether or not we try to keep - * the connection to the server alive. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : Pointer to statically allocated header buffer. - * - *********************************************************************/ -static const char *get_appropiate_connection_header(const struct client_state *csp) -{ - static const char connection_keep_alive[] = "Connection: keep-alive"; - static const char connection_close[] = "Connection: close"; - - if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) - && (csp->http->ssl == 0)) - { - return connection_keep_alive; - } - return connection_close; -} -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/parsers.c.rej b/external/privoxy/parsers.c.rej deleted file mode 100644 index 84b4ba7..0000000 --- a/external/privoxy/parsers.c.rej +++ /dev/null @@ -1,16 +0,0 @@ -*************** -*** 986,991 **** - const add_header_func_ptr add_client_headers[] = { - client_host_adder, - client_cookie_adder, - client_xtra_adder, - /* Temporarily disabled: client_accept_encoding_adder, */ - connection_close_adder, ---- 983,989 ---- - const add_header_func_ptr add_client_headers[] = { - client_host_adder, - client_cookie_adder, -+ client_x_forwarded_adder, - client_xtra_adder, - /* Temporarily disabled: client_accept_encoding_adder, */ - connection_close_adder, diff --git a/external/privoxy/parsers.h b/external/privoxy/parsers.h deleted file mode 100644 index cf70be4..0000000 --- a/external/privoxy/parsers.h +++ /dev/null @@ -1,323 +0,0 @@ -#ifndef PARSERS_H_INCLUDED -#define PARSERS_H_INCLUDED -#define PARSERS_H_VERSION "$Id: parsers.h,v 1.49 2009/03/13 14:10:07 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/parsers.h,v $ - * - * Purpose : Declares functions to parse/crunch headers and pages. - * Functions declared include: - * `add_to_iob', `client_cookie_adder', `client_from', - * `client_referrer', `client_send_cookie', `client_ua', - * `client_uagent', `client_x_forwarded', - * `client_x_forwarded_adder', `client_xtra_adder', - * `content_type', `crumble', `destroy_list', `enlist', - * `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/ - * - * 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: parsers.h,v $ - * Revision 1.49 2009/03/13 14:10:07 fabiankeil - * Fix some more harmless warnings on amd64. - * - * Revision 1.48 2008/05/30 15:57:23 fabiankeil - * Remove now-useless reference to debug. - * - * Revision 1.47 2008/05/21 20:12:11 fabiankeil - * The whole point of strclean() is to modify the - * first parameter, so don't mark it immutable, - * even though the compiler lets us get away with it. - * - * Revision 1.46 2008/05/21 15:47:14 fabiankeil - * Streamline sed()'s prototype and declare - * the header parse and add structures static. - * - * Revision 1.45 2008/05/20 20:13:30 fabiankeil - * Factor update_server_headers() out of sed(), ditch the - * first_run hack and make server_patterns_light static. - * - * Revision 1.44 2008/05/20 16:05:09 fabiankeil - * Move parsers structure definition from project.h to parsers.h. - * - * Revision 1.43 2008/05/10 13:23:38 fabiankeil - * Don't provide get_header() with the whole client state - * structure when it only needs access to csp->iob. - * - * Revision 1.42 2008/04/17 14:40:49 fabiankeil - * Provide get_http_time() with the buffer size so it doesn't - * have to blindly assume that the buffer is big enough. - * - * Revision 1.41 2008/04/16 16:38:21 fabiankeil - * Don't pass the whole csp structure to flush_socket() - * when it only needs a file descriptor and a buffer. - * - * Revision 1.40 2007/08/11 14:47:26 fabiankeil - * Remove the prototypes for functions that are only - * used in parsers.c and thus should be static. - * - * Revision 1.39 2007/06/01 16:31:55 fabiankeil - * Change sed() to return a jb_err in preparation for forward-override{}. - * - * Revision 1.38 2007/03/25 14:27:11 fabiankeil - * Let parse_header_time() return a jb_err code - * instead of a pointer that can only be used to - * check for NULL anyway. - * - * Revision 1.37 2007/03/20 15:22:17 fabiankeil - * - Remove filter_client_header() and filter_client_header(), - * filter_header() now checks the shiny new - * CSP_FLAG_CLIENT_HEADER_PARSING_DONE flag instead. - * - * Revision 1.36 2007/03/05 13:25:32 fabiankeil - * - Cosmetical changes for LOG_LEVEL_RE_FILTER messages. - * - Handle "Cookie:" and "Connection:" headers a bit smarter - * (don't crunch them just to recreate them later on). - * - Add another non-standard time format for the cookie - * expiration date detection. - * - Fix a valgrind warning. - * - * Revision 1.35 2007/01/01 19:36:37 fabiankeil - * Integrate a modified version of Wil Mahan's - * zlib patch (PR #895531). - * - * Revision 1.34 2006/12/29 19:08:22 fabiankeil - * Reverted parts of my last commit - * to keep error handling working. - * - * Revision 1.33 2006/12/29 18:04:40 fabiankeil - * Fixed gcc43 conversion warnings. - * - * Revision 1.32 2006/12/06 19:14:23 fabiankeil - * Added prototype for get_destination_from_headers(). - * - * Revision 1.31 2006/08/17 17:15:10 fabiankeil - * - Back to timegm() using GnuPG's replacement if necessary. - * Using mktime() and localtime() could add a on hour offset if - * the randomize factor was big enough to lead to a summer/wintertime - * switch. - * - * - Removed now-useless Privoxy 3.0.3 compatibility glue. - * - * - Moved randomization code into pick_from_range(). - * - * - Changed parse_header_time definition. - * time_t isn't guaranteed to be signed and - * if it isn't, -1 isn't available as error code. - * Changed some variable types in client_if_modified_since() - * because of the same reason. - * - * Revision 1.30 2006/08/14 08:25:19 fabiankeil - * Split filter-headers{} into filter-client-headers{} - * and filter-server-headers{}. - * Added parse_header_time() to share some code. - * Replaced timegm() with mktime(). - * - * Revision 1.29 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work:http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.28 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.26.2.1 2002/09/25 14:52:46 oes - * Added basic support for OPTIONS and TRACE HTTP methods: - * - New parser function client_max_forwards which decrements - * the Max-Forwards HTTP header field of OPTIONS and TRACE - * requests by one before forwarding - * - New parser function client_host which extracts the host - * and port information from the HTTP header field if the - * request URI was not absolute - * - Don't crumble and re-add the Host: header, but only generate - * and append if missing - * - * Revision 1.26 2002/05/08 15:59:53 oes - * Changed add_to_iob signature (now returns jb_err) - * - * Revision 1.25 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.5 2001/05/31 21:30:33 jongfoster - * Removed list code - it's now in list.[ch] - * Renamed "permission" to "action", and changed many features - * to use the actions file rather than the global config. - * - * Revision 1.4 2001/05/27 13:19:06 oes - * Patched Joergs solution for the content-length in. - * - * Revision 1.3 2001/05/26 13:39:32 jongfoster - * Only crunches Content-Length header if applying RE filtering. - * Without this fix, Microsoft Windows Update wouldn't work. - * - * 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:59:01 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Used for sed()'s second argument. */ -#define FILTER_CLIENT_HEADERS 0 -#define FILTER_SERVER_HEADERS 1 - -extern long flush_socket(jb_socket fd, struct iob *iob); -extern jb_err add_to_iob(struct client_state *csp, char *buf, long n); -extern jb_err decompress_iob(struct client_state *csp); -extern char *get_header(struct iob *iob); -extern char *get_header_value(const struct list *header_list, const char *header_name); -extern jb_err sed(struct client_state *csp, int filter_server_headers); -extern jb_err update_server_headers(struct client_state *csp); -extern void get_http_time(int time_offset, char *buf, size_t buffer_size); -extern jb_err get_destination_from_headers(const struct list *headers, struct http_request *http); - -#ifdef FEATURE_FORCE_LOAD -extern int strclean(char *string, const char *substring); -#endif /* def FEATURE_FORCE_LOAD */ - -/* Revision control strings from this header and associated .c file */ -extern const char parsers_rcs[]; -extern const char parsers_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef PARSERS_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/pcre/Makefile.in b/external/privoxy/pcre/Makefile.in deleted file mode 100644 index 94edf49..0000000 --- a/external/privoxy/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 Paul.Sokolovsky@technologist.com. I (Philip # -# Hazel) don't know anything about it! There are some additional targets at # -# the bottom of this Makefile. # -#---------------------------------------------------------------------------# -# -# include dll.mk -# DLL_LDFLAGS=-s - - -#---------------------------------------------------------------------------# -# The next few lines are modified by "configure" to insert data that it is # -# given in its arguments, or which it finds out for itself. # -#---------------------------------------------------------------------------# - -# BINDIR is the directory in which the pcregrep command is installed. -# INCDIR is the directory in which the public header file pcre.h is installed. -# LIBDIR is the directory in which the libraries are installed. -# MANDIR is the directory in which the man pages are installed. -# The pcretest program, as it is a test program, does not get installed -# anywhere. - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -BINDIR = @bindir@ -LIBDIR = @libdir@ -INCDIR = @includedir@ -MANDIR = @mandir@ - -CC = @CC@ -CFLAGS = @CFLAGS@ -RANLIB = @RANLIB@ -UTF8 = @UTF8@ - -# LIBTOOL defaults to "./libtool", which enables the building of shared -# libraries. If "configure" is called with --disable-shared-libraries, LIBTOOL -# is set to "", which stops shared libraries from being built, and LIBSUFFIX -# is set to "a" instead of "la", which causes the shared libraries not to be -# installed. - -LIBTOOL = @LIBTOOL@ -LIBSUFFIX = @LIBSUFFIX@ - -# These are the version numbers for the shared libraries - -PCRELIBVERSION = @PCRE_LIB_VERSION@ -PCREPOSIXLIBVERSION = @PCRE_POSIXLIB_VERSION@ - - -#---------------------------------------------------------------------------# -# A copy of install-sh is in this distribution and is used by default. # -#---------------------------------------------------------------------------# - -INSTALL = ./install-sh -c -INSTALL_DATA = ${INSTALL} -m 644 - - -#---------------------------------------------------------------------------# -# For almost all systems, the command to create a library is "ar cq", but # -# there is at least one where it is different, so this command must be # -# configurable. However, I haven't got round to learning how to make # -# "configure" find this out for itself. It is necessary to use a command # -# such as "make AR='ar -rc'" if you need to vary this. The setting of AR is # -# *not* passed over to ./ltconfig, because it does its own setting up. # -#---------------------------------------------------------------------------# - -AR = ar cq - - -############################################################################## - - -OBJ = maketables.o get.o study.o pcre.o -LOBJ = maketables.lo get.lo study.lo pcre.lo - -all: libtool libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest pcregrep - -libtool: config.guess config.sub ltconfig ltmain.sh - @if test "$(LIBTOOL)" = "./libtool"; then \ - echo '--- Building libtool ---'; \ - CC=$(CC) CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)' ./ltconfig ./ltmain.sh; \ - echo '--- Built libtool ---'; fi - -pcregrep: libpcre.$(LIBSUFFIX) pcregrep.o - @echo ' ' - @echo '--- Building pcregrep utility' - @echo ' ' - $(LIBTOOL) $(CC) $(CFLAGS) -o pcregrep pcregrep.o libpcre.$(LIBSUFFIX) - -pcretest: libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest.o - @echo ' ' - @echo '--- Building pcretest testing program' - @echo ' ' - $(LIBTOOL) $(PURIFY) $(CC) $(CFLAGS) -o pcretest pcretest.o \ - libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) - -libpcre.a: $(OBJ) - @echo ' ' - @echo '--- Building static library: libpcre' - @echo ' ' - -rm -f libpcre.a - $(AR) libpcre.a $(OBJ) - $(RANLIB) libpcre.a - -libpcre.la: $(OBJ) - @echo ' ' - @echo '--- Building shared library: libpcre' - @echo ' ' - -rm -f libpcre.la - ./libtool $(CC) -version-info '$(PCRELIBVERSION)' -o libpcre.la -rpath $(LIBDIR) $(LOBJ) - -libpcreposix.a: pcreposix.o - @echo ' ' - @echo '--- Building static library: libpcreposix' - @echo ' ' - -rm -f libpcreposix.a - $(AR) libpcreposix.a pcreposix.o - $(RANLIB) libpcreposix.a - -libpcreposix.la: pcreposix.o - @echo ' ' - @echo '--- Building shared library: libpcreposix' - @echo ' ' - -rm -f libpcreposix.la - ./libtool $(CC) -version-info '$(PCREPOSIXLIBVERSION)' -o libpcreposix.la -rpath $(LIBDIR) pcreposix.lo - -pcre.o: chartables.c pcre.c pcre.h internal.h config.h Makefile - $(LIBTOOL) $(CC) -c $(CFLAGS) $(UTF8) pcre.c - -pcreposix.o: pcreposix.c pcreposix.h internal.h pcre.h config.h Makefile - $(LIBTOOL) $(CC) -c $(CFLAGS) pcreposix.c - -maketables.o: maketables.c pcre.h internal.h config.h Makefile - $(LIBTOOL) $(CC) -c $(CFLAGS) maketables.c - -get.o: get.c pcre.h internal.h config.h Makefile - $(LIBTOOL) $(CC) -c $(CFLAGS) get.c - -study.o: study.c pcre.h internal.h config.h Makefile - $(LIBTOOL) $(CC) -c $(CFLAGS) $(UTF8) study.c - -pcretest.o: pcretest.c pcre.h config.h Makefile - $(CC) -c $(CFLAGS) $(UTF8) pcretest.c - -pcregrep.o: pcregrep.c pcre.h Makefile config.h - $(CC) -c $(CFLAGS) $(UTF8) pcregrep.c - -# An auxiliary program makes the default character table source - -chartables.c: dftables - ./dftables >chartables.c - -dftables: dftables.c maketables.c pcre.h internal.h config.h Makefile - $(CC) -o dftables $(CFLAGS) dftables.c - -install: all - $(LIBTOOL) $(INSTALL_DATA) libpcre.$(LIBSUFFIX) $(DESTDIR)/$(LIBDIR)/libpcre.$(LIBSUFFIX) - $(LIBTOOL) $(INSTALL_DATA) libpcreposix.$(LIBSUFFIX) $(DESTDIR)/$(LIBDIR)/libpcreposix.$(LIBSUFFIX) - $(INSTALL_DATA) pcre.h $(DESTDIR)/$(INCDIR)/pcre.h - $(INSTALL_DATA) pcreposix.h $(DESTDIR)/$(INCDIR)/pcreposix.h - $(INSTALL_DATA) doc/pcre.3 $(DESTDIR)/$(MANDIR)/man3/pcre.3 - $(INSTALL_DATA) doc/pcreposix.3 $(DESTDIR)/$(MANDIR)/man3/pcreposix.3 - $(INSTALL_DATA) doc/pcregrep.1 $(DESTDIR)/$(MANDIR)/man1/pcregrep.1 - @if test "$(LIBTOOL)" = "./libtool"; then \ - echo ' '; \ - echo '--- Rebuilding pcregrep to use installed shared library ---'; \ - echo $(CC) $(CFLAGS) -o pcregrep pcregrep.o -L$(DESTDIR)/$(LIBDIR) -lpcre; \ - $(CC) $(CFLAGS) -o pcregrep pcregrep.o -L$(DESTDIR)/$(LIBDIR) -lpcre; \ - echo '--- Rebuilding pcretest to use installed shared library ---'; \ - echo $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(DESTDIR)/$(LIBDIR) -lpcre -lpcreposix; \ - $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(DESTDIR)/$(LIBDIR) -lpcre -lpcreposix; \ - fi - $(INSTALL) pcregrep $(DESTDIR)/$(BINDIR)/pcregrep - $(INSTALL) pcre-config $(DESTDIR)/$(BINDIR)/pcre-config - -# We deliberately omit dftables and chartables.c from 'make clean'; once made -# chartables.c shouldn't change, and if people have edited the tables by hand, -# you don't want to throw them away. - -clean:; -rm -rf *.o *.lo *.a *.la .libs pcretest pcregrep testtry - -# But "make distclean" should get back to a virgin distribution - -distclean: clean - -rm -f chartables.c libtool pcre-config pcre.h \ - Makefile config.h config.status config.log config.cache - -check: runtest - -test: runtest - -runtest: all - ./RunTest - -######## MINGW32 ############### MINGW32 ############### MINGW32 ############# - -# This addition for mingw32 was contributed by Paul Sokolovsky -# Paul.Sokolovsky@technologist.com. I (PH) don't know anything about it! - -dll: _dll libpcre.dll.a pcregrep_d pcretest_d - -_dll: - $(MAKE) CFLAGS=-DSTATIC pcre.dll - -pcre.dll: $(OBJ) pcreposix.o pcre.def -libpcre.dll.a: pcre.def - -pcregrep_d: libpcre.dll.a pcregrep.o - $(CC) $(CFLAGS) -L. -o pcregrep pcregrep.o -lpcre.dll - -pcretest_d: libpcre.dll.a pcretest.o - $(PURIFY) $(CC) $(CFLAGS) -L. -o pcretest pcretest.o -lpcre.dll - -# End diff --git a/external/privoxy/pcre/RunTest.in b/external/privoxy/pcre/RunTest.in deleted file mode 100644 index 6e4eb08..0000000 --- a/external/privoxy/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/external/privoxy/pcre/chartables.c b/external/privoxy/pcre/chartables.c deleted file mode 100644 index 9055da2..0000000 --- a/external/privoxy/pcre/chartables.c +++ /dev/null @@ -1,183 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* This file is automatically written by the dftables auxiliary -program. If you edit it by hand, you might like to edit the Makefile to -prevent its ever being regenerated. - -This file is #included in the compilation of pcre.c to build the default -character tables which are used when no tables are passed to the compile -function. */ - -static unsigned char pcre_default_tables[] = { - -/* This table is a lower casing table. */ - - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 97, 98, 99,100,101,102,103, - 104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119, - 120,121,122, 91, 92, 93, 94, 95, - 96, 97, 98, 99,100,101,102,103, - 104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119, - 120,121,122,123,124,125,126,127, - 128,129,130,131,132,133,134,135, - 136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151, - 152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167, - 168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183, - 184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199, - 200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215, - 216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231, - 232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247, - 248,249,250,251,252,253,254,255, - -/* This table is a case flipping table. */ - - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 97, 98, 99,100,101,102,103, - 104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119, - 120,121,122, 91, 92, 93, 94, 95, - 96, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90,123,124,125,126,127, - 128,129,130,131,132,133,134,135, - 136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151, - 152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167, - 168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183, - 184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199, - 200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215, - 216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231, - 232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247, - 248,249,250,251,252,253,254,255, - -/* This table contains bit maps for various character classes. -Each map is 32 bytes long and the bits run from the least -significant end of each byte. The classes that have their own -maps are: space, xdigit, digit, upper, lower, word, graph -print, punct, and cntrl. Other classes are built from combinations. */ - - 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, - 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, - 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, - 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - -/* This table identifies various classes of character by individual bits: - 0x01 white space character - 0x02 letter - 0x04 decimal digit - 0x08 hexadecimal digit - 0x10 alphanumeric or '_' - 0x80 regular expression metacharacter or binary zero -*/ - - 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ - 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ - 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ - 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ - 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ - 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ - 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ - 0x12,0x12,0x12,0x80,0x00,0x00,0x80,0x10, /* X - _ */ - 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ - 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ - -/* End of chartables.c */ diff --git a/external/privoxy/pcre/config.guess b/external/privoxy/pcre/config.guess deleted file mode 100644 index e1b5871..0000000 --- a/external/privoxy/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 bothner@cygnus.com. -# The master version of this file is at the FSF in /home/gd/gnu/lib. -# Please send patches to autoconf-patches@gnu.org. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit system type (host/target name). -# -# Only a few systems have been added to this list; please add others -# (but try to keep the structure clean). -# - -# Use $HOST_CC if defined. $CC may point to a cross-compiler -if test x"$CC_FOR_BUILD" = x; then - if test x"$HOST_CC" != x; then - CC_FOR_BUILD="$HOST_CC" - else - if test x"$CC" != x; then - CC_FOR_BUILD="$CC" - else - CC_FOR_BUILD=cc - fi - fi -fi - - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 8/24/94.) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -dummy=dummy-$$ -trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - cat <<EOF >$dummy.s - .globl main - .ent main -main: - .frame $30,0,$26,0 - .prologue 0 - .long 0x47e03d80 # implver $0 - lda $2,259 - .long 0x47e20c21 # amask $2,$1 - srl $1,8,$2 - sll $2,2,$2 - sll $0,3,$0 - addl $1,$0,$0 - addl $2,$0,$0 - ret $31,($26),1 - .end main -EOF - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - ./$dummy - case "$?" in - 7) - UNAME_MACHINE="alpha" - ;; - 15) - UNAME_MACHINE="alphaev5" - ;; - 14) - UNAME_MACHINE="alphaev56" - ;; - 10) - UNAME_MACHINE="alphapca56" - ;; - 16) - UNAME_MACHINE="alphaev6" - ;; - esac - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit 0 ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit 0 ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit 0 ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-cbm-sysv4 - exit 0;; - amiga:NetBSD:*:*) - echo m68k-cbm-netbsd${UNAME_RELEASE} - exit 0 ;; - amiga:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit 0 ;; - arc64:OpenBSD:*:*) - echo mips64el-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - arc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - hkmips:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - pmax:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sgi:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - wgrisc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit 0 ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit 0;; - arm32:NetBSD:*:*) - echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/./'` - exit 0 ;; - SR2?01:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit 0;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit 0 ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit 0 ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit 0 ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit 0 ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit 0 ;; - atari*:NetBSD:*:*) - echo m68k-atari-netbsd${UNAME_RELEASE} - exit 0 ;; - atari*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit 0 ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit 0 ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit 0 ;; - sun3*:NetBSD:*:*) - echo m68k-sun-netbsd${UNAME_RELEASE} - exit 0 ;; - sun3*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:NetBSD:*:*) - echo m68k-apple-netbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme88k:OpenBSD:*:*) - echo m88k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit 0 ;; - macppc:NetBSD:*:*) - echo powerpc-apple-netbsd${UNAME_RELEASE} - exit 0 ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit 0 ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit 0 ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy \ - && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/([0-9]*).*/\1/p'` \ - && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo mips-mips-riscos${UNAME_RELEASE} - exit 0 ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit 0 ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit 0 ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit 0 ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit 0 ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit 0 ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit 0 ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit 0 ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit 0 ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit 0 ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit 0 ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i?86:AIX:*:*) - echo i386-ibm-aix - exit 0 ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - sed 's/^ //' << EOF >$dummy.c - #include <sys/systemcfg.h> - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo rs6000-ibm-aix3.2.5 - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit 0 ;; - *:AIX:*:4) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` - if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=4.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit 0 ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit 0 ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit 0 ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit 0 ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit 0 ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit 0 ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit 0 ;; - 9000/[34678]??:HP-UX:*:*) - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - sed 's/^ //' << EOF >$dummy.c - #include <stdlib.h> - #include <unistd.h> - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` - rm -f $dummy.c $dummy - esac - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit 0 ;; - 3050*:HI-UX:*:*) - sed 's/^ //' << EOF >$dummy.c - #include <unistd.h> - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo unknown-hitachi-hiuxwe2 - exit 0 ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit 0 ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit 0 ;; - *9??*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit 0 ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit 0 ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit 0 ;; - i?86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit 0 ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit 0 ;; - hppa*:OpenBSD:*:*) - echo hppa-unknown-openbsd - exit 0 ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit 0 ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit 0 ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit 0 ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit 0 ;; - CRAY*X-MP:*:*:*) - echo xmp-cray-unicos - exit 0 ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} - exit 0 ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*([A-Z]90)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ - exit 0 ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} - exit 0 ;; - CRAY*T3E:*:*:*) - echo alpha-cray-unicosmk${UNAME_RELEASE} - exit 0 ;; - CRAY-2:*:*:*) - echo cray2-cray-unicos - exit 0 ;; - F300:UNIX_System_V:*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's////'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; - F301:UNIX_System_V:*:*) - echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` - exit 0 ;; - hp3[0-9][05]:NetBSD:*:*) - echo m68k-hp-netbsd${UNAME_RELEASE} - exit 0 ;; - hp300:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - i?86:BSD/386:*:* | i?86:BSD/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit 0 ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:FreeBSD:*:*) - if test -x /usr/bin/objformat; then - if test "elf" = "`/usr/bin/objformat`"; then - echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` - exit 0 - fi - fi - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit 0 ;; - *:NetBSD:*:*) - echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` - exit 0 ;; - *:OpenBSD:*:*) - echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/./'` - exit 0 ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit 0 ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit 0 ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i386-pc-interix - exit 0 ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit 0 ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit 0 ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - *:GNU:*:*) - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit 0 ;; - *:Linux:*:*) - - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - ld_help_string=`cd /; ld --help 2>&1` - ld_supported_emulations=`echo $ld_help_string \ - | sed -ne '/supported emulations:/!d - s/[ ][ ]*/ /g - s/.*supported emulations: *// - s/ .*// - p'` - case "$ld_supported_emulations" in - *ia64) - echo "${UNAME_MACHINE}-unknown-linux" - exit 0 - ;; - i?86linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 - ;; - i?86coff) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit 0 - ;; - sparclinux) - echo "${UNAME_MACHINE}-unknown-linux-gnuaout" - exit 0 - ;; - armlinux) - echo "${UNAME_MACHINE}-unknown-linux-gnuaout" - exit 0 - ;; - elf32arm*) - echo "${UNAME_MACHINE}-unknown-linux-gnu" - exit 0 - ;; - armelf_linux*) - echo "${UNAME_MACHINE}-unknown-linux-gnu" - exit 0 - ;; - m68klinux) - echo "${UNAME_MACHINE}-unknown-linux-gnuaout" - exit 0 - ;; - elf32ppc) - # Determine Lib Version - cat >$dummy.c <<EOF -#include <features.h> -#if defined(__GLIBC__) -extern char __libc_version[]; -extern char __libc_release[]; -#endif -main(argc, argv) - int argc; - char *argv[]; -{ -#if defined(__GLIBC__) - printf("%s %s\n", __libc_version, __libc_release); -#else - printf("unkown\n"); -#endif - return 0; -} -EOF - LIBC="" - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null - if test "$?" = 0 ; then - ./$dummy | grep 1.99 > /dev/null - if test "$?" = 0 ; then - LIBC="libc1" - fi - fi - rm -f $dummy.c $dummy - echo powerpc-unknown-linux-gnu${LIBC} - exit 0 - ;; - esac - - if test "${UNAME_MACHINE}" = "alpha" ; then - sed 's/^ //' <<EOF >$dummy.s - .globl main - .ent main - main: - .frame $30,0,$26,0 - .prologue 0 - .long 0x47e03d80 # implver $0 - lda $2,259 - .long 0x47e20c21 # amask $2,$1 - srl $1,8,$2 - sll $2,2,$2 - sll $0,3,$0 - addl $1,$0,$0 - addl $2,$0,$0 - ret $31,($26),1 - .end main -EOF - LIBC="" - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - ./$dummy - case "$?" in - 7) - UNAME_MACHINE="alpha" - ;; - 15) - UNAME_MACHINE="alphaev5" - ;; - 14) - UNAME_MACHINE="alphaev56" - ;; - 10) - UNAME_MACHINE="alphapca56" - ;; - 16) - UNAME_MACHINE="alphaev6" - ;; - esac - - objdump --private-headers $dummy | \ - grep ld.so.1 > /dev/null - if test "$?" = 0 ; then - LIBC="libc1" - fi - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 - elif test "${UNAME_MACHINE}" = "mips" ; then - cat >$dummy.c <<EOF -#ifdef __cplusplus - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __MIPSEB__ - printf ("%s-unknown-linux-gnu\n", argv[1]); -#endif -#ifdef __MIPSEL__ - printf ("%sel-unknown-linux-gnu\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - else - # Either a pre-BFD a.out linker (linux-gnuoldld) - # or one that does not give us useful --help. - # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. - # If ld does not provide *any* "supported emulations:" - # that means it is gnuoldld. - echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" - test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 - - case "${UNAME_MACHINE}" in - i?86) - VENDOR=pc; - ;; - *) - VENDOR=unknown; - ;; - esac - # Determine whether the default compiler is a.out or elf - cat >$dummy.c <<EOF -#include <features.h> -#ifdef __cplusplus - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __ELF__ -# ifdef __GLIBC__ -# if __GLIBC__ >= 2 - printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); -# else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); -# endif -# else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); -# endif -#else - printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - fi ;; -# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions -# are messed up and put the nodename in both sysname and nodename. - i?86:DYNIX/ptx:4*:*) - echo i386-sequent-sysv4 - exit 0 ;; - i?86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit 0 ;; - i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's//MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit 0 ;; - i?86:*:5:7*) - # Fixed at (any) Pentium or better - UNAME_MACHINE=i586 - if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then - echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} - fi - exit 0 ;; - i?86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` - echo ${UNAME_MACHINE}-pc-isc$UNAME_REL - elif /bin/uname -X 2>/dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` - (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit 0 ;; - pc:*:*:*) - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit 0 ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit 0 ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit 0 ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit 0 ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit 0 ;; - M68*:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* ([0-9][0-9]).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3${OS_REL} && exit 0 - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; - m68*:LynxOS:2.*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit 0 ;; - i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit 0 ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit 0 ;; - PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says Richard.M.Bartel@ccMail.Census.GOV - echo i586-unisys-sysv4 - exit 0 ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes hewes@openmarket.com. - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit 0 ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit 0 ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit 0 ;; - news*:NEWS-OS:*:6*) - echo mips-sony-newsos6 - exit 0 ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit 0 ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit 0 ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit 0 ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit 0 ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit 0 ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit 0 ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:QNX:*:4*) - echo i386-qnx-qnx${UNAME_VERSION} - exit 0 ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -cat >$dummy.c <<EOF -#ifdef _SEQUENT_ -# include <sys/types.h> -# include <sys/utsname.h> -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include <sys/param.h> - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach ([0-9]*).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -#if !defined (ultrix) - printf ("vax-dec-bsd\n"); exit (0); -#else - printf ("vax-dec-ultrix\n"); exit (0); -#endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 -rm -f $dummy.c $dummy - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit 0 ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - c34*) - echo c34-convex-bsd - exit 0 ;; - c38*) - echo c38-convex-bsd - exit 0 ;; - c4*) - echo c4-convex-bsd - exit 0 ;; - esac -fi - -#echo '(Unable to guess system type)' 1>&2 - -exit 1 diff --git a/external/privoxy/pcre/config.h b/external/privoxy/pcre/config.h deleted file mode 100644 index c767cbb..0000000 --- a/external/privoxy/pcre/config.h +++ /dev/null @@ -1,5 +0,0 @@ - -/* For Privoxy, we just use Privoxy's config.h */ - -#include "../config.h" - diff --git a/external/privoxy/pcre/config.in b/external/privoxy/pcre/config.in deleted file mode 100644 index 02f4259..0000000 --- a/external/privoxy/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 <stddef.h> doesn't define size_t. */ - -#undef size_t - -/* The following two definitions are mainly for the benefit of SunOS4, which -doesn't have the strerror() or memmove() functions that should be present in -all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should -normally be defined with the value 1 for other systems, but unfortunately we -can't make this the default because "configure" files generated by autoconf -will only change 0 to 1; they won't change 1 to 0 if the functions are not -found. If HAVE_MEMMOVE is set to 1, the value of HAVE_BCOPY is not relevant. */ - -#define HAVE_STRERROR 0 -#define HAVE_MEMMOVE 0 -#define HAVE_BCOPY 0 - -/* End */ diff --git a/external/privoxy/pcre/config.sub b/external/privoxy/pcre/config.sub deleted file mode 100644 index 28426bb..0000000 --- a/external/privoxy/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/external/privoxy/pcre/configure b/external/privoxy/pcre/configure deleted file mode 100644 index fbd3831..0000000 --- a/external/privoxy/pcre/configure +++ /dev/null @@ -1,1568 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --disable-shared build PCRE as a static library" -ac_help="$ac_help - --enable-utf8 enable UTF8 support (incomplete)" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # The list generated by autoconf has been trimmed to remove many - # options that are totally irrelevant to PCRE (e.g. relating to X), - # or are not supported by its Makefile. - # The list generated by autoconf has been trimmed to remove many - # options that are totally irrelevant to PCRE (e.g. relating to X), - # or are not supported by its Makefile. - # The list generated by autoconf has been trimmed to remove many - # options that are totally irrelevant to PCRE (e.g. relating to X), - # or are not supported by its Makefile. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: ./configure [options] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print `checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --mandir=DIR man documentation in DIR [PREFIX/man] -EOF - cat << EOF -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[[]~#$^&*(){}\|;<>?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=dftables.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%([^/])/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - - - - -PCRE_MAJOR=3 -PCRE_MINOR=4 -PCRE_DATE=22-Aug-2000 -PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR} - - -PCRE_LIB_VERSION=0:1:0 -PCRE_POSIXLIB_VERSION=0:0:0 - - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:546: checking for $ac_word" >&5 -if eval "test "`echo '$''{'ac_cv_prog_CC'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:576: checking for $ac_word" >&5 -if eval "test "`echo '$''{'ac_cv_prog_CC'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:627: checking for $ac_word" >&5 -if eval "test "`echo '$''{'ac_cv_prog_CC'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in $PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:659: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 670 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:675: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:701: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:706: checking whether we are using GNU C" >&5 -if eval "test "`echo '$''{'ac_cv_prog_gcc'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:715: "$ac_try") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:734: checking whether ${CC-cc} accepts -g" >&5 -if eval "test "`echo '$''{'ac_cv_prog_cc_g'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:768: checking for $ac_word" >&5 -if eval "test "`echo '$''{'ac_cv_prog_RANLIB'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:798: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test "`echo '$''{'ac_cv_prog_CPP'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext <<EOF -#line 813 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:819: "$ac_try") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext <<EOF -#line 830 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:836: "$ac_try") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext <<EOF -#line 847 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:853: "$ac_try") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:878: checking for ANSI C header files" >&5 -if eval "test "`echo '$''{'ac_cv_header_stdc'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 883 "configure" -#include "confdefs.h" -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:891: "$ac_try") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext <<EOF -#line 908 "configure" -#include "confdefs.h" -#include <string.h> -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext <<EOF -#line 926 "configure" -#include "confdefs.h" -#include <stdlib.h> -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext <<EOF -#line 947 "configure" -#include "confdefs.h" -#include <ctype.h> -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:958: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -for ac_hdr in limits.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:985: checking for $ac_hdr" >&5 -if eval "test "`echo '$''{'ac_cv_header_$ac_safe'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 990 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:995: "$ac_try") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test "`echo '$ac_cv_header_'$ac_safe`" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:1024: checking for working const" >&5 -if eval "test "`echo '$''{'ac_cv_c_const'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1029 "configure" -#include "confdefs.h" - -int main() { - -/* Ultrix mips cc rejects this. */ -typedef int charset[2]; const charset x; -/* SunOS 4.1.1 cc rejects this. */ -char const *const *ccp; -char **p; -/* NEC SVR4.0.2 mips cc rejects this. */ -struct point {int x, y;}; -static struct point const zero = {0,0}; -/* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in an arm - of an if-expression whose if-part is not a constant expression */ -const char *g = "string"; -ccp = &g + (g ? g-g : 0); -/* HPUX 7.0 cc rejects these. */ -++ccp; -p = (char**) ccp; -ccp = (char const *const *) p; -{ /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; -} -{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; -} -{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; -} -{ /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if { (eval echo configure:1078: "$ac_compile") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_const=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:1099: checking for size_t" >&5 -if eval "test "`echo '$''{'ac_cv_type_size_t'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1104 "configure" -#include "confdefs.h" -#include <sys/types.h> -#if STDC_HEADERS -#include <stdlib.h> -#include <stddef.h> -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_size_t=yes -else - rm -rf conftest* - ac_cv_type_size_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_size_t" 1>&6 -if test $ac_cv_type_size_t = no; then - cat >> confdefs.h <<\EOF -#define size_t unsigned -EOF - -fi - - - -for ac_func in bcopy memmove strerror -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1136: checking for $ac_func" >&5 -if eval "test "`echo '$''{'ac_cv_func_$ac_func'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1141 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1164: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test "`echo '$ac_cv_func_'$ac_func`" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - - -LIBTOOL=./libtool -LIBSUFFIX=la -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - if test "$enableval" = "no"; then - LIBTOOL= - LIBSUFFIX=a -fi - -fi - - - -# Check whether --enable-utf8 or --disable-utf8 was given. -if test "${enable_utf8+set}" = set; then - enableval="$enable_utf8" - if test "$enableval" = "yes"; then - UTF8=-DSUPPORT_UTF8 -fi - -fi - - - - - - - - - - - - - - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\ into \, and sed turns \ into ). - sed -n \ - -e "s/'/'\\''/g" \ - -e "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1='\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*)=(.*)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS <<EOF -#! /bin/sh -# Generated automatically by configure. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running ${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec ${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "$ac_cs_usage"; exit 0 ;; - *) echo "$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir - -trap 'rm -fr `echo "Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS <<EOF - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g; - s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@CC@%$CC%g -s%@RANLIB@%$RANLIB%g -s%@CPP@%$CPP%g -s%@HAVE_MEMMOVE@%$HAVE_MEMMOVE%g -s%@HAVE_STRERROR@%$HAVE_STRERROR%g -s%@LIBTOOL@%$LIBTOOL%g -s%@LIBSUFFIX@%$LIBSUFFIX%g -s%@UTF8@%$UTF8%g -s%@PCRE_MAJOR@%$PCRE_MAJOR%g -s%@PCRE_MINOR@%$PCRE_MINOR%g -s%@PCRE_DATE@%$PCRE_DATE%g -s%@PCRE_VERSION@%$PCRE_VERSION%g -s%@PCRE_LIB_VERSION@%$PCRE_LIB_VERSION%g -s%@PCRE_POSIXLIB_VERSION@%$PCRE_POSIXLIB_VERSION%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <<EOF - -CONFIG_FILES=${CONFIG_FILES-"Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in"} -EOF -cat >> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^([ ]*)#([ ]*define[ ][ ]*)' -ac_dB='([ ][ ]*)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^([ ]*)#([ ]*)undef([ ][ ]*)' -ac_uB='([ ])%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^([ ]*)#([ ]*)undef([ ][ ]*)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <<EOF - CONFIG_HEADERS="config.h:config.in" -EOF -cat >> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\&%]/\&/g -s%[\$`]%\&%g -s%#define ([A-Za-z_][A-Za-z0-9_]*) *(.*)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF -cat >> $CONFIG_STATUS <<EOF - -EOF -cat >> $CONFIG_STATUS <<\EOF -chmod a+x RunTest pcre-config -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/external/privoxy/pcre/configure.in b/external/privoxy/pcre/configure.in deleted file mode 100644 index c98387d..0000000 --- a/external/privoxy/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/external/privoxy/pcre/dftables b/external/privoxy/pcre/dftables deleted file mode 100755 index 0e680da..0000000 Binary files a/external/privoxy/pcre/dftables and /dev/null differ diff --git a/external/privoxy/pcre/dftables.c b/external/privoxy/pcre/dftables.c deleted file mode 100644 index d572dfd..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - - Copyright (c) 1997-2000 University of Cambridge - ------------------------------------------------------------------------------ -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. ------------------------------------------------------------------------------ - -See the file Tech.Notes for some information on the internals. -*/ - - -/* This is a support program to generate the file chartables.c, containing -character tables of various kinds. They are built according to the default C -locale and used as the default tables by PCRE. Now that pcre_maketables is -a function visible to the outside world, we make use of its code from here in -order to be consistent. */ - -#include <ctype.h> -#include <stdio.h> -#include <string.h> - -#include "internal.h" - -#define DFTABLES /* maketables.c notices this */ -#include "maketables.c" - - -int main(void) -{ -int i; -unsigned const char *tables = pcre_maketables(); - -printf( - "/*************************************************\n" - "* Perl-Compatible Regular Expressions *\n" - "*************************************************/\n\n" - "/* This file is automatically written by the dftables auxiliary \n" - "program. If you edit it by hand, you might like to edit the Makefile to \n" - "prevent its ever being regenerated.\n\n" - "This file is #included in the compilation of pcre.c to build the default\n" - "character tables which are used when no tables are passed to the compile\n" - "function. */\n\n" - "static unsigned char pcre_default_tables[] = {\n\n" - "/* This table is a lower casing table. */\n\n"); - -printf(" "); -for (i = 0; i < 256; i++) - { - if ((i & 7) == 0 && i != 0) printf("\n "); - printf("%3d", *tables++); - if (i != 255) printf(","); - } -printf(",\n\n"); - -printf("/* This table is a case flipping table. */\n\n"); - -printf(" "); -for (i = 0; i < 256; i++) - { - if ((i & 7) == 0 && i != 0) printf("\n "); - printf("%3d", *tables++); - if (i != 255) printf(","); - } -printf(",\n\n"); - -printf( - "/* This table contains bit maps for various character classes.\n" - "Each map is 32 bytes long and the bits run from the least\n" - "significant end of each byte. The classes that have their own\n" - "maps are: space, xdigit, digit, upper, lower, word, graph\n" - "print, punct, and cntrl. Other classes are built from combinations. */\n\n"); - -printf(" "); -for (i = 0; i < cbit_length; i++) - { - if ((i & 7) == 0 && i != 0) - { - if ((i & 31) == 0) printf("\n"); - printf("\n "); - } - printf("0x%02x", *tables++); - if (i != cbit_length - 1) printf(","); - } -printf(",\n\n"); - -printf( - "/* This table identifies various classes of character by individual bits:\n" - " 0x%02x white space character\n" - " 0x%02x letter\n" - " 0x%02x decimal digit\n" - " 0x%02x hexadecimal digit\n" - " 0x%02x alphanumeric or '_'\n" - " 0x%02x regular expression metacharacter or binary zero\n*/\n\n", - ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word, - ctype_meta); - -printf(" "); -for (i = 0; i < 256; i++) - { - if ((i & 7) == 0 && i != 0) - { - printf(" /* "); - if (isprint(i-8)) printf(" %c -", i-8); - else printf("%3d-", i-8); - if (isprint(i-1)) printf(" %c ", i-1); - else printf("%3d", i-1); - printf(" */\n "); - } - printf("0x%02x", *tables++); - if (i != 255) printf(","); - } - -printf("};/* "); -if (isprint(i-8)) printf(" %c -", i-8); - else printf("%3d-", i-8); -if (isprint(i-1)) printf(" %c ", i-1); - else printf("%3d", i-1); -printf(" */\n\n/* End of chartables.c */\n"); - -return 0; -} - -/* End of dftables.c */ diff --git a/external/privoxy/pcre/dll.mk b/external/privoxy/pcre/dll.mk deleted file mode 100644 index d8b728e..0000000 --- a/external/privoxy/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/external/privoxy/pcre/doc/ChangeLog b/external/privoxy/pcre/doc/ChangeLog deleted file mode 100644 index 2133dd7..0000000 --- a/external/privoxy/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 - $(?<! negative lookbehind - (?imsx-imsx) added the unsetting capability - such a setting is global if at outer level; local otherwise - (?imsx-imsx:) non-capturing groups with option setting - (?(cond)re|re) conditional pattern matching - - A backreference to itself in a repeated group matches the previous - captured string. - -8. General tidying up of studying (both automatic and via "study") -consequential on the addition of new assertions. - -9. As in 5.005, unlimited repeated groups that could match an empty substring -are no longer faulted at compile time. Instead, the loop is forcibly broken at -runtime if any iteration does actually match an empty substring. - -10. Include the RunTest script in the distribution. - -11. Added tests from the Perl 5.005_02 distribution. This showed up a few -discrepancies, some of which were old and were also with respect to 5.004. They -have now been fixed. - - -Version 1.09 28-Apr-98 ----------------------- - -1. A negated single character class followed by a quantifier with a minimum -value of one (e.g. [^x]{1,6} ) was not compiled correctly. This could lead to -program crashes, or just wrong answers. This did not apply to negated classes -containing more than one character, or to minima other than one. - - -Version 1.08 27-Mar-98 ----------------------- - -1. Add PCRE_UNGREEDY to invert the greediness of quantifiers. - -2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The -latter must appear before anything that relies on it in the pattern. - - -Version 1.07 16-Feb-98 ----------------------- - -1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited -repeat of a potentially empty string). - - -Version 1.06 23-Jan-98 ----------------------- - -1. Added Markus Oberhumer's little patches for C++. - -2. Literal strings longer than 255 characters were broken. - - -Version 1.05 23-Dec-97 ----------------------- - -1. Negated character classes containing more than one character were failing if -PCRE_CASELESS was set at run time. - - -Version 1.04 19-Dec-97 ----------------------- - -1. Corrected the man page, where some "const" qualifiers had been omitted. - -2. Made debugging output print "{0,xxx}" instead of just "{,xxx}" to agree with -input syntax. - -3. Fixed memory leak which occurred when a regex with back references was -matched with an offsets vector that wasn't big enough. The temporary memory -that is used in this case wasn't being freed if the match failed. - -4. Tidied pcretest to ensure it frees memory that it gets. - -5. Temporary memory was being obtained in the case where the passed offsets -vector was exactly big enough. - -6. Corrected definition of offsetof() from change 5 below. - -7. I had screwed up change 6 below and broken the rules for the use of -setjmp(). Now fixed. - - -Version 1.03 18-Dec-97 ----------------------- - -1. A erroneous regex with a missing opening parenthesis was correctly -diagnosed, but PCRE attempted to access brastack[-1], which could cause crashes -on some systems. - -2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because -it was reported that one broken compiler failed on the former because "code" is -also an independent variable. - -3. The erroneous regex a[]b caused an array overrun reference. - -4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not -fail on data ending with that character. (It was going on too far, and checking -the next character, typically a binary zero.) This was specific to the -optimized code for single-character negative classes. - -5. Added a contributed patch from the TIN world which does the following: - - + Add an undef for memmove, in case the the system defines a macro for it. - - + Add a definition of offsetof(), in case there isn't one. (I don't know - the reason behind this - offsetof() is part of the ANSI standard - but - it does no harm). - - + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating - most of the places where whitespace preceded '#'. I have given up and - allowed the remaining 2 cases to be at the margin. - - + Rename some variables in pcre to eliminate shadowing. This seems very - pedantic, but does no harm, of course. - -6. Moved the call to setjmp() into its own function, to get rid of warnings -from gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used. - -7. Constructs such as \d{8,} were compiling into the equivalent of -\d{8}\d{0,65527} instead of \d{8}\d* which didn't make much difference to the -outcome, but in this particular case used more store than had been allocated, -which caused the bug to be discovered because it threw up an internal error. - -8. The debugging code in both pcre and pcretest for outputting the compiled -form of a regex was going wrong in the case of back references followed by -curly-bracketed repeats. - - -Version 1.02 12-Dec-97 ----------------------- - -1. Typos in pcre.3 and comments in the source fixed. - -2. Applied a contributed patch to get rid of places where it used to remove -'const' from variables, and fixed some signed/unsigned and uninitialized -variable warnings. - -3. Added the "runtest" target to Makefile. - -4. Set default compiler flag to -O2 rather than just -O. - - -Version 1.01 19-Nov-97 ----------------------- - -1. PCRE was failing to diagnose unlimited repeat of empty string for patterns -like /([ab]*)*/, that is, for classes with more than one character in them. - -2. Likewise, it wasn't diagnosing patterns with "once-only" subpatterns, such -as /((?>a*))*/ (a PCRE_EXTRA facility). - - -Version 1.00 18-Nov-97 ----------------------- - -1. Added compile-time macros to support systems such as SunOS4 which don't have -memmove() or strerror() but have other things that can be used instead. - -2. Arranged that "make clean" removes the executables. - - -Version 0.99 27-Oct-97 ----------------------- - -1. Fixed bug in code for optimizing classes with only one character. It was -initializing a 32-byte map regardless, which could cause it to run off the end -of the memory it had got. - -2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. - - -Version 0.98 22-Oct-97 ----------------------- - -1. Fixed bug in code for handling temporary memory usage when there are more -back references than supplied space in the ovector. This could cause segfaults. - - -Version 0.97 21-Oct-97 ----------------------- - -1. Added the \X "cut" facility, conditional on PCRE_EXTRA. - -2. Optimized negated single characters not to use a bit map. - -3. Brought error texts together as macro definitions; clarified some of them; -fixed one that was wrong - it said "range out of order" when it meant "invalid -escape sequence". - -4. Changed some char * arguments to const char *. - -5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). - -6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in -pcretest. - - -Version 0.96 16-Oct-97 ----------------------- - -1. Added a simple "pgrep" utility to the distribution. - -2. Fixed an incompatibility with Perl: "{" is now treated as a normal character -unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" -where "ddd" means "one or more decimal digits". - -3. Fixed serious bug. If a pattern had a back reference, but the call to -pcre_exec() didn't supply a large enough ovector to record the related -identifying subpattern, the match always failed. PCRE now remembers the number -of the largest back reference, and gets some temporary memory in which to save -the offsets during matching if necessary, in order to ensure that -backreferences always work. - -4. Increased the compatibility with Perl in a number of ways: - - (a) . no longer matches \n by default; an option PCRE_DOTALL is provided - to request this handling. The option can be set at compile or exec time. - - (b) $ matches before a terminating newline by default; an option - PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline - mode). The option can be set at compile or exec time. - - (c) The handling of \ followed by a digit other than 0 is now supposed to be - the same as Perl's. If the decimal number it represents is less than 10 - or there aren't that many previous left capturing parentheses, an octal - escape is read. Inside a character class, it's always an octal escape, - even if it is a single digit. - - (d) An escaped but undefined alphabetic character is taken as a literal, - unless PCRE_EXTRA is set. Currently this just reserves the remaining - escapes. - - (e) {0} is now permitted. (The previous item is removed from the compiled - pattern). - -5. Changed all the names of code files so that the basic parts are no longer -than 10 characters, and abolished the teeny "globals.c" file. - -6. Changed the handling of character classes; they are now done with a 32-byte -bit map always. - -7. Added the -d and /D options to pcretest to make it possible to look at the -internals of compilation without having to recompile pcre. - - -Version 0.95 23-Sep-97 ----------------------- - -1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or -\x20 at the start of a run of normal characters. These were being treated as -real characters, instead of the source characters being re-checked. - - -Version 0.94 18-Sep-97 ----------------------- - -1. The functions are now thread-safe, with the caveat that the global variables -containing pointers to malloc() and free() or alternative functions are the -same for all threads. - -2. Get pcre_study() to generate a bitmap of initial characters for non- -anchored patterns when this is possible, and use it if passed to pcre_exec(). - - -Version 0.93 15-Sep-97 ----------------------- - -1. /(b)|(:+)/ was computing an incorrect first character. - -2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), -but not actually doing anything yet. - -3. Treat "-" characters in classes that cannot be part of ranges as literals, -as Perl does (e.g. [-az] or [az-]). - -4. Set the anchored flag if a branch starts with .* or .*? because that tests -all possible positions. - -5. Split up into different modules to avoid including unneeded functions in a -compiled binary. However, compile and exec are still in one module. The "study" -function is split off. - -6. The character tables are now in a separate module whose source is generated -by an auxiliary program - but can then be edited by hand if required. There are -now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or -toupper() in the code. - -7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and -make them global. Abolish the function for setting them, as the caller can now -set them directly. - - -Version 0.92 11-Sep-97 ----------------------- - -1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character -(e.g. /a{1,3}/) was broken (I mis-optimized it). - -2. Caseless matching was not working in character classes if the characters in -the pattern were in upper case. - -3. Make ranges like [W-c] work in the same way as Perl for caseless matching. - -4. Make PCRE_ANCHORED public and accept as a compile option. - -5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and -PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to -pass them. - -6. Give an error if bad option bits passed at compile or run time. - -7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to -pcretest to cause it to pass that flag. - -8. Add pcre_info(), to get the number of identifying subpatterns, the stored -options, and the first character, if set. - -9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. - - -Version 0.91 10-Sep-97 ----------------------- - -1. PCRE was failing to diagnose unlimited repeats of subpatterns that could -match the empty string as in /(a*)*/. It was looping and ultimately crashing. - -2. PCRE was looping on encountering an indefinitely repeated back reference to -a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what -Perl does - treats the match as successful. - -**** diff --git a/external/privoxy/pcre/doc/NON-UNIX-USE b/external/privoxy/pcre/doc/NON-UNIX-USE deleted file mode 100644 index 09a7432..0000000 --- a/external/privoxy/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/external/privoxy/pcre/doc/Tech.Notes b/external/privoxy/pcre/doc/Tech.Notes deleted file mode 100644 index 7b96e5b..0000000 --- a/external/privoxy/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/external/privoxy/pcre/doc/authors b/external/privoxy/pcre/doc/authors deleted file mode 100644 index bfe1b5d..0000000 --- a/external/privoxy/pcre/doc/authors +++ /dev/null @@ -1,6 +0,0 @@ -Written by: Philip Hazel ph10@cam.ac.uk - -University of Cambridge Computing Service, -Cambridge, England. Phone: +44 1223 334714. - -Copyright (c) 1997-2000 University of Cambridge diff --git a/external/privoxy/pcre/doc/copying b/external/privoxy/pcre/doc/copying deleted file mode 100644 index 34d20db..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - -University of Cambridge Computing Service, -Cambridge, England. Phone: +44 1223 334714. - -Copyright (c) 1997-2000 University of Cambridge - -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. In practice, this means that if you use - PCRE in software which you distribute to others, commercially or - otherwise, you must put a sentence like this - - Regular expression support is provided by the PCRE library package, - which is open source software, written by Philip Hazel, and copyright - by the University of Cambridge, England. - - somewhere reasonably visible in your documentation and in any relevant - files or online help data or similar. A reference to the ftp site for - the source, that is, to - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ - - should also be given in the documentation. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. - -End diff --git a/external/privoxy/pcre/doc/news b/external/privoxy/pcre/doc/news deleted file mode 100644 index 56fccdf..0000000 --- a/external/privoxy/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/external/privoxy/pcre/doc/pcre.3 b/external/privoxy/pcre/doc/pcre.3 deleted file mode 100644 index bb812f4..0000000 --- a/external/privoxy/pcre/doc/pcre.3 +++ /dev/null @@ -1,1810 +0,0 @@ -.TH PCRE 3 -.SH NAME -pcre - Perl-compatible regular expressions. -.SH SYNOPSIS -.B #include <pcre.h> -.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 (?<! 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 \fInot\fR 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. - - -.SH 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. - - -.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 ph10@cam.ac.uk -.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/external/privoxy/pcre/doc/pcre.html b/external/privoxy/pcre/doc/pcre.html deleted file mode 100644 index b12b212..0000000 --- a/external/privoxy/pcre/doc/pcre.html +++ /dev/null @@ -1,2397 +0,0 @@ -<HTML> -<HEAD> -<TITLE>pcre specification</TITLE> -</HEAD> -<body bgcolor="#FFFFFF" text="#00005A"> -<H1>pcre specification</H1> -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. -<UL> -<LI><A NAME="TOC1" HREF="#SEC1">NAME</A> -<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A> -<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A> -<LI><A NAME="TOC4" HREF="#SEC4">MULTI-THREADING</A> -<LI><A NAME="TOC5" HREF="#SEC5">COMPILING A PATTERN</A> -<LI><A NAME="TOC6" HREF="#SEC6">STUDYING A PATTERN</A> -<LI><A NAME="TOC7" HREF="#SEC7">LOCALE SUPPORT</A> -<LI><A NAME="TOC8" HREF="#SEC8">INFORMATION ABOUT A PATTERN</A> -<LI><A NAME="TOC9" HREF="#SEC9">MATCHING A PATTERN</A> -<LI><A NAME="TOC10" HREF="#SEC10">EXTRACTING CAPTURED SUBSTRINGS</A> -<LI><A NAME="TOC11" HREF="#SEC11">LIMITATIONS</A> -<LI><A NAME="TOC12" HREF="#SEC12">DIFFERENCES FROM PERL</A> -<LI><A NAME="TOC13" HREF="#SEC13">REGULAR EXPRESSION DETAILS</A> -<LI><A NAME="TOC14" HREF="#SEC14">BACKSLASH</A> -<LI><A NAME="TOC15" HREF="#SEC15">CIRCUMFLEX AND DOLLAR</A> -<LI><A NAME="TOC16" HREF="#SEC16">FULL STOP (PERIOD, DOT)</A> -<LI><A NAME="TOC17" HREF="#SEC17">SQUARE BRACKETS</A> -<LI><A NAME="TOC18" HREF="#SEC18">POSIX CHARACTER CLASSES</A> -<LI><A NAME="TOC19" HREF="#SEC19">VERTICAL BAR</A> -<LI><A NAME="TOC20" HREF="#SEC20">INTERNAL OPTION SETTING</A> -<LI><A NAME="TOC21" HREF="#SEC21">SUBPATTERNS</A> -<LI><A NAME="TOC22" HREF="#SEC22">REPETITION</A> -<LI><A NAME="TOC23" HREF="#SEC23">BACK REFERENCES</A> -<LI><A NAME="TOC24" HREF="#SEC24">ASSERTIONS</A> -<LI><A NAME="TOC25" HREF="#SEC25">ONCE-ONLY SUBPATTERNS</A> -<LI><A NAME="TOC26" HREF="#SEC26">CONDITIONAL SUBPATTERNS</A> -<LI><A NAME="TOC27" HREF="#SEC27">COMMENTS</A> -<LI><A NAME="TOC28" HREF="#SEC28">RECURSIVE PATTERNS</A> -<LI><A NAME="TOC29" HREF="#SEC29">PERFORMANCE</A> -<LI><A NAME="TOC30" HREF="#SEC30">UTF-8 SUPPORT</A> -<LI><A NAME="TOC31" HREF="#SEC31">AUTHOR</A> -</UL> -<LI><A NAME="SEC1" HREF="#TOC1">NAME</A> -<P> -pcre - Perl-compatible regular expressions. -</P> -<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A> -<P> -<B>#include <pcre.h></B> -</P> -<P> -<B>pcre *pcre_compile(const char *<I>pattern</I>, int <I>options</I>,</B> -<B>const char **<I>errptr</I>, int *<I>erroffset</I>,</B> -<B>const unsigned char *<I>tableptr</I>);</B> -</P> -<P> -<B>pcre_extra *pcre_study(const pcre *<I>code</I>, int <I>options</I>,</B> -<B>const char **<I>errptr</I>);</B> -</P> -<P> -<B>int pcre_exec(const pcre *<I>code</I>, const pcre_extra *<I>extra</I>,</B> -<B>const char *<I>subject</I>, int <I>length</I>, int <I>startoffset</I>,</B> -<B>int <I>options</I>, int *<I>ovector</I>, int <I>ovecsize</I>);</B> -</P> -<P> -<B>int pcre_copy_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B> -<B>int <I>stringcount</I>, int <I>stringnumber</I>, char *<I>buffer</I>,</B> -<B>int <I>buffersize</I>);</B> -</P> -<P> -<B>int pcre_get_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B> -<B>int <I>stringcount</I>, int <I>stringnumber</I>,</B> -<B>const char **<I>stringptr</I>);</B> -</P> -<P> -<B>int pcre_get_substring_list(const char *<I>subject</I>,</B> -<B>int *<I>ovector</I>, int <I>stringcount</I>, const char ***<I>listptr</I>);</B> -</P> -<P> -<B>void pcre_free_substring(const char *<I>stringptr</I>);</B> -</P> -<P> -<B>void pcre_free_substring_list(const char **<I>stringptr</I>);</B> -</P> -<P> -<B>const unsigned char *pcre_maketables(void);</B> -</P> -<P> -<B>int pcre_fullinfo(const pcre *<I>code</I>, const pcre_extra *<I>extra</I>,</B> -<B>int <I>what</I>, void *<I>where</I>);</B> -</P> -<P> -<B>int pcre_info(const pcre *<I>code</I>, int *<I>optptr</I>, int</B> -<B>*<I>firstcharptr</I>);</B> -</P> -<P> -<B>char *pcre_version(void);</B> -</P> -<P> -<B>void *(*pcre_malloc)(size_t);</B> -</P> -<P> -<B>void (*pcre_free)(void *);</B> -</P> -<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A> -<P> -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. -</P> -<P> -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 <B>pcreposix</B> documentation. -</P> -<P> -The native API function prototypes are defined in the header file <B>pcre.h</B>, -and on Unix systems the library itself is called <B>libpcre.a</B>, so can be -accessed by adding <B>-lpcre</B> 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. -</P> -<P> -The functions <B>pcre_compile()</B>, <B>pcre_study()</B>, and <B>pcre_exec()</B> -are used for compiling and matching regular expressions. -</P> -<P> -The functions <B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and -<B>pcre_get_substring_list()</B> are convenience functions for extracting -captured substrings from a matched subject string; <B>pcre_free_substring()</B> -and <B>pcre_free_substring_list()</B> are also provided, to free the memory used -for extracted strings. -</P> -<P> -The function <B>pcre_maketables()</B> is used (optionally) to build a set of -character tables in the current locale for passing to <B>pcre_compile()</B>. -</P> -<P> -The function <B>pcre_fullinfo()</B> is used to find out information about a -compiled pattern; <B>pcre_info()</B> is an obsolete version which returns only -some of the available information, but is retained for backwards compatibility. -The function <B>pcre_version()</B> returns a pointer to a string containing the -version of PCRE and its date of release. -</P> -<P> -The global variables <B>pcre_malloc</B> and <B>pcre_free</B> initially contain -the entry points of the standard <B>malloc()</B> and <B>free()</B> 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. -</P> -<LI><A NAME="SEC4" HREF="#TOC1">MULTI-THREADING</A> -<P> -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by <B>pcre_malloc</B> -and <B>pcre_free</B> are shared by all threads. -</P> -<P> -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. -</P> -<LI><A NAME="SEC5" HREF="#TOC1">COMPILING A PATTERN</A> -<P> -The function <B>pcre_compile()</B> 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 <I>pattern</I>. A pointer to a single block of memory -that is obtained via <B>pcre_malloc</B> is returned. This contains the -compiled code and related data. The <B>pcre</B> type is defined for this for -convenience, but in fact <B>pcre</B> is just a typedef for <B>void</B>, 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. -</P> -<P> -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. -</P> -<P> -The <I>options</I> 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 <I>options</I> 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. -</P> -<P> -If <I>errptr</I> is NULL, <B>pcre_compile()</B> returns NULL immediately. -Otherwise, if compilation of a pattern fails, <B>pcre_compile()</B> returns -NULL, and sets the variable pointed to by <I>errptr</I> 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 -<I>erroffset</I>, which must not be NULL. If it is, an immediate error is given. -</P> -<P> -If the final argument, <I>tableptr</I>, is NULL, PCRE uses a default set of -character tables which are built when it is compiled, using the default C -locale. Otherwise, <I>tableptr</I> must be the result of a call to -<B>pcre_maketables()</B>. See the section on locale support below. -</P> -<P> -The following option bits are defined in the header file: -</P> -<P> -<PRE> - PCRE_ANCHORED -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_CASELESS -</PRE> -</P> -<P> -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option. -</P> -<P> -<PRE> - PCRE_DOLLAR_ENDONLY -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_DOTALL -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_EXTENDED -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_EXTRA -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_MULTILINE -</PRE> -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_UNGREEDY -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_UTF8 -</PRE> -</P> -<P> -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. -</P> -<LI><A NAME="SEC6" HREF="#TOC1">STUDYING A PATTERN</A> -<P> -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 <B>pcre_study()</B> takes a pointer to a compiled pattern as its first -argument, and returns a pointer to a <B>pcre_extra</B> block (another <B>void</B> -typedef) containing additional information about the pattern; this can be -passed to <B>pcre_exec()</B>. If no additional information is available, NULL -is returned. -</P> -<P> -The second argument contains option bits. At present, no options are defined -for <B>pcre_study()</B>, and this argument should always be zero. -</P> -<P> -The third argument for <B>pcre_study()</B> 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. -</P> -<P> -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. -</P> -<LI><A NAME="SEC7" HREF="#TOC1">LOCALE SUPPORT</A> -<P> -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 <B>pcre_compile()</B> is NULL, -and is sufficient for many applications. -</P> -<P> -An alternative set of tables can, however, be supplied. Such tables are built -by calling the <B>pcre_maketables()</B> function, which has no arguments, in the -relevant locale. The result can then be passed to <B>pcre_compile()</B> 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: -</P> -<P> -<PRE> - setlocale(LC_CTYPE, "fr"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); -</PRE> -</P> -<P> -The tables are built in memory that is obtained via <B>pcre_malloc</B>. The -pointer that is passed to <B>pcre_compile</B> is saved with the compiled -pattern, and the same tables are used via this pointer by <B>pcre_study()</B> -and <B>pcre_exec()</B>. 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. -</P> -<LI><A NAME="SEC8" HREF="#TOC1">INFORMATION ABOUT A PATTERN</A> -<P> -The <B>pcre_fullinfo()</B> function returns information about a compiled -pattern. It replaces the obsolete <B>pcre_info()</B> function, which is -nevertheless retained for backwards compability (and is documented below). -</P> -<P> -The first argument for <B>pcre_fullinfo()</B> is a pointer to the compiled -pattern. The second argument is the result of <B>pcre_study()</B>, 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: -</P> -<P> -<PRE> - PCRE_ERROR_NULL the argument <I>code</I> was NULL - the argument <I>where</I> was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADOPTION the value of <I>what</I> was invalid -</PRE> -</P> -<P> -The possible values for the third argument are defined in <B>pcre.h</B>, and are -as follows: -</P> -<P> -<PRE> - PCRE_INFO_OPTIONS -</PRE> -</P> -<P> -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to au <B>unsigned long int</B> variable. These option bits -are those specified in the call to <B>pcre_compile()</B>, 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. -</P> -<P> -<PRE> - PCRE_INFO_SIZE -</PRE> -</P> -<P> -Return the size of the compiled pattern, that is, the value that was passed as -the argument to <B>pcre_malloc()</B> when PCRE was getting memory in which to -place the compiled data. The fourth argument should point to a <B>size_t</B> -variable. -</P> -<P> -<PRE> - PCRE_INFO_CAPTURECOUNT -</PRE> -</P> -<P> -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an \fbint\fR variable. -</P> -<P> -<PRE> - PCRE_INFO_BACKREFMAX -</PRE> -</P> -<P> -Return the number of the highest back reference in the pattern. The fourth -argument should point to an <B>int</B> variable. Zero is returned if there are -no back references. -</P> -<P> -<PRE> - PCRE_INFO_FIRSTCHAR -</PRE> -</P> -<P> -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 -<I>where</I>. Otherwise, if either -</P> -<P> -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -</P> -<P> -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -</P> -<P> --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. -</P> -<P> -<PRE> - PCRE_INFO_FIRSTTABLE -</PRE> -</P> -<P> -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 <B>unsigned char *</B> -variable. -</P> -<P> -<PRE> - PCRE_INFO_LASTLITERAL -</PRE> -</P> -<P> -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 <B>int</B> 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'. -</P> -<P> -The <B>pcre_info()</B> function is now obsolete because its interface is too -restrictive to return all the available data about a compiled pattern. New -programs should use <B>pcre_fullinfo()</B> instead. The yield of -<B>pcre_info()</B> is the number of capturing subpatterns, or one of the -following negative numbers: -</P> -<P> -<PRE> - PCRE_ERROR_NULL the argument <I>code</I> was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found -</PRE> -</P> -<P> -If the <I>optptr</I> 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). -</P> -<P> -If the pattern is not anchored and the <I>firstcharptr</I> argument is not NULL, -it is used to pass back information about the first character of any matched -string (see PCRE_INFO_FIRSTCHAR above). -</P> -<LI><A NAME="SEC9" HREF="#TOC1">MATCHING A PATTERN</A> -<P> -The function <B>pcre_exec()</B> is called to match a subject string against a -pre-compiled pattern, which is passed in the <I>code</I> argument. If the -pattern has been studied, the result of the study should be passed in the -<I>extra</I> argument. Otherwise this must be NULL. -</P> -<P> -The PCRE_ANCHORED option can be passed in the <I>options</I> 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. -</P> -<P> -There are also three further options that can be set only at matching time: -</P> -<P> -<PRE> - PCRE_NOTBOL -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_NOTEOL -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_NOTEMPTY -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - a?b? -</PRE> -</P> -<P> -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". -</P> -<P> -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 <B>split()</B> 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. -</P> -<P> -The subject string is passed as a pointer in <I>subject</I>, a length in -<I>length</I>, and a starting offset in <I>startoffset</I>. 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. -</P> -<P> -A non-zero starting offset is useful when searching for another match in the -same subject by calling <B>pcre_exec()</B> again after a previous success. -Setting <I>startoffset</I> 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 -</P> -<P> -<PRE> - \Biss\B -</PRE> -</P> -<P> -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 <B>pcre_exec()</B> finds the first -occurrence. If <B>pcre_exec()</B> 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 -<B>pcre_exec()</B> is passed the entire string again, but with <I>startoffset</I> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -Captured substrings are returned to the caller via a vector of integer offsets -whose address is passed in <I>ovector</I>. The number of elements in the vector -is passed in <I>ovecsize</I>. 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 <B>pcre_exec()</B> while -matching capturing subpatterns, and is not available for passing back -information. The length passed in <I>ovecsize</I> should always be a multiple of -three. If it is not, it is rounded down. -</P> -<P> -When a match has been successful, information about captured substrings is -returned in pairs of integers, starting at the beginning of <I>ovector</I>, 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, <I>ovector[0]</I> and <I>ovector[1]</I>, 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 <B>pcre_exec()</B> -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. -</P> -<P> -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described in the following section. -</P> -<P> -It is possible for an capturing subpattern number <I>n+1</I> to match some -part of the subject when subpattern <I>n</I> 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. -</P> -<P> -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that gets returned. -</P> -<P> -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, -<B>pcre_exec()</B> may be called with <I>ovector</I> passed as NULL and -<I>ovecsize</I> as zero. However, if the pattern contains back references and -the <I>ovector</I> 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 <I>ovector</I>. -</P> -<P> -Note that <B>pcre_info()</B> can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -<I>ovector</I> that will allow for <I>n</I> captured substrings in addition to -the offsets of the substring matched by the whole pattern is (<I>n</I>+1)*3. -</P> -<P> -If <B>pcre_exec()</B> fails, it returns a negative number. The following are -defined in the header file: -</P> -<P> -<PRE> - PCRE_ERROR_NOMATCH (-1) -</PRE> -</P> -<P> -The subject string did not match the pattern. -</P> -<P> -<PRE> - PCRE_ERROR_NULL (-2) -</PRE> -</P> -<P> -Either <I>code</I> or <I>subject</I> was passed as NULL, or <I>ovector</I> was -NULL and <I>ovecsize</I> was not zero. -</P> -<P> -<PRE> - PCRE_ERROR_BADOPTION (-3) -</PRE> -</P> -<P> -An unrecognized bit was set in the <I>options</I> argument. -</P> -<P> -<PRE> - PCRE_ERROR_BADMAGIC (-4) -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_ERROR_UNKNOWN_NODE (-5) -</PRE> -</P> -<P> -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. -</P> -<P> -<PRE> - PCRE_ERROR_NOMEMORY (-6) -</PRE> -</P> -<P> -If a pattern contains back references, but the <I>ovector</I> that is passed to -<B>pcre_exec()</B> 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 <B>pcre_malloc()</B> fails, this error is given. The memory is freed at -the end of matching. -</P> -<LI><A NAME="SEC10" HREF="#TOC1">EXTRACTING CAPTURED SUBSTRINGS</A> -<P> -Captured substrings can be accessed directly by using the offsets returned by -<B>pcre_exec()</B> in <I>ovector</I>. For convenience, the functions -<B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and -<B>pcre_get_substring_list()</B> 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. -</P> -<P> -The first three arguments are the same for all three functions: <I>subject</I> -is the subject string which has just been successfully matched, <I>ovector</I> -is a pointer to the vector of integer offsets that was passed to -<B>pcre_exec()</B>, and <I>stringcount</I> 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 <B>pcre_exec</B> if it -is greater than zero. If <B>pcre_exec()</B> returned zero, indicating that it -ran out of space in <I>ovector</I>, the value passed as <I>stringcount</I> should -be the size of the vector divided by three. -</P> -<P> -The functions <B>pcre_copy_substring()</B> and <B>pcre_get_substring()</B> -extract a single substring, whose number is given as <I>stringnumber</I>. A -value of zero extracts the substring that matched the entire pattern, while -higher values extract the captured substrings. For <B>pcre_copy_substring()</B>, -the string is placed in <I>buffer</I>, whose length is given by -<I>buffersize</I>, while for <B>pcre_get_substring()</B> a new block of memory is -obtained via <B>pcre_malloc</B>, and its address is returned via -<I>stringptr</I>. The yield of the function is the length of the string, not -including the terminating zero, or one of -</P> -<P> -<PRE> - PCRE_ERROR_NOMEMORY (-6) -</PRE> -</P> -<P> -The buffer was too small for <B>pcre_copy_substring()</B>, or the attempt to get -memory failed for <B>pcre_get_substring()</B>. -</P> -<P> -<PRE> - PCRE_ERROR_NOSUBSTRING (-7) -</PRE> -</P> -<P> -There is no substring whose number is <I>stringnumber</I>. -</P> -<P> -The <B>pcre_get_substring_list()</B> 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 <B>pcre_malloc</B>. The address of the memory block -is returned via <I>listptr</I>, 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 -</P> -<P> -<PRE> - PCRE_ERROR_NOMEMORY (-6) -</PRE> -</P> -<P> -if the attempt to get the memory block failed. -</P> -<P> -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number <I>n+1</I> matches some part of the -subject, but subpattern <I>n</I> 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 <I>ovector</I>, which is negative for unset -substrings. -</P> -<P> -The two convenience functions <B>pcre_free_substring()</B> and -<B>pcre_free_substring_list()</B> can be used to free the memory returned by -a previous call of <B>pcre_get_substring()</B> or -<B>pcre_get_substring_list()</B>, respectively. They do nothing more than call -the function pointed to by <B>pcre_free</B>, 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 -<B>pcre_free</B> directly; it is for these cases that the functions are -provided. -</P> -<LI><A NAME="SEC11" HREF="#TOC1">LIMITATIONS</A> -<P> -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. -</P> -<P> -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. -</P> -<LI><A NAME="SEC12" HREF="#TOC1">DIFFERENCES FROM PERL</A> -<P> -The differences described here are with respect to Perl 5.005. -</P> -<P> -1. By default, a whitespace character is any character that the C library -function <B>isspace()</B> recognizes, though it is possible to compile PCRE with -alternative character type tables. Normally <B>isspace()</B> 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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -6. The Perl \G assertion is not supported as it is not relevant to single -pattern matches. -</P> -<P> -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). -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -10. PCRE provides some extensions to the Perl regular expression facilities: -</P> -<P> -(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. -</P> -<P> -(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. -</P> -<P> -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. -</P> -<P> -(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. -</P> -<P> -(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start -of the subject. -</P> -<P> -(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for -<B>pcre_exec()</B> have no Perl equivalents. -</P> -<P> -(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.) -</P> -<LI><A NAME="SEC13" HREF="#TOC1">REGULAR EXPRESSION DETAILS</A> -<P> -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. -</P> -<P> -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 <B>pcre_compile()</B> with the -PCRE_UTF8 option. How this affects the pattern matching is described in the -final section of this document. -</P> -<P> -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 -</P> -<P> -<PRE> - The quick brown fox -</PRE> -</P> -<P> -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 -<I>meta-characters</I>, which do not stand for themselves but instead are -interpreted in some special way. -</P> -<P> -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: -</P> -<P> -<PRE> - \ 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 -</PRE> -</P> -<P> -Part of a pattern that is in square brackets is called a "character class". In -a character class the only meta-characters are: -</P> -<P> -<PRE> - \ general escape character - ^ negate the class, but only if the first character - - indicates character range - ] terminates the character class -</PRE> -</P> -<P> -The following sections describe the use of each of the meta-characters. -</P> -<LI><A NAME="SEC14" HREF="#TOC1">BACKSLASH</A> -<P> -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. -</P> -<P> -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 "\". -</P> -<P> -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. -</P> -<P> -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: -</P> -<P> -<PRE> - \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 -</PRE> -</P> -<P> -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. -</P> -<P> -After "\x", up to two hexadecimal digits are read (letters can be in upper or -lower case). -</P> -<P> -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. -</P> -<P> -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 <I>back reference</I>. A description of how this works is given -later, following the discussion of parenthesized subpatterns. -</P> -<P> -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: -</P> -<P> -<PRE> - \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" -</PRE> -</P> -<P> -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. -</P> -<P> -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). -</P> -<P> -The third use of backslash is for specifying generic character types: -</P> -<P> -<PRE> - \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 -</PRE> -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - \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) -</PRE> -</P> -<P> -These assertions may not appear in character classes (but note that "\b" has a -different meaning, namely the backspace character, inside a character class). -</P> -<P> -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. -</P> -<P> -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 <I>startoffset</I> argument of -<B>pcre_exec()</B> 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. -</P> -<LI><A NAME="SEC15" HREF="#TOC1">CIRCUMFLEX AND DOLLAR</A> -<P> -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 <I>startoffset</I> argument of -<B>pcre_exec()</B> is non-zero, circumflex can never match. Inside a character -class, circumflex has an entirely different meaning (see below). -</P> -<P> -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.) -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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 <I>startoffset</I> argument of -<B>pcre_exec()</B> is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if -PCRE_MULTILINE is set. -</P> -<P> -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. -</P> -<LI><A NAME="SEC16" HREF="#TOC1">FULL STOP (PERIOD, DOT)</A> -<P> -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. -</P> -<LI><A NAME="SEC17" HREF="#TOC1">SQUARE BRACKETS</A> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<LI><A NAME="SEC18" HREF="#TOC1">POSIX CHARACTER CLASSES</A> -<P> -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, -</P> -<P> -<PRE> - [01[:alpha:]%] -</PRE> -</P> -<P> -matches "0", "1", any alphabetic character, or "%". The supported class names -are -</P> -<P> -<PRE> - 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 -</PRE> -</P> -<P> -The names "ascii" and "word" are Perl extensions. Another Perl extension is -negation, which is indicated by a ^ character after the colon. For example, -</P> -<P> -<PRE> - [12[:^digit:]] -</PRE> -</P> -<P> -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. -</P> -<LI><A NAME="SEC19" HREF="#TOC1">VERTICAL BAR</A> -<P> -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -</P> -<P> -<PRE> - gilbert|sullivan -</PRE> -</P> -<P> -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. -</P> -<LI><A NAME="SEC20" HREF="#TOC1">INTERNAL OPTION SETTING</A> -<P> -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 -</P> -<P> -<PRE> - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED -</PRE> -</P> -<P> -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. -</P> -<P> -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: -</P> -<P> -<PRE> - (?i)abc - a(?i)bc - ab(?i)c - abc(?i) -</PRE> -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (a(?i)b)c -</PRE> -</P> -<P> -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, -</P> -<P> -<PRE> - (a(?i)b|c) -</PRE> -</P> -<P> -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. -</P> -<P> -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. -</P> -<LI><A NAME="SEC21" HREF="#TOC1">SUBPATTERNS</A> -<P> -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Marking part of a pattern as a subpattern does two things: -</P> -<P> -1. It localizes a set of alternatives. For example, the pattern -</P> -<P> -<PRE> - cat(aract|erpillar|) -</PRE> -</P> -<P> -matches one of the words "cat", "cataract", or "caterpillar". Without the -parentheses, it would match "cataract", "erpillar" or the empty string. -</P> -<P> -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 <I>ovector</I> argument of -<B>pcre_exec()</B>. Opening parentheses are counted from left to right (starting -from 1) to obtain the numbers of the capturing subpatterns. -</P> -<P> -For example, if the string "the red king" is matched against the pattern -</P> -<P> -<PRE> - the ((red|white) (king|queen)) -</PRE> -</P> -<P> -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3. -</P> -<P> -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 -</P> -<P> -<PRE> - the ((?:red|white) (king|queen)) -</PRE> -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (?i:saturday|sunday) - (?:(?i)saturday|sunday) -</PRE> -</P> -<P> -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". -</P> -<LI><A NAME="SEC22" HREF="#TOC1">REPETITION</A> -<P> -Repetition is specified by quantifiers, which can follow any of the following -items: -</P> -<P> -<PRE> - 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) -</PRE> -</P> -<P> -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: -</P> -<P> -<PRE> - z{2,4} -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - [aeiou]{3,} -</PRE> -</P> -<P> -matches at least 3 successive vowels, but may match many more, while -</P> -<P> -<PRE> - \d{8} -</PRE> -</P> -<P> -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. -</P> -<P> -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. -</P> -<P> -For convenience (and historical compatibility) the three most common -quantifiers have single-character abbreviations: -</P> -<P> -<PRE> - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} -</PRE> -</P> -<P> -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: -</P> -<P> -<PRE> - (a?)* -</PRE> -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - /*.**/ -</PRE> -</P> -<P> -to the string -</P> -<P> -<PRE> - /* first command */ not comment /* second comment */ -</PRE> -</P> -<P> -fails, because it matches the entire string owing to the greediness of the .* -item. -</P> -<P> -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 -</P> -<P> -<PRE> - /*.*?*/ -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - \d??\d -</PRE> -</P> -<P> -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -</P> -<P> -<PRE> - (tweedle[dume]{3}\s*)+ -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - /(a|(b))+/ -</PRE> -</P> -<P> -matches "aba" the value of the second captured substring is "b". -</P> -<LI><A NAME="SEC23" HREF="#TOC1">BACK REFERENCES</A> -<P> -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. -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (sens|respons)e and \1ibility -</PRE> -</P> -<P> -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, -</P> -<P> -<PRE> - ((?i)rah)\s+\1 -</PRE> -</P> -<P> -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -</P> -<P> -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 -</P> -<P> -<PRE> - (a|(bc))\2 -</PRE> -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (a|b\1)+ -</PRE> -</P> -<P> -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. -</P> -<LI><A NAME="SEC24" HREF="#TOC1">ASSERTIONS</A> -<P> -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. -</P> -<P> -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, -</P> -<P> -<PRE> - \w+(?=;) -</PRE> -</P> -<P> -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -</P> -<P> -<PRE> - foo(?!bar) -</PRE> -</P> -<P> -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -</P> -<P> -<PRE> - (?!foo)bar -</PRE> -</P> -<P> -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. -</P> -<P> -Lookbehind assertions start with (?<= for positive assertions and (?<! for -negative assertions. For example, -</P> -<P> -<PRE> - (?<!foo)bar -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - (?<=bullock|donkey) -</PRE> -</P> -<P> -is permitted, but -</P> -<P> -<PRE> - (?<!dogs?|cats?) -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - (?<=ab(c|de)) -</PRE> -</P> -<P> -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: -</P> -<P> -<PRE> - (?<=abc|abde) -</PRE> -</P> -<P> -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. -</P> -<P> -Several assertions (of any sort) may occur in succession. For example, -</P> -<P> -<PRE> - (?<=\d{3})(?<!999)foo -</PRE> -</P> -<P> -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 <I>not</I> 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 -</P> -<P> -<PRE> - (?<=\d{3}...)(?<!999)foo -</PRE> -</P> -<P> -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". -</P> -<P> -Assertions can be nested in any combination. For example, -</P> -<P> -<PRE> - (?<=(?<!foo)bar)baz -</PRE> -</P> -<P> -matches an occurrence of "baz" that is preceded by "bar" which in turn is not -preceded by "foo", while -</P> -<P> -<PRE> - (?<=\d{3}(?!999)...)foo -</PRE> -</P> -<P> -is another pattern which matches "foo" preceded by three digits and any three -characters that are not "999". -</P> -<P> -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. -</P> -<P> -Assertions count towards the maximum of 200 parenthesized subpatterns. -</P> -<LI><A NAME="SEC25" HREF="#TOC1">ONCE-ONLY SUBPATTERNS</A> -<P> -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. -</P> -<P> -Consider, for example, the pattern \d+foo when applied to the subject line -</P> -<P> -<PRE> - 123456bar -</PRE> -</P> -<P> -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: -</P> -<P> -<PRE> - (?>\d+)bar -</PRE> -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -This construction can of course contain arbitrarily complicated subpatterns, -and it can be nested. -</P> -<P> -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 -</P> -<P> -<PRE> - abcd$ -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - ^.*abcd$ -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - ^(?>.*)(?<=abcd) -</PRE> -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (\D+|<\d+>)*[!?] -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - ((?>\D+)|<\d+>)*[!?] -</PRE> -</P> -<P> -sequences of non-digits cannot be broken, and failure happens quickly. -</P> -<LI><A NAME="SEC26" HREF="#TOC1">CONDITIONAL SUBPATTERNS</A> -<P> -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 -</P> -<P> -<PRE> - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) -</PRE> -</P> -<P> -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. -</P> -<P> -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: -</P> -<P> -<PRE> - ( ( )? [^()]+ (?(1) ) ) -</PRE> -</P> -<P> -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. -</P> -<P> -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: -</P> -<P> -<PRE> - (?(?=[^a-z]*[a-z]) - \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) -</PRE> -</P> -<P> -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. -</P> -<LI><A NAME="SEC27" HREF="#TOC1">COMMENTS</A> -<P> -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. -</P> -<P> -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. -</P> -<LI><A NAME="SEC28" HREF="#TOC1">RECURSIVE PATTERNS</A> -<P> -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: -</P> -<P> -<PRE> - $re = qr{( (?: (?>[^()]+) | (?p{$re}) )* )}x; -</PRE> -</P> -<P> -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): -</P> -<P> -<PRE> - ( ( (?>[^()]+) | (?R) )* ) -</PRE> -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() -</PRE> -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (ab(cd)ef) -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - ( ( ( (?>[^()]+) | (?R) )* ) ) - ^ ^ - ^ ^ -</PRE> -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 <B>pcre_malloc</B>, freeing it via <B>pcre_free</B> 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. -</P> -<LI><A NAME="SEC29" HREF="#TOC1">PERFORMANCE</A> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (.*) second -</PRE> -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -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 -</P> -<P> -<PRE> - (a+)* -</PRE> -</P> -<P> -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. -</P> -<P> -An optimization catches some of the more simple cases such as -</P> -<P> -<PRE> - (a+)*b -</PRE> -</P> -<P> -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 -</P> -<P> -<PRE> - (a+)*\d -</PRE> -</P> -<P> -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. -</P> -<LI><A NAME="SEC30" HREF="#TOC1">UTF-8 SUPPORT</A> -<P> -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 <B>pcre_compile()</B> 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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -Running with PCRE_UTF8 set causes these changes in the way PCRE works: -</P> -<P> -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. -</P> -<P> -2. The original hexadecimal escape sequence, \xhh, generates a two-byte UTF-8 -character if its value is greater than 127. -</P> -<P> -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. -</P> -<P> -4. The dot metacharacter matches one UTF-8 character instead of a single byte. -</P> -<P> -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. -</P> -<P> -4. Although the \x{...} escape is permitted in a character class, characters -whose values are greater than 255 cannot be included in a class. -</P> -<P> -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. -</P> -<P> -6. Repeated classes work correctly on multiple characters. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -9. The character types such as \d and \w do not work correctly with UTF-8 -characters. They continue to test a single byte. -</P> -<P> -10. Anything not explicitly mentioned here continues to work in bytes rather -than in characters. -</P> -<P> -The following UTF-8 features of Perl 5.6 are not implemented: -</P> -<P> -1. The escape sequence \C to match a single byte. -</P> -<P> -2. The use of Unicode tables and properties and escapes \p, \P, and \X. -</P> -<LI><A NAME="SEC31" HREF="#TOC1">AUTHOR</A> -<P> -Philip Hazel <ph10@cam.ac.uk> -<BR> -University Computing Service, -<BR> -New Museums Site, -<BR> -Cambridge CB2 3QG, England. -<BR> -Phone: +44 1223 334714 -</P> -<P> -Last updated: 28 August 2000, -<BR> -<PRE> - the 250th anniversary of the death of J.S. Bach. -<BR> -</PRE> -Copyright (c) 1997-2000 University of Cambridge. diff --git a/external/privoxy/pcre/doc/pcre.txt b/external/privoxy/pcre/doc/pcre.txt deleted file mode 100644 index 1db4b53..0000000 --- a/external/privoxy/pcre/doc/pcre.txt +++ /dev/null @@ -1,2125 +0,0 @@ -NAME - pcre - Perl-compatible regular expressions. - - - -SYNOPSIS - #include <pcre.h> - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - void pcre_free_substring(const char *stringptr); - - void pcre_free_substring_list(const char **stringptr); - - const unsigned char *pcre_maketables(void); - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - int pcre_info(const pcre *code, int *optptr, *firstcharptr); - - char *pcre_version(void); - - void *(*pcre_malloc)(size_t); - - void (*pcre_free)(void *); - - - - -DESCRIPTION - The PCRE library is a set of functions that implement regu- - lar expression pattern matching using the same syntax and - semantics as Perl 5, with just a few differences (see - - below). The current implementation corresponds to Perl - 5.005, with some additional features from later versions. - This includes some experimental, incomplete support for - UTF-8 encoded strings. Details of exactly what is and what - is not supported are given below. - - PCRE has its own native API, which is described in this - document. There is also a set of wrapper functions that - correspond to the POSIX regular expression API. These are - described in the pcreposix documentation. - - The native API function prototypes are defined in the header - file pcre.h, and on Unix systems the library itself is - called libpcre.a, so can be accessed by adding -lpcre to the - command for linking an application which calls it. The - header file defines the macros PCRE_MAJOR and PCRE_MINOR to - contain the major and minor release numbers for the library. - Applications can use these to include support for different - releases. - - The functions pcre_compile(), pcre_study(), and pcre_exec() - are used for compiling and matching regular expressions. - - The functions pcre_copy_substring(), pcre_get_substring(), - and pcre_get_substring_list() are convenience functions for - extracting captured substrings from a matched subject - string; pcre_free_substring() and pcre_free_substring_list() - are also provided, to free the memory used for extracted - strings. - - The function pcre_maketables() is used (optionally) to build - a set of character tables in the current locale for passing - to pcre_compile(). - - The function pcre_fullinfo() is used to find out information - about a compiled pattern; pcre_info() is an obsolete version - which returns only some of the available information, but is - retained for backwards compatibility. The function - pcre_version() returns a pointer to a string containing the - version of PCRE and its date of release. - - The global variables pcre_malloc and pcre_free initially - contain the entry points of the standard malloc() and free() - functions respectively. PCRE calls the memory management - functions via these variables, so a calling program can - replace them if it wishes to intercept the calls. This - should be done before calling any PCRE functions. - - - -MULTI-THREADING - The PCRE functions can be used in multi-threading - - - - - -SunOS 5.8 Last change: 2 - - - - applications, with the proviso that the memory management - functions pointed to by pcre_malloc and pcre_free are shared - by all threads. - - The compiled form of a regular expression is not altered - during matching, so the same compiled pattern can safely be - used by several threads at once. - - - -COMPILING A PATTERN - The function pcre_compile() is called to compile a pattern - into an internal form. The pattern is a C string terminated - by a binary zero, and is passed in the argument pattern. A - pointer to a single block of memory that is obtained via - pcre_malloc is returned. This contains the compiled code and - related data. The pcre type is defined for this for conveni- - ence, but in fact pcre is just a typedef for void, since the - contents of the block are not externally defined. It is up - to the caller to free the memory when it is no longer - required. - - The size of a compiled pattern is roughly proportional to - the length of the pattern string, except that each character - class (other than those containing just a single character, - negated or not) requires 33 bytes, and repeat quantifiers - with a minimum greater than one or a bounded maximum cause - the relevant portions of the compiled pattern to be repli- - cated. - - The options argument contains independent bits that affect - the compilation. It should be zero if no options are - required. Some of the options, in particular, those that are - compatible with Perl, can also be set and unset from within - the pattern (see the detailed description of regular expres- - sions below). For these options, the contents of the options - argument specifies their initial settings at the start of - compilation and execution. The PCRE_ANCHORED option can be - set at the time of matching as well as at compile time. - - If errptr is NULL, pcre_compile() returns NULL immediately. - Otherwise, if compilation of a pattern fails, pcre_compile() - returns NULL, and sets the variable pointed to by errptr to - point to a textual error message. The offset from the start - of the pattern to the character where the error was - discovered is placed in the variable pointed to by - erroffset, which must not be NULL. If it is, an immediate - error is given. - - If the final argument, tableptr, is NULL, PCRE uses a - default set of character tables which are built when it is - compiled, using the default C locale. Otherwise, tableptr - must be the result of a call to pcre_maketables(). See the - section on locale support below. - - The following option bits are defined in the header file: - - PCRE_ANCHORED - - If this bit is set, the pattern is forced to be "anchored", - that is, it is constrained to match only at the start of the - string which is being searched (the "subject string"). This - effect can also be achieved by appropriate constructs in the - pattern itself, which is the only way to do it in Perl. - - PCRE_CASELESS - - If this bit is set, letters in the pattern match both upper - and lower case letters. It is equivalent to Perl's /i - option. - - PCRE_DOLLAR_ENDONLY - - If this bit is set, a dollar metacharacter in the pattern - matches only at the end of the subject string. Without this - option, a dollar also matches immediately before the final - character if it is a newline (but not before any other new- - lines). The PCRE_DOLLAR_ENDONLY option is ignored if - PCRE_MULTILINE is set. There is no equivalent to this option - in Perl. - - PCRE_DOTALL - - If this bit is set, a dot metacharater in the pattern - matches all characters, including newlines. Without it, new- - lines are excluded. This option is equivalent to Perl's /s - option. A negative class such as [^a] always matches a new- - line character, independent of the setting of this option. - - PCRE_EXTENDED - - If this bit is set, whitespace data characters in the pat- - tern are totally ignored except when escaped or inside a - character class, and characters between an unescaped # out- - side a character class and the next newline character, - inclusive, are also ignored. This is equivalent to Perl's /x - option, and makes it possible to include comments inside - complicated patterns. Note, however, that this applies only - to data characters. Whitespace characters may never appear - within special character sequences in a pattern, for example - within the sequence (?( which introduces a conditional sub- - pattern. - - PCRE_EXTRA - - This option was invented in order to turn on additional - functionality of PCRE that is incompatible with Perl, but it - is currently of very little use. When set, any backslash in - a pattern that is followed by a letter that has no special - meaning causes an error, thus reserving these combinations - for future expansion. By default, as in Perl, a backslash - followed by a letter with no special meaning is treated as a - literal. There are at present no other features controlled - by this option. It can also be set by a (?X) option setting - within a pattern. - - PCRE_MULTILINE - - By default, PCRE treats the subject string as consisting of - a single "line" of characters (even if it actually contains - several newlines). The "start of line" metacharacter (^) - matches only at the start of the string, while the "end of - line" metacharacter ($) matches only at the end of the - string, or before a terminating newline (unless - PCRE_DOLLAR_ENDONLY is set). This is the same as Perl. - - When PCRE_MULTILINE it is set, the "start of line" and "end - of line" constructs match immediately following or immedi- - ately before any newline in the subject string, respec- - tively, as well as at the very start and end. This is - equivalent to Perl's /m option. If there are no "\n" charac- - ters in a subject string, or no occurrences of ^ or $ in a - pattern, setting PCRE_MULTILINE has no effect. - - PCRE_UNGREEDY - - This option inverts the "greediness" of the quantifiers so - that they are not greedy by default, but become greedy if - followed by "?". It is not compatible with Perl. It can also - be set by a (?U) option setting within the pattern. - - PCRE_UTF8 - - This option causes PCRE to regard both the pattern and the - subject as strings of UTF-8 characters instead of just byte - strings. However, it is available only if PCRE has been - built to include UTF-8 support. If not, the use of this - option provokes an error. Support for UTF-8 is new, experi- - mental, and incomplete. Details of exactly what it entails - are given below. - - - -STUDYING A PATTERN - When a pattern is going to be used several times, it is - worth spending more time analyzing it in order to speed up - the time taken for matching. The function pcre_study() takes - - a pointer to a compiled pattern as its first argument, and - returns a pointer to a pcre_extra block (another void - typedef) containing additional information about the pat- - tern; this can be passed to pcre_exec(). If no additional - information is available, NULL is returned. - - The second argument contains option bits. At present, no - options are defined for pcre_study(), and this argument - should always be zero. - - The third argument for pcre_study() is a pointer to an error - message. If studying succeeds (even if no data is returned), - the variable it points to is set to NULL. Otherwise it - points to a textual error message. - - At present, studying a pattern is useful only for non- - anchored patterns that do not have a single fixed starting - character. A bitmap of possible starting characters is - created. - - - -LOCALE SUPPORT - PCRE handles caseless matching, and determines whether char- - acters are letters, digits, or whatever, by reference to a - set of tables. The library contains a default set of tables - which is created in the default C locale when PCRE is com- - piled. This is used when the final argument of - pcre_compile() is NULL, and is sufficient for many applica- - tions. - - An alternative set of tables can, however, be supplied. Such - tables are built by calling the pcre_maketables() function, - which has no arguments, in the relevant locale. The result - can then be passed to pcre_compile() as often as necessary. - For example, to build and use tables that are appropriate - for the French locale (where accented characters with codes - greater than 128 are treated as letters), the following code - could be used: - - setlocale(LC_CTYPE, "fr"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); - - The tables are built in memory that is obtained via - pcre_malloc. The pointer that is passed to pcre_compile is - saved with the compiled pattern, and the same tables are - used via this pointer by pcre_study() and pcre_exec(). Thus - for any single pattern, compilation, studying and matching - all happen in the same locale, but different patterns can be - compiled in different locales. It is the caller's responsi- - bility to ensure that the memory containing the tables - remains available for as long as it is needed. - - - -INFORMATION ABOUT A PATTERN - The pcre_fullinfo() function returns information about a - compiled pattern. It replaces the obsolete pcre_info() func- - tion, which is nevertheless retained for backwards compabil- - ity (and is documented below). - - The first argument for pcre_fullinfo() is a pointer to the - compiled pattern. The second argument is the result of - pcre_study(), or NULL if the pattern was not studied. The - third argument specifies which piece of information is - required, while the fourth argument is a pointer to a vari- - able to receive the data. The yield of the function is zero - for success, or one of the following negative numbers: - - PCRE_ERROR_NULL the argument code was NULL - the argument where was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADOPTION the value of what was invalid - - The possible values for the third argument are defined in - pcre.h, and are as follows: - - PCRE_INFO_OPTIONS - - Return a copy of the options with which the pattern was com- - piled. The fourth argument should point to au unsigned long - int variable. These option bits are those specified in the - call to pcre_compile(), modified by any top-level option - settings within the pattern itself, and with the - PCRE_ANCHORED bit forcibly set if the form of the pattern - implies that it can match only at the start of a subject - string. - - PCRE_INFO_SIZE - - Return the size of the compiled pattern, that is, the value - that was passed as the argument to pcre_malloc() when PCRE - was getting memory in which to place the compiled data. The - fourth argument should point to a size_t variable. - - PCRE_INFO_CAPTURECOUNT - - Return the number of capturing subpatterns in the pattern. - The fourth argument should point to an int variable. - - PCRE_INFO_BACKREFMAX - - Return the number of the highest back reference in the - pattern. The fourth argument should point to an int vari- - able. Zero is returned if there are no back references. - - PCRE_INFO_FIRSTCHAR - - Return information about the first character of any matched - string, for a non-anchored pattern. If there is a fixed - first character, e.g. from a pattern such as - (cat|cow|coyote), it is returned in the integer pointed to - by where. Otherwise, if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, - and every branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and - PCRE_DOTALL is not set (if it were set, the pattern would be - anchored), - - -1 is returned, indicating that the pattern matches only at - the start of a subject string or after any "\n" within the - string. Otherwise -2 is returned. For anchored patterns, -2 - is returned. - - PCRE_INFO_FIRSTTABLE - - If the pattern was studied, and this resulted in the con- - struction of a 256-bit table indicating a fixed set of char- - acters for the first character in any matching string, a - pointer to the table is returned. Otherwise NULL is - returned. The fourth argument should point to an unsigned - char * variable. - - PCRE_INFO_LASTLITERAL - - For a non-anchored pattern, return the value of the right- - most literal character which must exist in any matched - string, other than at its start. The fourth argument should - point to an int variable. If there is no such character, or - if the pattern is anchored, -1 is returned. For example, for - the pattern /a\d+z\d+/ the returned value is 'z'. - - The pcre_info() function is now obsolete because its inter- - face is too restrictive to return all the available data - about a compiled pattern. New programs should use - pcre_fullinfo() instead. The yield of pcre_info() is the - number of capturing subpatterns, or one of the following - negative numbers: - - PCRE_ERROR_NULL the argument code was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - - If the optptr argument is not NULL, a copy of the options - with which the pattern was compiled is placed in the integer - it points to (see PCRE_INFO_OPTIONS above). - - If the pattern is not anchored and the firstcharptr argument - is not NULL, it is used to pass back information about the - first character of any matched string (see - PCRE_INFO_FIRSTCHAR above). - - - -MATCHING A PATTERN - The function pcre_exec() is called to match a subject string - against a pre-compiled pattern, which is passed in the code - argument. If the pattern has been studied, the result of the - study should be passed in the extra argument. Otherwise this - must be NULL. - - The PCRE_ANCHORED option can be passed in the options argu- - ment, whose unused bits must be zero. However, if a pattern - was compiled with PCRE_ANCHORED, or turned out to be - anchored by virtue of its contents, it cannot be made - unachored at matching time. - - There are also three further options that can be set only at - matching time: - - PCRE_NOTBOL - - The first character of the string is not the beginning of a - line, so the circumflex metacharacter should not match - before it. Setting this without PCRE_MULTILINE (at compile - time) causes circumflex never to match. - - PCRE_NOTEOL - - The end of the string is not the end of a line, so the dol- - lar metacharacter should not match it nor (except in multi- - line mode) a newline immediately before it. Setting this - without PCRE_MULTILINE (at compile time) causes dollar never - to match. - - PCRE_NOTEMPTY - - An empty string is not considered to be a valid match if - this option is set. If there are alternatives in the pat- - tern, they are tried. If all the alternatives match the - empty string, the entire match fails. For example, if the - pattern - - a?b? - - is applied to a string not beginning with "a" or "b", it - matches the empty string at the start of the subject. With - PCRE_NOTEMPTY set, this match is not valid, so PCRE searches - further into the string for occurrences of "a" or "b". - - Perl has no direct equivalent of PCRE_NOTEMPTY, but it does - make a special case of a pattern match of the empty string - within its split() function, and when using the /g modifier. - It is possible to emulate Perl's behaviour after matching a - null string by first trying the match again at the same - offset with PCRE_NOTEMPTY set, and then if that fails by - advancing the starting offset (see below) and trying an - ordinary match again. - - The subject string is passed as a pointer in subject, a - length in length, and a starting offset in startoffset. - Unlike the pattern string, it may contain binary zero char- - acters. When the starting offset is zero, the search for a - match starts at the beginning of the subject, and this is by - far the most common case. - - A non-zero starting offset is useful when searching for - another match in the same subject by calling pcre_exec() - again after a previous success. Setting startoffset differs - from just passing over a shortened string and setting - PCRE_NOTBOL in the case of a pattern that begins with any - kind of lookbehind. For example, consider the pattern - - \Biss\B - - which finds occurrences of "iss" in the middle of words. (\B - matches only if the current position in the subject is not a - word boundary.) When applied to the string "Mississipi" the - first call to pcre_exec() finds the first occurrence. If - pcre_exec() is called again with just the remainder of the - subject, namely "issipi", it does not match, because \B is - always false at the start of the subject, which is deemed to - be a word boundary. However, if pcre_exec() is passed the - entire string again, but with startoffset set to 4, it finds - the second occurrence of "iss" because it is able to look - behind the starting point to discover that it is preceded by - a letter. - - If a non-zero starting offset is passed when the pattern is - anchored, one attempt to match at the given offset is tried. - This can only succeed if the pattern does not require the - match to be at the start of the subject. - - In general, a pattern matches a certain portion of the sub- - ject, and in addition, further substrings from the subject - may be picked out by parts of the pattern. Following the - usage in Jeffrey Friedl's book, this is called "capturing" - in what follows, and the phrase "capturing subpattern" is - used for a fragment of a pattern that picks out a substring. - PCRE supports several other kinds of parenthesized subpat- - tern that do not cause substrings to be captured. - - Captured substrings are returned to the caller via a vector - of integer offsets whose address is passed in ovector. The - number of elements in the vector is passed in ovecsize. The - first two-thirds of the vector is used to pass back captured - substrings, each substring using a pair of integers. The - remaining third of the vector is used as workspace by - pcre_exec() while matching capturing subpatterns, and is not - available for passing back information. The length passed in - ovecsize should always be a multiple of three. If it is not, - it is rounded down. - - When a match has been successful, information about captured - substrings is returned in pairs of integers, starting at the - beginning of ovector, and continuing up to two-thirds of its - length at the most. The first element of a pair is set to - the offset of the first character in a substring, and the - second is set to the offset of the first character after the - end of a substring. The first pair, ovector[0] and ovec- - tor[1], identify the portion of the subject string matched - by the entire pattern. The next pair is used for the first - capturing subpattern, and so on. The value returned by - pcre_exec() is the number of pairs that have been set. If - there are no capturing subpatterns, the return value from a - successful match is 1, indicating that just the first pair - of offsets has been set. - - Some convenience functions are provided for extracting the - captured substrings as separate strings. These are described - in the following section. - - It is possible for an capturing subpattern number n+1 to - match some part of the subject when subpattern n has not - been used at all. For example, if the string "abc" is - matched against the pattern (a|(z))(bc) subpatterns 1 and 3 - are matched, but 2 is not. When this happens, both offset - values corresponding to the unused subpattern are set to -1. - - If a capturing subpattern is matched repeatedly, it is the - last portion of the string that it matched that gets - returned. - - If the vector is too small to hold all the captured sub- - strings, it is used as far as possible (up to two-thirds of - its length), and the function returns a value of zero. In - particular, if the substring offsets are not of interest, - pcre_exec() may be called with ovector passed as NULL and - ovecsize as zero. However, if the pattern contains back - references and the ovector isn't big enough to remember the - related substrings, PCRE has to get additional memory for - use during matching. Thus it is usually advisable to supply - an ovector. - - Note that pcre_info() can be used to find out how many cap- - turing subpatterns there are in a compiled pattern. The - smallest size for ovector that will allow for n captured - substrings in addition to the offsets of the substring - matched by the whole pattern is (n+1)*3. - - If pcre_exec() fails, it returns a negative number. The fol- - lowing are defined in the header file: - - PCRE_ERROR_NOMATCH (-1) - - The subject string did not match the pattern. - - PCRE_ERROR_NULL (-2) - - Either code or subject was passed as NULL, or ovector was - NULL and ovecsize was not zero. - - PCRE_ERROR_BADOPTION (-3) - - An unrecognized bit was set in the options argument. - - PCRE_ERROR_BADMAGIC (-4) - - PCRE stores a 4-byte "magic number" at the start of the com- - piled code, to catch the case when it is passed a junk - pointer. This is the error it gives when the magic number - isn't present. - - PCRE_ERROR_UNKNOWN_NODE (-5) - - While running the pattern match, an unknown item was encoun- - tered in the compiled pattern. This error could be caused by - a bug in PCRE or by overwriting of the compiled pattern. - - PCRE_ERROR_NOMEMORY (-6) - - If a pattern contains back references, but the ovector that - is passed to pcre_exec() is not big enough to remember the - referenced substrings, PCRE gets a block of memory at the - start of matching to use for this purpose. If the call via - pcre_malloc() fails, this error is given. The memory is - freed at the end of matching. - - - -EXTRACTING CAPTURED SUBSTRINGS - Captured substrings can be accessed directly by using the - - - - - -SunOS 5.8 Last change: 12 - - - - offsets returned by pcre_exec() in ovector. For convenience, - the functions pcre_copy_substring(), pcre_get_substring(), - and pcre_get_substring_list() are provided for extracting - captured substrings as new, separate, zero-terminated - strings. A substring that contains a binary zero is - correctly extracted and has a further zero added on the end, - but the result does not, of course, function as a C string. - - The first three arguments are the same for all three func- - tions: subject is the subject string which has just been - successfully matched, ovector is a pointer to the vector of - integer offsets that was passed to pcre_exec(), and - stringcount is the number of substrings that were captured - by the match, including the substring that matched the - entire regular expression. This is the value returned by - pcre_exec if it is greater than zero. If pcre_exec() - returned zero, indicating that it ran out of space in ovec- - tor, the value passed as stringcount should be the size of - the vector divided by three. - - The functions pcre_copy_substring() and pcre_get_substring() - extract a single substring, whose number is given as string- - number. A value of zero extracts the substring that matched - the entire pattern, while higher values extract the captured - substrings. For pcre_copy_substring(), the string is placed - in buffer, whose length is given by buffersize, while for - pcre_get_substring() a new block of memory is obtained via - pcre_malloc, and its address is returned via stringptr. The - yield of the function is the length of the string, not - including the terminating zero, or one of - - PCRE_ERROR_NOMEMORY (-6) - - The buffer was too small for pcre_copy_substring(), or the - attempt to get memory failed for pcre_get_substring(). - - PCRE_ERROR_NOSUBSTRING (-7) - - There is no substring whose number is stringnumber. - - The pcre_get_substring_list() function extracts all avail- - able substrings and builds a list of pointers to them. All - this is done in a single block of memory which is obtained - via pcre_malloc. The address of the memory block is returned - via listptr, which is also the start of the list of string - pointers. The end of the list is marked by a NULL pointer. - The yield of the function is zero if all went well, or - - PCRE_ERROR_NOMEMORY (-6) - - if the attempt to get the memory block failed. - - When any of these functions encounter a substring that is - unset, which can happen when capturing subpattern number n+1 - matches some part of the subject, but subpattern n has not - been used at all, they return an empty string. This can be - distinguished from a genuine zero-length substring by - inspecting the appropriate offset in ovector, which is nega- - tive for unset substrings. - - The two convenience functions pcre_free_substring() and - pcre_free_substring_list() can be used to free the memory - returned by a previous call of pcre_get_substring() or - pcre_get_substring_list(), respectively. They do nothing - more than call the function pointed to by pcre_free, which - of course could be called directly from a C program. How- - ever, PCRE is used in some situations where it is linked via - a special interface to another programming language which - cannot use pcre_free directly; it is for these cases that - the functions are provided. - - - -LIMITATIONS - There are some size limitations in PCRE but it is hoped that - they will never in practice be relevant. The maximum length - of a compiled pattern is 65539 (sic) bytes. All values in - repeating quantifiers must be less than 65536. The maximum - number of capturing subpatterns is 99. The maximum number - of all parenthesized subpatterns, including capturing sub- - patterns, assertions, and other types of subpattern, is 200. - - The maximum length of a subject string is the largest posi- - tive number that an integer variable can hold. However, PCRE - uses recursion to handle subpatterns and indefinite repeti- - tion. This means that the available stack space may limit - the size of a subject string that can be processed by cer- - tain patterns. - - - -DIFFERENCES FROM PERL - The differences described here are with respect to Perl - 5.005. - - 1. By default, a whitespace character is any character that - the C library function isspace() recognizes, though it is - possible to compile PCRE with alternative character type - tables. Normally isspace() matches space, formfeed, newline, - carriage return, horizontal tab, and vertical tab. Perl 5 no - longer includes vertical tab in its set of whitespace char- - acters. The \v escape that was in the Perl documentation for - a long time was never in fact recognized. However, the char- - acter itself was treated as whitespace at least up to 5.002. - In 5.004 and 5.005 it does not match \s. - - 2. PCRE does not allow repeat quantifiers on lookahead - assertions. Perl permits them, but they do not mean what you - might think. For example, (?!a){3} does not assert that the - next three characters are not "a". It just asserts that the - next character is not "a" three times. - - 3. Capturing subpatterns that occur inside negative looka- - head assertions are counted, but their entries in the - offsets vector are never set. Perl sets its numerical vari- - ables from any such patterns that are matched before the - assertion fails to match something (thereby succeeding), but - only if the negative lookahead assertion contains just one - branch. - - 4. Though binary zero characters are supported in the sub- - ject string, they are not allowed in a pattern string - because it is passed as a normal C string, terminated by - zero. The escape sequence "\0" can be used in the pattern to - represent a binary zero. - - 5. The following Perl escape sequences are not supported: - \l, \u, \L, \U, \E, \Q. In fact these are implemented by - Perl's general string-handling and are not part of its pat- - tern matching engine. - - 6. The Perl \G assertion is not supported as it is not - relevant to single pattern matches. - - 7. Fairly obviously, PCRE does not support the (?{code}) and - (?p{code}) constructions. However, there is some experimen- - tal support for recursive patterns using the non-Perl item - (?R). - - 8. There are at the time of writing some oddities in Perl - 5.005_02 concerned with the settings of captured strings - when part of a pattern is repeated. For example, matching - "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value - "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 - unset. However, if the pattern is changed to - /^(aa(b(b))?)+$/ then $2 (and $3) are set. - - In Perl 5.004 $2 is set in both cases, and that is also true - of PCRE. If in the future Perl changes to a consistent state - that is different, PCRE may change to follow. - - 9. Another as yet unresolved discrepancy is that in Perl - 5.005_02 the pattern /^(a)?(?(1)a|b)+$/ matches the string - "a", whereas in PCRE it does not. However, in both Perl and - PCRE /^(a)?a/ matched against "a" leaves $1 unset. - - 10. PCRE provides some extensions to the Perl regular - expression facilities: - - (a) Although lookbehind assertions must match fixed length - strings, each alternative branch of a lookbehind assertion - can match a different length of string. Perl 5.005 requires - them all to have the same length. - - (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not - set, the $ meta- character matches only at the very end of - the string. - - (c) If PCRE_EXTRA is set, a backslash followed by a letter - with no special meaning is faulted. - - (d) If PCRE_UNGREEDY is set, the greediness of the repeti- - tion quantifiers is inverted, that is, by default they are - not greedy, but if followed by a question mark they are. - - (e) PCRE_ANCHORED can be used to force a pattern to be tried - only at the start of the subject. - - (f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options - for pcre_exec() have no Perl equivalents. - - (g) The (?R) construct allows for recursive pattern matching - (Perl 5.6 can do this using the (?p{code}) construct, which - PCRE cannot of course support.) - - - -REGULAR EXPRESSION DETAILS - The syntax and semantics of the regular expressions sup- - ported by PCRE are described below. Regular expressions are - also described in the Perl documentation and in a number of - other books, some of which have copious examples. Jeffrey - Friedl's "Mastering Regular Expressions", published by - O'Reilly (ISBN 1-56592-257), covers them in great detail. - - The description here is intended as reference documentation. - The basic operation of PCRE is on strings of bytes. However, - there is the beginnings of some support for UTF-8 character - strings. To use this support you must configure PCRE to - include it, and then call pcre_compile() with the PCRE_UTF8 - option. How this affects the pattern matching is described - in the final section of this document. - - A regular expression is a pattern that is matched against a - subject string from left to right. Most characters stand for - themselves in a pattern, and match the corresponding charac- - ters in the subject. As a trivial example, the pattern - - The quick brown fox - - matches a portion of a subject string that is identical to - itself. The power of regular expressions comes from the - ability to include alternatives and repetitions in the pat- - tern. These are encoded in the pattern by the use of meta- - characters, which do not stand for themselves but instead - are interpreted in some special way. - - There are two different sets of meta-characters: those that - are recognized anywhere in the pattern except within square - brackets, and those that are recognized in square brackets. - Outside square brackets, the meta-characters are as follows: - - \ general escape character with several uses - ^ assert start of subject (or line, in multiline - mode) - $ assert end of subject (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - { start min/max quantifier - - Part of a pattern that is in square brackets is called a - "character class". In a character class the only meta- - characters are: - - \ general escape character - ^ negate the class, but only if the first character - - indicates character range - ] terminates the character class - - The following sections describe the use of each of the - meta-characters. - - - -BACKSLASH - The backslash character has several uses. Firstly, if it is - followed by a non-alphameric character, it takes away any - special meaning that character may have. This use of - backslash as an escape character applies both inside and - outside character classes. - - For example, if you want to match a "*" character, you write - "*" in the pattern. This applies whether or not the follow- - ing character would otherwise be interpreted as a meta- - character, so it is always safe to precede a non-alphameric - with "" to specify that it stands for itself. In particu- - lar, if you want to match a backslash, you write "\". - - If a pattern is compiled with the PCRE_EXTENDED option, whi- - tespace in the pattern (other than in a character class) and - characters between a "#" outside a character class and the - next newline character are ignored. An escaping backslash - can be used to include a whitespace or "#" character as part - of the pattern. - - A second use of backslash provides a way of encoding non- - printing characters in patterns in a visible manner. There - is no restriction on the appearance of non-printing charac- - ters, apart from the binary zero that terminates a pattern, - but when a pattern is being prepared by text editing, it is - usually easier to use one of the following escape sequences - than the binary character it represents: - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any character - \e escape (hex 1B) - \f formfeed (hex 0C) - \n newline (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \xhh character with hex code hh - \ddd character with octal code ddd, or backreference - - The precise effect of "\cx" is as follows: if "x" is a lower - case letter, it is converted to upper case. Then bit 6 of - the character (hex 40) is inverted. Thus "\cz" becomes hex - 1A, but "\c{" becomes hex 3B, while "\c;" becomes hex 7B. - - After "\x", up to two hexadecimal digits are read (letters - can be in upper or lower case). - - After "\0" up to two further octal digits are read. In both - cases, if there are fewer than two digits, just those that - are present are used. Thus the sequence "\0\x\07" specifies - two binary zeros followed by a BEL character. Make sure you - supply two digits after the initial zero if the character - that follows is itself an octal digit. - - The handling of a backslash followed by a digit other than 0 - is complicated. Outside a character class, PCRE reads it - and any following digits as a decimal number. If the number - is less than 10, or if there have been at least that many - previous capturing left parentheses in the expression, the - entire sequence is taken as a back reference. A description - of how this works is given later, following the discussion - of parenthesized subpatterns. - - Inside a character class, or if the decimal number is - greater than 9 and there have not been that many capturing - subpatterns, PCRE re-reads up to three octal digits follow- - ing the backslash, and generates a single byte from the - least significant 8 bits of the value. Any subsequent digits - stand for themselves. For example: - - \040 is another way of writing a space - \40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \7 is always a back reference - \11 might be a back reference, or another way of - writing a tab - \011 is always a tab - \0113 is a tab followed by the character "3" - \113 is the character with octal code 113 (since there - can be no more than 99 back references) - \377 is a byte consisting entirely of 1 bits - \81 is either a back reference, or a binary zero - followed by the two characters "8" and "1" - - Note that octal values of 100 or greater must not be intro- - duced by a leading zero, because no more than three octal - digits are ever read. - - All the sequences that define a single byte value can be - used both inside and outside character classes. In addition, - inside a character class, the sequence "\b" is interpreted - as the backspace character (hex 08). Outside a character - class it has a different meaning (see below). - - The third use of backslash is for specifying generic charac- - ter types: - - \d any decimal digit - \D any character that is not a decimal digit - \s any whitespace character - \S any character that is not a whitespace character - \w any "word" character - \W any "non-word" character - - Each pair of escape sequences partitions the complete set of - characters into two disjoint sets. Any given character - matches one, and only one, of each pair. - - A "word" character is any letter or digit or the underscore - character, that is, any character which can be part of a - Perl "word". The definition of letters and digits is con- - trolled by PCRE's character tables, and may vary if locale- - specific matching is taking place (see "Locale support" - above). For example, in the "fr" (French) locale, some char- - acter codes greater than 128 are used for accented letters, - and these are matched by \w. - - These character type sequences can appear both inside and - outside character classes. They each match one character of - the appropriate type. If the current matching point is at - the end of the subject string, all of them fail, since there - is no character to match. - - The fourth use of backslash is for certain simple asser- - tions. An assertion specifies a condition that has to be met - at a particular point in a match, without consuming any - characters from the subject string. The use of subpatterns - for more complicated assertions is described below. The - backslashed assertions are - - \b word boundary - \B not a word boundary - \A start of subject (independent of multiline mode) - \Z end of subject or newline at end (independent of - multiline mode) - \z end of subject (independent of multiline mode) - - These assertions may not appear in character classes (but - note that "\b" has a different meaning, namely the backspace - character, inside a character class). - - A word boundary is a position in the subject string where - the current character and the previous character do not both - match \w or \W (i.e. one matches \w and the other matches - \W), or the start or end of the string if the first or last - character matches \w, respectively. - - The \A, \Z, and \z assertions differ from the traditional - circumflex and dollar (described below) in that they only - ever match at the very start and end of the subject string, - whatever options are set. They are not affected by the - PCRE_NOTBOL or PCRE_NOTEOL options. If the startoffset argu- - ment of pcre_exec() is non-zero, \A can never match. The - difference between \Z and \z is that \Z matches before a - newline that is the last character of the string as well as - at the end of the string, whereas \z matches only at the - end. - - - -CIRCUMFLEX AND DOLLAR - Outside a character class, in the default matching mode, the - circumflex character is an assertion which is true only if - the current matching point is at the start of the subject - - string. If the startoffset argument of pcre_exec() is non- - zero, circumflex can never match. Inside a character class, - circumflex has an entirely different meaning (see below). - - Circumflex need not be the first character of the pattern if - a number of alternatives are involved, but it should be the - first thing in each alternative in which it appears if the - pattern is ever to match that branch. If all possible alter- - natives start with a circumflex, that is, if the pattern is - constrained to match only at the start of the subject, it is - said to be an "anchored" pattern. (There are also other con- - structs that can cause a pattern to be anchored.) - - A dollar character is an assertion which is true only if the - current matching point is at the end of the subject string, - or immediately before a newline character that is the last - character in the string (by default). Dollar need not be the - last character of the pattern if a number of alternatives - are involved, but it should be the last item in any branch - in which it appears. Dollar has no special meaning in a - character class. - - The meaning of dollar can be changed so that it matches only - at the very end of the string, by setting the - PCRE_DOLLAR_ENDONLY option at compile or matching time. This - does not affect the \Z assertion. - - The meanings of the circumflex and dollar characters are - changed if the PCRE_MULTILINE option is set. When this is - the case, they match immediately after and immediately - before an internal "\n" character, respectively, in addition - to matching at the start and end of the subject string. For - example, the pattern /^abc$/ matches the subject string - "def\nabc" in multiline mode, but not otherwise. Conse- - quently, patterns that are anchored in single line mode - because all branches start with "^" are not anchored in mul- - tiline mode, and a match for circumflex is possible when the - startoffset argument of pcre_exec() is non-zero. The - PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is - set. - - Note that the sequences \A, \Z, and \z can be used to match - the start and end of the subject in both modes, and if all - branches of a pattern start with \A is it always anchored, - whether PCRE_MULTILINE is set or not. - - - -FULL STOP (PERIOD, DOT) - Outside a character class, a dot in the pattern matches any - one character in the subject, including a non-printing char- - acter, but not (by default) newline. If the PCRE_DOTALL - - option is set, dots match newlines as well. The handling of - dot is entirely independent of the handling of circumflex - and dollar, the only relationship being that they both - involve newline characters. Dot has no special meaning in a - character class. - - - -SQUARE BRACKETS - An opening square bracket introduces a character class, ter- - minated by a closing square bracket. A closing square - bracket on its own is not special. If a closing square - bracket is required as a member of the class, it should be - the first data character in the class (after an initial cir- - cumflex, if present) or escaped with a backslash. - - A character class matches a single character in the subject; - the character must be in the set of characters defined by - the class, unless the first character in the class is a cir- - cumflex, in which case the subject character must not be in - the set defined by the class. If a circumflex is actually - required as a member of the class, ensure it is not the - first character, or escape it with a backslash. - - For example, the character class [aeiou] matches any lower - case vowel, while [^aeiou] matches any character that is not - a lower case vowel. Note that a circumflex is just a con- - venient notation for specifying the characters which are in - the class by enumerating those that are not. It is not an - assertion: it still consumes a character from the subject - string, and fails if the current pointer is at the end of - the string. - - When caseless matching is set, any letters in a class - represent both their upper case and lower case versions, so - for example, a caseless [aeiou] matches "A" as well as "a", - and a caseless [^aeiou] does not match "A", whereas a case- - ful version would. - - The newline character is never treated in any special way in - character classes, whatever the setting of the PCRE_DOTALL - or PCRE_MULTILINE options is. A class such as [^a] will - always match a newline. - - The minus (hyphen) character can be used to specify a range - of characters in a character class. For example, [d-m] - matches any letter between d and m, inclusive. If a minus - character is required in a class, it must be escaped with a - backslash or appear in a position where it cannot be inter- - preted as indicating a range, typically as the first or last - character in the class. - - It is not possible to have the literal character "]" as the - end character of a range. A pattern such as [W-]46] is - interpreted as a class of two characters ("W" and "-") fol- - lowed by a literal string "46]", so it would match "W46]" or - "-46]". However, if the "]" is escaped with a backslash it - is interpreted as the end of range, so [W-]46] is inter- - preted as a single class containing a range followed by two - separate characters. The octal or hexadecimal representation - of "]" can also be used to end a range. - - Ranges operate in ASCII collating sequence. They can also be - used for characters specified numerically, for example - [\000-\037]. If a range that includes letters is used when - caseless matching is set, it matches the letters in either - case. For example, [W-c] is equivalent to [][^_`wxyzabc], - matched caselessly, and if character tables for the "fr" - locale are in use, [\xc8-\xcb] matches accented E characters - in both cases. - - The character types \d, \D, \s, \S, \w, and \W may also - appear in a character class, and add the characters that - they match to the class. For example, [\dABCDEF] matches any - hexadecimal digit. A circumflex can conveniently be used - with the upper case character types to specify a more res- - tricted set of characters than the matching lower case type. - For example, the class [^\W_] matches any letter or digit, - but not underscore. - - All non-alphameric characters other than , -, ^ (at the - start) and the terminating ] are non-special in character - classes, but it does no harm if they are escaped. - - - -POSIX CHARACTER CLASSES - Perl 5.6 (not yet released at the time of writing) is going - to support the POSIX notation for character classes, which - uses names enclosed by [: and :] within the enclosing - square brackets. PCRE supports this notation. For example, - - [01[:alpha:]%] - - matches "0", "1", any alphabetic character, or "%". The sup- - ported class names are - - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - cntrl control characters - digit decimal digits (same as \d) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits - space white space (same as \s) - upper upper case letters - word "word" characters (same as \w) - xdigit hexadecimal digits - - The names "ascii" and "word" are Perl extensions. Another - Perl extension is negation, which is indicated by a ^ char- - acter after the colon. For example, - - [12[:^digit:]] - - matches "1", "2", or any non-digit. PCRE (and Perl) also - recogize the POSIX syntax [.ch.] and [=ch=] where "ch" is a - "collating element", but these are not supported, and an - error is given if they are encountered. - - - -VERTICAL BAR - Vertical bar characters are used to separate alternative - patterns. For example, the pattern - - gilbert|sullivan - - matches either "gilbert" or "sullivan". Any number of alter- - natives may appear, and an empty alternative is permitted - (matching the empty string). The matching process tries - each alternative in turn, from left to right, and the first - one that succeeds is used. If the alternatives are within a - subpattern (defined below), "succeeds" means matching the - rest of the main pattern as well as the alternative in the - subpattern. - - - -INTERNAL OPTION SETTING - The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, - and PCRE_EXTENDED can be changed from within the pattern by - a sequence of Perl option letters enclosed between "(?" and - ")". The option letters are - - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED - - For example, (?im) sets caseless, multiline matching. It is - also possible to unset these options by preceding the letter - with a hyphen, and a combined setting and unsetting such as - (?im-sx), which sets PCRE_CASELESS and PCRE_MULTILINE while - unsetting PCRE_DOTALL and PCRE_EXTENDED, is also permitted. - If a letter appears both before and after the hyphen, the - option is unset. - - The scope of these option changes depends on where in the - pattern the setting occurs. For settings that are outside - any subpattern (defined below), the effect is the same as if - the options were set or unset at the start of matching. The - following patterns all behave in exactly the same way: - - (?i)abc - a(?i)bc - ab(?i)c - abc(?i) - - which in turn is the same as compiling the pattern abc with - PCRE_CASELESS set. In other words, such "top level" set- - tings apply to the whole pattern (unless there are other - changes inside subpatterns). If there is more than one set- - ting of the same option at top level, the rightmost setting - is used. - - If an option change occurs inside a subpattern, the effect - is different. This is a change of behaviour in Perl 5.005. - An option change inside a subpattern affects only that part - of the subpattern that follows it, so - - (a(?i)b)c - - matches abc and aBc and no other strings (assuming - PCRE_CASELESS is not used). By this means, options can be - made to have different settings in different parts of the - pattern. Any changes made in one alternative do carry on - into subsequent branches within the same subpattern. For - example, - - (a(?i)b|c) - - matches "ab", "aB", "c", and "C", even though when matching - "C" the first branch is abandoned before the option setting. - This is because the effects of option settings happen at - compile time. There would be some very weird behaviour oth- - erwise. - - The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can - be changed in the same way as the Perl-compatible options by - using the characters U and X respectively. The (?X) flag - setting is special in that it must always occur earlier in - the pattern than any of the additional features it turns on, - even when it is at top level. It is best put at the start. - - - -SUBPATTERNS - Subpatterns are delimited by parentheses (round brackets), - which can be nested. Marking part of a pattern as a subpat- - tern does two things: - - 1. It localizes a set of alternatives. For example, the pat- - tern - - cat(aract|erpillar|) - - matches one of the words "cat", "cataract", or "caterpil- - lar". Without the parentheses, it would match "cataract", - "erpillar" or the empty string. - - 2. It sets up the subpattern as a capturing subpattern (as - defined above). When the whole pattern matches, that por- - tion of the subject string that matched the subpattern is - passed back to the caller via the ovector argument of - pcre_exec(). Opening parentheses are counted from left to - right (starting from 1) to obtain the numbers of the captur- - ing subpatterns. - - For example, if the string "the red king" is matched against - the pattern - - the ((red|white) (king|queen)) - - the captured substrings are "red king", "red", and "king", - and are numbered 1, 2, and 3. - - The fact that plain parentheses fulfil two functions is not - always helpful. There are often times when a grouping sub- - pattern is required without a capturing requirement. If an - opening parenthesis is followed by "?:", the subpattern does - not do any capturing, and is not counted when computing the - number of any subsequent capturing subpatterns. For example, - if the string "the white queen" is matched against the pat- - tern - - the ((?:red|white) (king|queen)) - - the captured substrings are "white queen" and "queen", and - are numbered 1 and 2. The maximum number of captured sub- - strings is 99, and the maximum number of all subpatterns, - both capturing and non-capturing, is 200. - - As a convenient shorthand, if any option settings are - required at the start of a non-capturing subpattern, the - option letters may appear between the "?" and the ":". Thus - the two patterns - - (?i:saturday|sunday) - (?:(?i)saturday|sunday) - - match exactly the same set of strings. Because alternative - branches are tried from left to right, and options are not - reset until the end of the subpattern is reached, an option - setting in one branch does affect subsequent branches, so - the above patterns match "SUNDAY" as well as "Saturday". - - - -REPETITION - Repetition is specified by quantifiers, which can follow any - of the following items: - - a single character, possibly escaped - the . metacharacter - a character class - a back reference (see next section) - a parenthesized subpattern (unless it is an assertion - - see below) - - The general repetition quantifier specifies a minimum and - maximum number of permitted matches, by giving the two - numbers in curly brackets (braces), separated by a comma. - The numbers must be less than 65536, and the first must be - less than or equal to the second. For example: - - z{2,4} - - matches "zz", "zzz", or "zzzz". A closing brace on its own - is not a special character. If the second number is omitted, - but the comma is present, there is no upper limit; if the - second number and the comma are both omitted, the quantifier - specifies an exact number of required matches. Thus - - [aeiou]{3,} - - matches at least 3 successive vowels, but may match many - more, while - - \d{8} - - matches exactly 8 digits. An opening curly bracket that - appears in a position where a quantifier is not allowed, or - one that does not match the syntax of a quantifier, is taken - as a literal character. For example, {,6} is not a quantif- - ier, but a literal string of four characters. - - The quantifier {0} is permitted, causing the expression to - behave as if the previous item and the quantifier were not - present. - - For convenience (and historical compatibility) the three - most common quantifiers have single-character abbreviations: - - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} - - It is possible to construct infinite loops by following a - subpattern that can match no characters with a quantifier - that has no upper limit, for example: - - (a?)* - - Earlier versions of Perl and PCRE used to give an error at - compile time for such patterns. However, because there are - cases where this can be useful, such patterns are now - accepted, but if any repetition of the subpattern does in - fact match no characters, the loop is forcibly broken. - - By default, the quantifiers are "greedy", that is, they - match as much as possible (up to the maximum number of per- - mitted times), without causing the rest of the pattern to - fail. The classic example of where this gives problems is in - trying to match comments in C programs. These appear between - the sequences /* and */ and within the sequence, individual - * and / characters may appear. An attempt to match C com- - ments by applying the pattern - - /*.**/ - - to the string - - /* first command */ not comment /* second comment */ - - fails, because it matches the entire string owing to the - greediness of the .* item. - - However, if a quantifier is followed by a question mark, it - ceases to be greedy, and instead matches the minimum number - of times possible, so the pattern - - /*.*?*/ - - does the right thing with the C comments. The meaning of the - various quantifiers is not otherwise changed, just the pre- - ferred number of matches. Do not confuse this use of ques- - tion mark with its use as a quantifier in its own right. - Because it has two uses, it can sometimes appear doubled, as - in - - \d??\d - - which matches one digit by preference, but can match two if - that is the only way the rest of the pattern matches. - - If the PCRE_UNGREEDY option is set (an option which is not - available in Perl), the quantifiers are not greedy by - default, but individual ones can be made greedy by following - them with a question mark. In other words, it inverts the - default behaviour. - - When a parenthesized subpattern is quantified with a minimum - repeat count that is greater than 1 or with a limited max- - imum, more store is required for the compiled pattern, in - proportion to the size of the minimum or maximum. - - If a pattern starts with .* or .{0,} and the PCRE_DOTALL - option (equivalent to Perl's /s) is set, thus allowing the . - to match newlines, the pattern is implicitly anchored, - because whatever follows will be tried against every charac- - ter position in the subject string, so there is no point in - retrying the overall match at any position after the first. - PCRE treats such a pattern as though it were preceded by \A. - In cases where it is known that the subject string contains - no newlines, it is worth setting PCRE_DOTALL when the pat- - tern begins with .* in order to obtain this optimization, or - alternatively using ^ to indicate anchoring explicitly. - - When a capturing subpattern is repeated, the value captured - is the substring that matched the final iteration. For exam- - ple, after - - (tweedle[dume]{3}\s*)+ - - has matched "tweedledum tweedledee" the value of the cap- - tured substring is "tweedledee". However, if there are - nested capturing subpatterns, the corresponding captured - values may have been set in previous iterations. For exam- - ple, after - - /(a|(b))+/ - - matches "aba" the value of the second captured substring is - "b". - - - -BACK REFERENCES - Outside a character class, a backslash followed by a digit - greater than 0 (and possibly further digits) is a back - reference to a capturing subpattern earlier (i.e. to its - left) in the pattern, provided there have been that many - previous capturing left parentheses. - - However, if the decimal number following the backslash is - less than 10, it is always taken as a back reference, and - causes an error only if there are not that many capturing - left parentheses in the entire pattern. In other words, the - parentheses that are referenced need not be to the left of - the reference for numbers less than 10. See the section - entitled "Backslash" above for further details of the han- - dling of digits following a backslash. - - A back reference matches whatever actually matched the cap- - turing subpattern in the current subject string, rather than - anything matching the subpattern itself. So the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsi- - bility", but not "sense and responsibility". If caseful - matching is in force at the time of the back reference, the - case of letters is relevant. For example, - - ((?i)rah)\s+\1 - - matches "rah rah" and "RAH RAH", but not "RAH rah", even - though the original capturing subpattern is matched case- - lessly. - - There may be more than one back reference to the same sub- - pattern. If a subpattern has not actually been used in a - particular match, any back references to it always fail. For - example, the pattern - - (a|(bc))\2 - - always fails if it starts to match "a" rather than "bc". - Because there may be up to 99 back references, all digits - following the backslash are taken as part of a potential - back reference number. If the pattern continues with a digit - character, some delimiter must be used to terminate the back - reference. If the PCRE_EXTENDED option is set, this can be - whitespace. Otherwise an empty comment can be used. - - A back reference that occurs inside the parentheses to which - it refers fails when the subpattern is first used, so, for - example, (a\1) never matches. However, such references can - be useful inside repeated subpatterns. For example, the pat- - tern - - (a|b\1)+ - - matches any number of "a"s and also "aba", "ababbaa" etc. At - each iteration of the subpattern, the back reference matches - the character string corresponding to the previous - iteration. In order for this to work, the pattern must be - such that the first iteration does not need to match the - back reference. This can be done using alternation, as in - the example above, or by a quantifier with a minimum of - zero. - - - -ASSERTIONS - An assertion is a test on the characters following or - preceding the current matching point that does not actually - consume any characters. The simple assertions coded as \b, - \B, \A, \Z, \z, ^ and $ are described above. More compli- - cated assertions are coded as subpatterns. There are two - kinds: those that look ahead of the current position in the - subject string, and those that look behind it. - - An assertion subpattern is matched in the normal way, except - that it does not cause the current matching position to be - changed. Lookahead assertions start with (?= for positive - assertions and (?! for negative assertions. For example, - - \w+(?=;) - - matches a word followed by a semicolon, but does not include - the semicolon in the match, and - - foo(?!bar) - - matches any occurrence of "foo" that is not followed by - "bar". Note that the apparently similar pattern - - (?!foo)bar - - does not find an occurrence of "bar" that is preceded by - something other than "foo"; it finds any occurrence of "bar" - whatsoever, because the assertion (?!foo) is always true - when the next three characters are "bar". A lookbehind - assertion is needed to achieve this effect. - - Lookbehind assertions start with (?<= for positive asser- - tions and (?<! for negative assertions. For example, - - (?<!foo)bar - - does find an occurrence of "bar" that is not preceded by - "foo". The contents of a lookbehind assertion are restricted - such that all the strings it matches must have a fixed - length. However, if there are several alternatives, they do - not all have to have the same fixed length. Thus - - (?<=bullock|donkey) - - is permitted, but - - (?<!dogs?|cats?) - - causes an error at compile time. Branches that match dif- - ferent length strings are permitted only at the top level of - a lookbehind assertion. This is an extension compared with - Perl 5.005, which requires all branches to match the same - length of string. An assertion such as - - (?<=ab(c|de)) - - is not permitted, because its single top-level branch can - match two different lengths, but it is acceptable if rewrit- - ten to use two top-level branches: - - (?<=abc|abde) - - The implementation of lookbehind assertions is, for each - alternative, to temporarily move the current position back - by the fixed width and then try to match. If there are - insufficient characters before the current position, the - match is deemed to fail. Lookbehinds in conjunction with - once-only subpatterns can be particularly useful for match- - ing at the ends of strings; an example is given at the end - of the section on once-only subpatterns. - - Several assertions (of any sort) may occur in succession. - For example, - - (?<=\d{3})(?<!999)foo - - matches "foo" preceded by three digits that are not "999". - Notice that each of the assertions is applied independently - at the same point in the subject string. First there is a - check that the previous three characters are all digits, and - then there is a check that the same three characters are not - "999". This pattern does not match "foo" preceded by six - characters, the first of which are digits and the last three - of which are not "999". For example, it doesn't match - "123abcfoo". A pattern to do that is - - (?<=\d{3}...)(?<!999)foo - - This time the first assertion looks at the preceding six - characters, checking that the first three are digits, and - then the second assertion checks that the preceding three - characters are not "999". - - Assertions can be nested in any combination. For example, - - (?<=(?<!foo)bar)baz - - matches an occurrence of "baz" that is preceded by "bar" - which in turn is not preceded by "foo", while - - (?<=\d{3}(?!999)...)foo - - is another pattern which matches "foo" preceded by three - digits and any three characters that are not "999". - - Assertion subpatterns are not capturing subpatterns, and may - not be repeated, because it makes no sense to assert the - same thing several times. If any kind of assertion contains - capturing subpatterns within it, these are counted for the - purposes of numbering the capturing subpatterns in the whole - pattern. However, substring capturing is carried out only - for positive assertions, because it does not make sense for - negative assertions. - - Assertions count towards the maximum of 200 parenthesized - subpatterns. - - - -ONCE-ONLY SUBPATTERNS - With both maximizing and minimizing repetition, failure of - what follows normally causes the repeated item to be re- - evaluated to see if a different number of repeats allows the - rest of the pattern to match. Sometimes it is useful to - prevent this, either to change the nature of the match, or - to cause it fail earlier than it otherwise might, when the - author of the pattern knows there is no point in carrying - on. - - Consider, for example, the pattern \d+foo when applied to - the subject line - - 123456bar - - After matching all 6 digits and then failing to match "foo", - the normal action of the matcher is to try again with only 5 - digits matching the \d+ item, and then with 4, and so on, - before ultimately failing. Once-only subpatterns provide the - means for specifying that once a portion of the pattern has - matched, it is not to be re-evaluated in this way, so the - matcher would give up immediately on failing to match "foo" - the first time. The notation is another kind of special - parenthesis, starting with (?> as in this example: - - (?>\d+)bar - - This kind of parenthesis "locks up" the part of the pattern - it contains once it has matched, and a failure further into - the pattern is prevented from backtracking into it. - Backtracking past it to previous items, however, works as - normal. - - An alternative description is that a subpattern of this type - matches the string of characters that an identical stan- - dalone pattern would match, if anchored at the current point - in the subject string. - - Once-only subpatterns are not capturing subpatterns. Simple - cases such as the above example can be thought of as a max- - imizing repeat that must swallow everything it can. So, - while both \d+ and \d+? are prepared to adjust the number of - digits they match in order to make the rest of the pattern - match, (?>\d+) can only match an entire sequence of digits. - - This construction can of course contain arbitrarily compli- - cated subpatterns, and it can be nested. - - Once-only subpatterns can be used in conjunction with look- - behind assertions to specify efficient matching at the end - of the subject string. Consider a simple pattern such as - - abcd$ - - when applied to a long string which does not match. Because - matching proceeds from left to right, PCRE will look for - each "a" in the subject and then see if what follows matches - the rest of the pattern. If the pattern is specified as - - ^.*abcd$ - - the initial .* matches the entire string at first, but when - this fails (because there is no following "a"), it back- - tracks to match all but the last character, then all but the - last two characters, and so on. Once again the search for - "a" covers the entire string, from right to left, so we are - no better off. However, if the pattern is written as - - ^(?>.*)(?<=abcd) - - there can be no backtracking for the .* item; it can match - only the entire string. The subsequent lookbehind assertion - does a single test on the last four characters. If it fails, - the match fails immediately. For long strings, this approach - makes a significant difference to the processing time. - - When a pattern contains an unlimited repeat inside a subpat- - tern that can itself be repeated an unlimited number of - times, the use of a once-only subpattern is the only way to - avoid some failing matches taking a very long time indeed. - The pattern - - (\D+|<\d+>)*[!?] - - matches an unlimited number of substrings that either con- - sist of non-digits, or digits enclosed in <>, followed by - either ! or ?. When it matches, it runs quickly. However, if - it is applied to - - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - - it takes a long time before reporting failure. This is - because the string can be divided between the two repeats in - a large number of ways, and all have to be tried. (The exam- - ple used [!?] rather than a single character at the end, - because both PCRE and Perl have an optimization that allows - for fast failure when a single character is used. They - remember the last single character that is required for a - match, and fail early if it is not present in the string.) - If the pattern is changed to - - ((?>\D+)|<\d+>)*[!?] - - sequences of non-digits cannot be broken, and failure hap- - pens quickly. - - - -CONDITIONAL SUBPATTERNS - It is possible to cause the matching process to obey a sub- - pattern conditionally or to choose between two alternative - subpatterns, depending on the result of an assertion, or - whether a previous capturing subpattern matched or not. The - two possible forms of conditional subpattern are - - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) - - If the condition is satisfied, the yes-pattern is used; oth- - erwise the no-pattern (if present) is used. If there are - more than two alternatives in the subpattern, a compile-time - error occurs. - - There are two kinds of condition. If the text between the - parentheses consists of a sequence of digits, the condition - is satisfied if the capturing subpattern of that number has - previously matched. The number must be greater than zero. - Consider the following pattern, which contains non- - significant white space to make it more readable (assume the - PCRE_EXTENDED option) and to divide it into three parts for - ease of discussion: - - ( ( )? [^()]+ (?(1) ) ) - - The first part matches an optional opening parenthesis, and - if that character is present, sets it as the first captured - substring. The second part matches one or more characters - that are not parentheses. The third part is a conditional - subpattern that tests whether the first set of parentheses - matched or not. If they did, that is, if subject started - with an opening parenthesis, the condition is true, and so - the yes-pattern is executed and a closing parenthesis is - required. Otherwise, since no-pattern is not present, the - subpattern matches nothing. In other words, this pattern - matches a sequence of non-parentheses, optionally enclosed - in parentheses. - - If the condition is not a sequence of digits, it must be an - assertion. This may be a positive or negative lookahead or - lookbehind assertion. Consider this pattern, again contain- - ing non-significant white space, and with the two alterna- - tives on the second line: - - (?(?=[^a-z]*[a-z]) - \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - - The condition is a positive lookahead assertion that matches - an optional sequence of non-letters followed by a letter. In - other words, it tests for the presence of at least one - letter in the subject. If a letter is found, the subject is - matched against the first alternative; otherwise it is - matched against the second. This pattern matches strings in - one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are - letters and dd are digits. - - - -COMMENTS - The sequence (?# marks the start of a comment which contin- - ues up to the next closing parenthesis. Nested parentheses - are not permitted. The characters that make up a comment - play no part in the pattern matching at all. - - If the PCRE_EXTENDED option is set, an unescaped # character - outside a character class introduces a comment that contin- - ues up to the next newline character in the pattern. - - - -RECURSIVE PATTERNS - Consider the problem of matching a string in parentheses, - allowing for unlimited nested parentheses. Without the use - of recursion, the best that can be done is to use a pattern - that matches up to some fixed depth of nesting. It is not - possible to handle an arbitrary nesting depth. Perl 5.6 has - provided an experimental facility that allows regular - expressions to recurse (amongst other things). It does this - by interpolating Perl code in the expression at run time, - and the code can refer to the expression itself. A Perl pat- - tern to solve the parentheses problem can be created like - this: - - $re = qr{( (?: (?>[^()]+) | (?p{$re}) )* )}x; - - The (?p{...}) item interpolates Perl code at run time, and - in this case refers recursively to the pattern in which it - appears. Obviously, PCRE cannot support the interpolation of - Perl code. Instead, the special item (?R) is provided for - the specific case of recursion. This PCRE pattern solves the - parentheses problem (assume the PCRE_EXTENDED option is set - so that white space is ignored): - - ( ( (?>[^()]+) | (?R) )* ) - - First it matches an opening parenthesis. Then it matches any - number of substrings which can either be a sequence of non- - parentheses, or a recursive match of the pattern itself - (i.e. a correctly parenthesized substring). Finally there is - a closing parenthesis. - - This particular example pattern contains nested unlimited - repeats, and so the use of a once-only subpattern for match- - ing strings of non-parentheses is important when applying - the pattern to strings that do not match. For example, when - it is applied to - - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - - it yields "no match" quickly. However, if a once-only sub- - pattern is not used, the match runs for a very long time - indeed because there are so many different ways the + and * - repeats can carve up the subject, and all have to be tested - before failure can be reported. - - The values set for any capturing subpatterns are those from - the outermost level of the recursion at which the subpattern - value is set. If the pattern above is matched against - - (ab(cd)ef) - - the value for the capturing parentheses is "ef", which is - the last value taken on at the top level. If additional - parentheses are added, giving - - ( ( ( (?>[^()]+) | (?R) )* ) ) - ^ ^ - ^ ^ the string they capture is - "ab(cd)ef", the contents of the top level parentheses. If - there are more than 15 capturing parentheses in a pattern, - PCRE has to obtain extra memory to store data during a - recursion, which it does by using pcre_malloc, freeing it - via pcre_free afterwards. If no memory can be obtained, it - saves data for the first 15 capturing parentheses only, as - there is no way to give an out-of-memory error from within a - recursion. - - - -PERFORMANCE - Certain items that may appear in patterns are more efficient - than others. It is more efficient to use a character class - like [aeiou] than a set of alternatives such as (a|e|i|o|u). - In general, the simplest construction that provides the - required behaviour is usually the most efficient. Jeffrey - Friedl's book contains a lot of discussion about optimizing - regular expressions for efficient performance. - - When a pattern begins with .* and the PCRE_DOTALL option is - set, the pattern is implicitly anchored by PCRE, since it - can match only at the start of a subject string. However, if - PCRE_DOTALL is not set, PCRE cannot make this optimization, - because the . metacharacter does not then match a newline, - and if the subject string contains newlines, the pattern may - match from the character immediately following one of them - instead of from the very start. For example, the pattern - - (.*) second - - matches the subject "first\nand second" (where \n stands for - a newline character) with the first captured substring being - "and". In order to do this, PCRE has to retry the match - starting after every newline in the subject. - - If you are using such a pattern with subject strings that do - not contain newlines, the best performance is obtained by - setting PCRE_DOTALL, or starting the pattern with ^.* to - indicate explicit anchoring. That saves PCRE from having to - scan along the subject looking for a newline to restart at. - - Beware of patterns that contain nested indefinite repeats. - These can take a long time to run when applied to a string - that does not match. Consider the pattern fragment - - (a+)* - - This can match "aaaa" in 33 different ways, and this number - increases very rapidly as the string gets longer. (The * - repeat can match 0, 1, 2, 3, or 4 times, and for each of - those cases other than 0, the + repeats can match different - numbers of times.) When the remainder of the pattern is such - that the entire match is going to fail, PCRE has in princi- - ple to try every possible variation, and this can take an - extremely long time. - - An optimization catches some of the more simple cases such - as - - (a+)*b - - where a literal character follows. Before embarking on the - standard matching procedure, PCRE checks that there is a "b" - later in the subject string, and if there is not, it fails - the match immediately. However, when there is no following - literal this optimization cannot be used. You can see the - difference by comparing the behaviour of - - (a+)*\d - - with the pattern above. The former gives a failure almost - instantly when applied to a whole line of "a" characters, - whereas the latter takes an appreciable time with strings - longer than about 20 characters. - - - -UTF-8 SUPPORT - Starting at release 3.3, PCRE has some support for character - strings encoded in the UTF-8 format. This is incomplete, and - is regarded as experimental. In order to use it, you must - configure PCRE to include UTF-8 support in the code, and, in - addition, you must call pcre_compile() with the PCRE_UTF8 - option flag. When you do this, both the pattern and any sub- - ject strings that are matched against it are treated as - UTF-8 strings instead of just strings of bytes, but only in - the cases that are mentioned below. - - If you compile PCRE with UTF-8 support, but do not use it at - run time, the library will be a bit bigger, but the addi- - tional run time overhead is limited to testing the PCRE_UTF8 - flag in several places, so should not be very large. - - PCRE assumes that the strings it is given contain valid - UTF-8 codes. It does not diagnose invalid UTF-8 strings. If - you pass invalid UTF-8 strings to PCRE, the results are - undefined. - - Running with PCRE_UTF8 set causes these changes in the way - PCRE works: - - 1. In a pattern, the escape sequence \x{...}, where the con- - tents of the braces is a string of hexadecimal digits, is - interpreted as a UTF-8 character whose code number is the - given hexadecimal number, for example: \x{1234}. This - inserts from one to six literal bytes into the pattern, - using the UTF-8 encoding. If a non-hexadecimal digit appears - between the braces, the item is not recognized. - - 2. The original hexadecimal escape sequence, \xhh, generates - a two-byte UTF-8 character if its value is greater than 127. - - 3. Repeat quantifiers are NOT correctly handled if they fol- - low a multibyte character. For example, \x{100}* and \xc3+ - do not work. If you want to repeat such characters, you must - enclose them in non-capturing parentheses, for example - (?:\x{100}), at present. - - 4. The dot metacharacter matches one UTF-8 character instead - of a single byte. - - 5. Unlike literal UTF-8 characters, the dot metacharacter - followed by a repeat quantifier does operate correctly on - UTF-8 characters instead of single bytes. - - 4. Although the \x{...} escape is permitted in a character - class, characters whose values are greater than 255 cannot - be included in a class. - - 5. A class is matched against a UTF-8 character instead of - just a single byte, but it can match only characters whose - values are less than 256. Characters with greater values - always fail to match a class. - - 6. Repeated classes work correctly on multiple characters. - - 7. Classes containing just a single character whose value is - greater than 127 (but less than 256), for example, [\x80] or - [^\x{93}], do not work because these are optimized into sin- - gle byte matches. In the first case, of course, the class - brackets are just redundant. - - 8. Lookbehind assertions move backwards in the subject by a - fixed number of characters instead of a fixed number of - bytes. Simple cases have been tested to work correctly, but - there may be hidden gotchas herein. - - 9. The character types such as \d and \w do not work - correctly with UTF-8 characters. They continue to test a - single byte. - - 10. Anything not explicitly mentioned here continues to work - in bytes rather than in characters. - - The following UTF-8 features of Perl 5.6 are not imple- - mented: - 1. The escape sequence \C to match a single byte. - - 2. The use of Unicode tables and properties and escapes \p, - \P, and \X. - - - -AUTHOR - Philip Hazel ph10@cam.ac.uk - University Computing Service, - New Museums Site, - Cambridge CB2 3QG, England. - Phone: +44 1223 334714 - - Last updated: 28 August 2000, - the 250th anniversary of the death of J.S. Bach. - Copyright (c) 1997-2000 University of Cambridge. diff --git a/external/privoxy/pcre/doc/pcregrep.1 b/external/privoxy/pcre/doc/pcregrep.1 deleted file mode 100644 index ec733fa..0000000 --- a/external/privoxy/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<stdio.h>\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 ph10@cam.ac.uk -.br -Copyright (c) 1997-2000 University of Cambridge. diff --git a/external/privoxy/pcre/doc/pcregrep.html b/external/privoxy/pcre/doc/pcregrep.html deleted file mode 100644 index 19f733c..0000000 --- a/external/privoxy/pcre/doc/pcregrep.html +++ /dev/null @@ -1,105 +0,0 @@ -<HTML> -<HEAD> -<TITLE>pcregrep specification</TITLE> -</HEAD> -<body bgcolor="#FFFFFF" text="#00005A"> -<H1>pcregrep specification</H1> -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. -<UL> -<LI><A NAME="TOC1" HREF="#SEC1">NAME</A> -<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A> -<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A> -<LI><A NAME="TOC4" HREF="#SEC4">OPTIONS</A> -<LI><A NAME="TOC5" HREF="#SEC5">SEE ALSO</A> -<LI><A NAME="TOC6" HREF="#SEC6">DIAGNOSTICS</A> -<LI><A NAME="TOC7" HREF="#SEC7">AUTHOR</A> -</UL> -<LI><A NAME="SEC1" HREF="#TOC1">NAME</A> -<P> -pcregrep - a grep with Perl-compatible regular expressions. -</P> -<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A> -<P> -<B>pcregrep [-Vchilnsvx] pattern [file] ...</B> -</P> -<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A> -<P> -<B>pcregrep</B> 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 -<B>pcre(3)</B> for a full description of syntax and semantics. -</P> -<P> -If no files are specified, <B>pcregrep</B> 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 <B>pcregrep</B> behaves. -</P> -<P> -Lines are limited to BUFSIZ characters. BUFSIZ is defined in <B><stdio.h></B>. -The newline character is removed from the end of each line before it is matched -against the pattern. -</P> -<LI><A NAME="SEC4" HREF="#TOC1">OPTIONS</A> -<P> -<B>-V</B> -Write the version number of the PCRE library being used to the standard error -stream. -</P> -<P> -<B>-c</B> -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. -</P> -<P> -<B>-h</B> -Suppress printing of filenames when searching multiple files. -</P> -<P> -<B>-i</B> -Ignore upper/lower case distinctions during comparisons. -</P> -<P> -<B>-l</B> -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. -</P> -<P> -<B>-n</B> -Precede each line by its line number in the file. -</P> -<P> -<B>-s</B> -Work silently, that is, display nothing except error messages. -The exit status indicates whether any matches were found. -</P> -<P> -<B>-v</B> -Invert the sense of the match, so that lines which do <I>not</I> match the -pattern are now the ones that are found. -</P> -<P> -<B>-x</B> -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. -</P> -<LI><A NAME="SEC5" HREF="#TOC1">SEE ALSO</A> -<P> -<B>pcre(3)</B>, Perl 5 documentation -</P> -<LI><A NAME="SEC6" HREF="#TOC1">DIAGNOSTICS</A> -<P> -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). -</P> -<LI><A NAME="SEC7" HREF="#TOC1">AUTHOR</A> -<P> -Philip Hazel <ph10@cam.ac.uk> -<BR> -Copyright (c) 1997-2000 University of Cambridge. diff --git a/external/privoxy/pcre/doc/pcregrep.txt b/external/privoxy/pcre/doc/pcregrep.txt deleted file mode 100644 index 871350c..0000000 --- a/external/privoxy/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 - <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 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 ph10@cam.ac.uk - Copyright (c) 1997-2000 University of Cambridge. - diff --git a/external/privoxy/pcre/doc/pcreposix.3 b/external/privoxy/pcre/doc/pcreposix.3 deleted file mode 100644 index 4853a97..0000000 --- a/external/privoxy/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 <pcreposix.h> -.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 ph10@cam.ac.uk -.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/external/privoxy/pcre/doc/pcreposix.html b/external/privoxy/pcre/doc/pcreposix.html deleted file mode 100644 index 79ff544..0000000 --- a/external/privoxy/pcre/doc/pcreposix.html +++ /dev/null @@ -1,191 +0,0 @@ -<HTML> -<HEAD> -<TITLE>pcreposix specification</TITLE> -</HEAD> -<body bgcolor="#FFFFFF" text="#00005A"> -<H1>pcreposix specification</H1> -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. -<UL> -<LI><A NAME="TOC1" HREF="#SEC1">NAME</A> -<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A> -<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A> -<LI><A NAME="TOC4" HREF="#SEC4">COMPILING A PATTERN</A> -<LI><A NAME="TOC5" HREF="#SEC5">MATCHING A PATTERN</A> -<LI><A NAME="TOC6" HREF="#SEC6">ERROR MESSAGES</A> -<LI><A NAME="TOC7" HREF="#SEC7">STORAGE</A> -<LI><A NAME="TOC8" HREF="#SEC8">AUTHOR</A> -</UL> -<LI><A NAME="SEC1" HREF="#TOC1">NAME</A> -<P> -pcreposix - POSIX API for Perl-compatible regular expressions. -</P> -<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A> -<P> -<B>#include <pcreposix.h></B> -</P> -<P> -<B>int regcomp(regex_t *<I>preg</I>, const char *<I>pattern</I>,</B> -<B>int <I>cflags</I>);</B> -</P> -<P> -<B>int regexec(regex_t *<I>preg</I>, const char *<I>string</I>,</B> -<B>size_t <I>nmatch</I>, regmatch_t <I>pmatch</I>[], int <I>eflags</I>);</B> -</P> -<P> -<B>size_t regerror(int <I>errcode</I>, const regex_t *<I>preg</I>,</B> -<B>char *<I>errbuf</I>, size_t <I>errbuf_size</I>);</B> -</P> -<P> -<B>void regfree(regex_t *<I>preg</I>);</B> -</P> -<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A> -<P> -This set of functions provides a POSIX-style API to the PCRE regular expression -package. See the <B>pcre</B> documentation for a description of the native API, -which contains additional functionality. -</P> -<P> -The functions described here are just wrapper functions that ultimately call -the native API. Their prototypes are defined in the <B>pcreposix.h</B> header -file, and on Unix systems the library itself is called <B>pcreposix.a</B>, so -can be accessed by adding <B>-lpcreposix</B> 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. -</P> -<P> -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. -</P> -<P> -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. -</P> -<P> -The header for these functions is supplied as <B>pcreposix.h</B> to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as <B>regex.h</B>, which is the "correct" name. It provides two -structure types, <I>regex_t</I> for compiled internal forms, and -<I>regmatch_t</I> for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -</P> -<LI><A NAME="SEC4" HREF="#TOC1">COMPILING A PATTERN</A> -<P> -The function <B>regcomp()</B> 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 <I>pattern</I>. The <I>preg</I> argument is a pointer -to a regex_t structure which is used as a base for storing information about -the compiled expression. -</P> -<P> -The argument <I>cflags</I> is either zero, or contains one or more of the bits -defined by the following macros: -</P> -<P> -<PRE> - REG_ICASE -</PRE> -</P> -<P> -The PCRE_CASELESS option is set when the expression is passed for compilation -to the native function. -</P> -<P> -<PRE> - REG_NEWLINE -</PRE> -</P> -<P> -The PCRE_MULTILINE option is set when the expression is passed for compilation -to the native function. -</P> -<P> -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 -<I>some</I> 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). -</P> -<P> -The yield of <B>regcomp()</B> is zero on success, and non-zero otherwise. The -<I>preg</I> structure is filled in on success, and one member of the structure -is publicized: <I>re_nsub</I> contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -</P> -<LI><A NAME="SEC5" HREF="#TOC1">MATCHING A PATTERN</A> -<P> -The function <B>regexec()</B> is called to match a pre-compiled pattern -<I>preg</I> against a given <I>string</I>, which is terminated by a zero byte, -subject to the options in <I>eflags</I>. These can be: -</P> -<P> -<PRE> - REG_NOTBOL -</PRE> -</P> -<P> -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -</P> -<P> -<PRE> - REG_NOTEOL -</PRE> -</P> -<P> -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -</P> -<P> -The portion of the string that was matched, and also any captured substrings, -are returned via the <I>pmatch</I> argument, which points to an array of -<I>nmatch</I> structures of type <I>regmatch_t</I>, containing the members -<I>rm_so</I> and <I>rm_eo</I>. 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 <I>string</I> 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. -</P> -<P> -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. -</P> -<LI><A NAME="SEC6" HREF="#TOC1">ERROR MESSAGES</A> -<P> -The <B>regerror()</B> function maps a non-zero errorcode from either -<B>regcomp</B> or <B>regexec</B> to a printable message. If <I>preg</I> is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in <I>errbuf</I>. The length of the -message, including the zero, is limited to <I>errbuf_size</I>. The yield of the -function is the size of buffer needed to hold the whole message. -</P> -<LI><A NAME="SEC7" HREF="#TOC1">STORAGE</A> -<P> -Compiling a regular expression causes memory to be allocated and associated -with the <I>preg</I> structure. The function <B>regfree()</B> frees all such -memory, after which <I>preg</I> may no longer be used as a compiled expression. -</P> -<LI><A NAME="SEC8" HREF="#TOC1">AUTHOR</A> -<P> -Philip Hazel <ph10@cam.ac.uk> -<BR> -University Computing Service, -<BR> -New Museums Site, -<BR> -Cambridge CB2 3QG, England. -<BR> -Phone: +44 1223 334714 -</P> -<P> -Copyright (c) 1997-2000 University of Cambridge. diff --git a/external/privoxy/pcre/doc/pcreposix.txt b/external/privoxy/pcre/doc/pcreposix.txt deleted file mode 100644 index 2d76f7c..0000000 --- a/external/privoxy/pcre/doc/pcreposix.txt +++ /dev/null @@ -1,159 +0,0 @@ -NAME - pcreposix - POSIX API for Perl-compatible regular expres- - sions. - - - -SYNOPSIS - #include <pcreposix.h> - - int regcomp(regex_t *preg, const char *pattern, - int cflags); - - int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); - - void regfree(regex_t *preg); - - - -DESCRIPTION - This set of functions provides a POSIX-style API to the PCRE - regular expression package. See the pcre documentation for a - description of the native API, which contains additional - functionality. - - The functions described here are just wrapper functions that - ultimately call the native API. Their prototypes are defined - in the pcreposix.h header file, and on Unix systems the - library itself is called pcreposix.a, so can be accessed by - adding -lpcreposix to the command for linking an application - which uses them. Because the POSIX functions call the native - ones, it is also necessary to add -lpcre. - - I have implemented only those option bits that can be rea- - sonably mapped to PCRE native options. In addition, the - options REG_EXTENDED and REG_NOSUB are defined with the - value zero. They have no effect, but since programs that are - written to the POSIX interface often use them, this makes it - easier to slot in PCRE as a replacement library. Other POSIX - options are not even defined. - - When PCRE is called via these functions, it is only the API - that is POSIX-like in style. The syntax and semantics of the - regular expressions themselves are still those of Perl, sub- - ject to the setting of various PCRE options, as described - below. - - The header for these functions is supplied as pcreposix.h to - avoid any potential clash with other POSIX libraries. It - can, of course, be renamed or aliased as regex.h, which is - the "correct" name. It provides two structure types, regex_t - for compiled internal forms, and regmatch_t for returning - captured substrings. It also defines some constants whose - names start with "REG_"; these are used for setting options - and identifying error codes. - - - -COMPILING A PATTERN - The function regcomp() is called to compile a pattern into - an internal form. The pattern is a C string terminated by a - binary zero, and is passed in the argument pattern. The preg - argument is a pointer to a regex_t structure which is used - as a base for storing information about the compiled expres- - sion. - - The argument cflags is either zero, or contains one or more - of the bits defined by the following macros: - - REG_ICASE - - The PCRE_CASELESS option is set when the expression is - passed for compilation to the native function. - - REG_NEWLINE - - The PCRE_MULTILINE option is set when the expression is - passed for compilation to the native function. - - In the absence of these flags, no options are passed to the - native function. This means the the regex is compiled with - PCRE default semantics. In particular, the way it handles - newline characters in the subject string is the Perl way, - not the POSIX way. Note that setting PCRE_MULTILINE has only - some of the effects specified for REG_NEWLINE. It does not - affect the way newlines are matched by . (they aren't) or a - negative class such as [^a] (they are). - - The yield of regcomp() is zero on success, and non-zero oth- - erwise. The preg structure is filled in on success, and one - member of the structure is publicized: re_nsub contains the - number of capturing subpatterns in the regular expression. - Various error codes are defined in the header file. - - - -MATCHING A PATTERN - The function regexec() is called to match a pre-compiled - pattern preg against a given string, which is terminated by - a zero byte, subject to the options in eflags. These can be: - - REG_NOTBOL - - The PCRE_NOTBOL option is set when calling the underlying - PCRE matching function. - - REG_NOTEOL - - The PCRE_NOTEOL option is set when calling the underlying - PCRE matching function. - - The portion of the string that was matched, and also any - captured substrings, are returned via the pmatch argument, - which points to an array of nmatch structures of type - regmatch_t, containing the members rm_so and rm_eo. These - contain the offset to the first character of each substring - and the offset to the first character after the end of each - substring, respectively. The 0th element of the vector - relates to the entire portion of string that was matched; - subsequent elements relate to the capturing subpatterns of - the regular expression. Unused entries in the array have - both structure members set to -1. - - A successful match yields a zero return; various error codes - are defined in the header file, of which REG_NOMATCH is the - "expected" failure code. - - - -ERROR MESSAGES - The regerror() function maps a non-zero errorcode from - either regcomp or regexec to a printable message. If preg is - not NULL, the error should have arisen from the use of that - structure. A message terminated by a binary zero is placed - in errbuf. The length of the message, including the zero, is - limited to errbuf_size. The yield of the function is the - size of buffer needed to hold the whole message. - - - -STORAGE - Compiling a regular expression causes memory to be allocated - and associated with the preg structure. The function reg- - free() frees all such memory, after which preg may no longer - be used as a compiled expression. - - - -AUTHOR - Philip Hazel ph10@cam.ac.uk - University Computing Service, - New Museums Site, - Cambridge CB2 3QG, England. - Phone: +44 1223 334714 - - Copyright (c) 1997-2000 University of Cambridge. diff --git a/external/privoxy/pcre/doc/pcretest.txt b/external/privoxy/pcre/doc/pcretest.txt deleted file mode 100644 index 722e6b8..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk -August 2000 diff --git a/external/privoxy/pcre/doc/perltest.txt b/external/privoxy/pcre/doc/perltest.txt deleted file mode 100644 index 33155c1..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk -August 2000 diff --git a/external/privoxy/pcre/doc/readme b/external/privoxy/pcre/doc/readme deleted file mode 100644 index d124ee0..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk -August 2000 diff --git a/external/privoxy/pcre/get.c b/external/privoxy/pcre/get.c deleted file mode 100644 index 42e9bd4..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - - Copyright (c) 1997-2000 University of Cambridge - ------------------------------------------------------------------------------ -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. ------------------------------------------------------------------------------ -*/ - -/* This module contains some convenience functions for extracting substrings -from the subject string after a regex match has succeeded. The original idea -for these functions came from Scott Wimer scottw@cgibuilder.com. */ - - -/* Include the internals header, which itself includes Standard C headers plus -the external pcre header. */ - -#include "internal.h" - - - -/************************************************* -* Copy captured string to given buffer * -*************************************************/ - -/* This function copies a single captured substring into a given buffer. -Note that we use memcpy() rather than strncpy() in case there are binary zeros -in the string. - -Arguments: - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - stringnumber the number of the required substring - buffer where to put the substring - size the size of the buffer - -Returns: if successful: - the length of the copied string, not including the zero - that is put on the end; can be zero - if not successful: - PCRE_ERROR_NOMEMORY (-6) buffer too small - PCRE_ERROR_NOSUBSTRING (-7) no such captured substring -*/ - -int -pcre_copy_substring(const char *subject, int *ovector, int stringcount, - int stringnumber, char *buffer, int size) -{ -int yield; -if (stringnumber < 0 || stringnumber >= stringcount) - return PCRE_ERROR_NOSUBSTRING; -stringnumber *= 2; -yield = ovector[stringnumber+1] - ovector[stringnumber]; -if (size < yield + 1) return PCRE_ERROR_NOMEMORY; -memcpy(buffer, subject + ovector[stringnumber], yield); -buffer[yield] = 0; -return yield; -} - - - -/************************************************* -* Copy all captured strings to new store * -*************************************************/ - -/* This function gets one chunk of store and builds a list of pointers and all -of the captured substrings in it. A NULL pointer is put on the end of the list. - -Arguments: - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - listptr set to point to the list of pointers - -Returns: if successful: 0 - if not successful: - PCRE_ERROR_NOMEMORY (-6) failed to get store -*/ - -int -pcre_get_substring_list(const char *subject, int *ovector, int stringcount, - const char ***listptr) -{ -int i; -int size = sizeof(char *); -int double_count = stringcount * 2; -char **stringlist; -char *p; - -for (i = 0; i < double_count; i += 2) - size += sizeof(char *) + ovector[i+1] - ovector[i] + 1; - -stringlist = (char **)(pcre_malloc)(size); -if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; - -*listptr = (const char **)stringlist; -p = (char *)(stringlist + stringcount + 1); - -for (i = 0; i < double_count; i += 2) - { - int len = ovector[i+1] - ovector[i]; - memcpy(p, subject + ovector[i], len); - *stringlist++ = p; - p += len; - *p++ = 0; - } - -*stringlist = NULL; -return 0; -} - - - -/************************************************* -* Free store obtained by get_substring_list * -*************************************************/ - -/* This function exists for the benefit of people calling PCRE from non-C -programs that can call its functions, but not free() or (pcre_free)() directly. - -Argument: the result of a previous pcre_get_substring_list() -Returns: nothing -*/ - -void -pcre_free_substring_list(const char **pointer) -{ -(pcre_free)((void *)pointer); -} - - - -/************************************************* -* Copy captured string to new store * -*************************************************/ - -/* This function copies a single captured substring into a piece of new -store - -Arguments: - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - stringnumber the number of the required substring - stringptr where to put a pointer to the substring - -Returns: if successful: - the length of the string, not including the zero that - is put on the end; can be zero - if not successful: - PCRE_ERROR_NOMEMORY (-6) failed to get store - PCRE_ERROR_NOSUBSTRING (-7) substring not present -*/ - -int -pcre_get_substring(const char *subject, int *ovector, int stringcount, - int stringnumber, const char **stringptr) -{ -int yield; -char *substring; -if (stringnumber < 0 || stringnumber >= stringcount) - return PCRE_ERROR_NOSUBSTRING; -stringnumber *= 2; -yield = ovector[stringnumber+1] - ovector[stringnumber]; -substring = (char *)(pcre_malloc)(yield + 1); -if (substring == NULL) return PCRE_ERROR_NOMEMORY; -memcpy(substring, subject + ovector[stringnumber], yield); -substring[yield] = 0; -*stringptr = substring; -return yield; -} - - - -/************************************************* -* Free store obtained by get_substring * -*************************************************/ - -/* This function exists for the benefit of people calling PCRE from non-C -programs that can call its functions, but not free() or (pcre_free)() directly. - -Argument: the result of a previous pcre_get_substring() -Returns: nothing -*/ - -void -pcre_free_substring(const char *pointer) -{ -(pcre_free)((void *)pointer); -} - -/* End of get.c */ diff --git a/external/privoxy/pcre/install b/external/privoxy/pcre/install deleted file mode 100644 index 0880281..0000000 --- a/external/privoxy/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/external/privoxy/pcre/install-sh b/external/privoxy/pcre/install-sh deleted file mode 100644 index e9de238..0000000 --- a/external/privoxy/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/external/privoxy/pcre/internal.h b/external/privoxy/pcre/internal.h deleted file mode 100644 index 25bb7f8..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - - Copyright (c) 1997-2000 University of Cambridge - ------------------------------------------------------------------------------ -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. ------------------------------------------------------------------------------ -*/ - -/* This header contains definitions that are shared between the different -modules, but which are not relevant to the outside. */ - -/* Get the definitions provided by running "configure" */ - -#include "config.h" - -/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), -define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY -is set. Otherwise, include an emulating function for those systems that have -neither (there some non-Unix environments where this is the case). This assumes -that all calls to memmove are moving strings upwards in store, which is the -case in PCRE. */ - -#if ! HAVE_MEMMOVE -#undef memmove /* some systems may have a macro */ -#if HAVE_BCOPY -#define memmove(a, b, c) bcopy(b, a, c) -#else -void * -pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n) -{ -int i; -dest += n; -src += n; -for (i = 0; i < n; ++i) *(--dest) = *(--src); -} -#define memmove(a, b, c) pcre_memmove(a, b, c) -#endif -#endif - -/* Standard C headers plus the external interface definition */ - -#include <ctype.h> -#include <limits.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "pcre.h" - -/* In case there is no definition of offsetof() provided - though any proper -Standard C system should have one. */ - -#ifndef offsetof -#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) -#endif - -/* These are the public options that can change during matching. */ - -#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) - -/* Private options flags start at the most significant end of the four bytes, -but skip the top bit so we can use ints for convenience without getting tangled -with negative values. The public options defined in pcre.h start at the least -significant end. Make sure they don't overlap, though now that we have expanded -to four bytes there is plenty of space. */ - -#define PCRE_FIRSTSET 0x40000000 /* first_char is set */ -#define PCRE_REQCHSET 0x20000000 /* req_char is set */ -#define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */ -#define PCRE_INGROUP 0x08000000 /* compiling inside a group */ -#define PCRE_ICHANGED 0x04000000 /* i option changes within regex */ - -/* Options for the "extra" block produced by pcre_study(). */ - -#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ - -/* Masks for identifying the public options which are permitted at compile -time, run time or study time, respectively. */ - -#define PUBLIC_OPTIONS \ - (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ - PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8) - -#define PUBLIC_EXEC_OPTIONS \ - (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY) - -#define PUBLIC_STUDY_OPTIONS 0 /* None defined */ - -/* Magic number to provide a small check against being handed junk. */ - -#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ - -/* Miscellaneous definitions */ - -typedef int BOOL; - -#define FALSE 0 -#define TRUE 1 - -/* These are escaped items that aren't just an encoding of a particular data -value such as \n. They must have non-zero values, as check_escape() returns -their negation. Also, they must appear in the same order as in the opcode -definitions below, up to ESC_z. The final one must be ESC_REF as subsequent -values are used for \1, \2, \3, etc. There is a test in the code for an escape -greater than ESC_b and less than ESC_X to detect the types that may be -repeated. If any new escapes are put in-between that don't consume a character, -that code will have to change. */ - -enum { ESC_A = 1, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w, - ESC_Z, ESC_z, ESC_REF }; - -/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets -that extract substrings. Starting from 1 (i.e. after OP_END), the values up to -OP_EOD must correspond in order to the list of escapes immediately above. */ - -enum { - OP_END, /* End of pattern */ - - /* Values corresponding to backslashed metacharacters */ - - OP_SOD, /* Start of data: \A */ - OP_NOT_WORD_BOUNDARY, /* \B */ - OP_WORD_BOUNDARY, /* \b */ - OP_NOT_DIGIT, /* \D */ - OP_DIGIT, /* \d */ - OP_NOT_WHITESPACE, /* \S */ - OP_WHITESPACE, /* \s */ - OP_NOT_WORDCHAR, /* \W */ - OP_WORDCHAR, /* \w */ - OP_EODN, /* End of data or \n at end of data: \Z. */ - OP_EOD, /* End of data: \z */ - - OP_OPT, /* Set runtime options */ - OP_CIRC, /* Start of line - varies with multiline switch */ - OP_DOLL, /* End of line - varies with multiline switch */ - OP_ANY, /* Match any character */ - OP_CHARS, /* Match string of characters */ - OP_NOT, /* Match anything but the following char */ - - OP_STAR, /* The maximizing and minimizing versions of */ - OP_MINSTAR, /* all these opcodes must come in pairs, with */ - OP_PLUS, /* the minimizing one second. */ - OP_MINPLUS, /* This first set applies to single characters */ - OP_QUERY, - OP_MINQUERY, - OP_UPTO, /* From 0 to n matches */ - OP_MINUPTO, - OP_EXACT, /* Exactly n matches */ - - OP_NOTSTAR, /* The maximizing and minimizing versions of */ - OP_NOTMINSTAR, /* all these opcodes must come in pairs, with */ - OP_NOTPLUS, /* the minimizing one second. */ - OP_NOTMINPLUS, /* This first set applies to "not" single characters */ - OP_NOTQUERY, - OP_NOTMINQUERY, - OP_NOTUPTO, /* From 0 to n matches */ - OP_NOTMINUPTO, - OP_NOTEXACT, /* Exactly n matches */ - - OP_TYPESTAR, /* The maximizing and minimizing versions of */ - OP_TYPEMINSTAR, /* all these opcodes must come in pairs, with */ - OP_TYPEPLUS, /* the minimizing one second. These codes must */ - OP_TYPEMINPLUS, /* be in exactly the same order as those above. */ - OP_TYPEQUERY, /* This set applies to character types such as \d */ - OP_TYPEMINQUERY, - OP_TYPEUPTO, /* From 0 to n matches */ - OP_TYPEMINUPTO, - OP_TYPEEXACT, /* Exactly n matches */ - - OP_CRSTAR, /* The maximizing and minimizing versions of */ - OP_CRMINSTAR, /* all these opcodes must come in pairs, with */ - OP_CRPLUS, /* the minimizing one second. These codes must */ - OP_CRMINPLUS, /* be in exactly the same order as those above. */ - OP_CRQUERY, /* These are for character classes and back refs */ - OP_CRMINQUERY, - OP_CRRANGE, /* These are different to the three seta above. */ - OP_CRMINRANGE, - - OP_CLASS, /* Match a character class */ - OP_REF, /* Match a back reference */ - OP_RECURSE, /* Match this pattern recursively */ - - OP_ALT, /* Start of alternation */ - OP_KET, /* End of group that doesn't have an unbounded repeat */ - OP_KETRMAX, /* These two must remain together and in this */ - OP_KETRMIN, /* order. They are for groups the repeat for ever. */ - - /* The assertions must come before ONCE and COND */ - - OP_ASSERT, /* Positive lookahead */ - OP_ASSERT_NOT, /* Negative lookahead */ - OP_ASSERTBACK, /* Positive lookbehind */ - OP_ASSERTBACK_NOT, /* Negative lookbehind */ - OP_REVERSE, /* Move pointer back - used in lookbehind assertions */ - - /* ONCE and COND must come after the assertions, with ONCE first, as there's - a test for >= ONCE for a subpattern that isn't an assertion. */ - - OP_ONCE, /* Once matched, don't back up into the subpattern */ - OP_COND, /* Conditional group */ - OP_CREF, /* Used to hold an extraction string number */ - - OP_BRAZERO, /* These two must remain together and in this */ - OP_BRAMINZERO, /* order. */ - - OP_BRA /* This and greater values are used for brackets that - extract substrings. */ -}; - -/* The highest extraction number. This is limited by the number of opcodes -left after OP_BRA, i.e. 255 - OP_BRA. We actually set it somewhat lower. */ - -#define EXTRACT_MAX 99 - -/* The texts of compile-time error messages are defined as macros here so that -they can be accessed by the POSIX wrapper and converted into error codes. Yes, -I could have used error codes in the first place, but didn't feel like changing -just to accommodate the POSIX wrapper. */ - -#define ERR1 "\ at end of pattern" -#define ERR2 "\c at end of pattern" -#define ERR3 "unrecognized character follows \" -#define ERR4 "numbers out of order in {} quantifier" -#define ERR5 "number too big in {} quantifier" -#define ERR6 "missing terminating ] for character class" -#define ERR7 "invalid escape sequence in character class" -#define ERR8 "range out of order in character class" -#define ERR9 "nothing to repeat" -#define ERR10 "operand of unlimited repeat could match the empty string" -#define ERR11 "internal error: unexpected repeat" -#define ERR12 "unrecognized character after (?" -#define ERR13 "too many capturing parenthesized sub-patterns" -#define ERR14 "missing )" -#define ERR15 "back reference to non-existent subpattern" -#define ERR16 "erroffset passed as NULL" -#define ERR17 "unknown option bit(s) set" -#define ERR18 "missing ) after comment" -#define ERR19 "too many sets of parentheses" -#define ERR20 "regular expression too large" -#define ERR21 "failed to get memory" -#define ERR22 "unmatched parentheses" -#define ERR23 "internal error: code overflow" -#define ERR24 "unrecognized character after (?<" -#define ERR25 "lookbehind assertion is not fixed length" -#define ERR26 "malformed number after (?(" -#define ERR27 "conditional group contains more than two branches" -#define ERR28 "assertion expected after (?(" -#define ERR29 "(?p must be followed by )" -#define ERR30 "unknown POSIX class name" -#define ERR31 "POSIX collating elements are not supported" -#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support" -#define ERR33 "characters with values > 255 are not yet supported in classes" -#define ERR34 "character value in \x{...} sequence is too large" -#define ERR35 "invalid condition (?(0)" - -/* All character handling must be done as unsigned characters. Otherwise there -are problems with top-bit-set characters and functions such as isspace(). -However, we leave the interface to the outside world as char *, because that -should make things easier for callers. We define a short type for unsigned char -to save lots of typing. I tried "uchar", but it causes problems on Digital -Unix, where it is defined in sys/types, so use "uschar" instead. */ - -typedef unsigned char uschar; - -/* The real format of the start of the pcre block; the actual code vector -runs on as long as necessary after the end. */ - -typedef struct real_pcre { - unsigned long int magic_number; - size_t size; - const unsigned char *tables; - unsigned long int options; - uschar top_bracket; - uschar top_backref; - uschar first_char; - uschar req_char; - uschar code[1]; -} real_pcre; - -/* The real format of the extra block returned by pcre_study(). */ - -typedef struct real_pcre_extra { - uschar options; - uschar start_bits[32]; -} real_pcre_extra; - - -/* Structure for passing "static" information around between the functions -doing the compiling, so that they are thread-safe. */ - -typedef struct compile_data { - const uschar *lcc; /* Points to lower casing table */ - const uschar *fcc; /* Points to case-flipping table */ - const uschar *cbits; /* Points to character type table */ - const uschar *ctypes; /* Points to table of type maps */ -} compile_data; - -/* Structure for passing "static" information around between the functions -doing the matching, so that they are thread-safe. */ - -typedef struct match_data { - int errorcode; /* As it says */ - int *offset_vector; /* Offset vector */ - int offset_end; /* One past the end */ - int offset_max; /* The maximum usable for return data */ - const uschar *lcc; /* Points to lower casing table */ - const uschar *ctypes; /* Points to table of type maps */ - BOOL offset_overflow; /* Set if too many extractions */ - BOOL notbol; /* NOTBOL flag */ - BOOL noteol; /* NOTEOL flag */ - BOOL utf8; /* UTF8 flag */ - BOOL endonly; /* Dollar not before final \n */ - BOOL notempty; /* Empty string match not wanted */ - const uschar *start_pattern; /* For use when recursing */ - const uschar *start_subject; /* Start of the subject string */ - const uschar *end_subject; /* End of the subject string */ - const uschar *start_match; /* Start of this match attempt */ - const uschar *end_match_ptr; /* Subject position at end match */ - int end_offset_top; /* Highwater mark at end of match */ -} match_data; - -/* Bit definitions for entries in the pcre_ctypes table. */ - -#define ctype_space 0x01 -#define ctype_letter 0x02 -#define ctype_digit 0x04 -#define ctype_xdigit 0x08 -#define ctype_word 0x10 /* alphameric or '_' */ -#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ - -/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set -of bits for a class map. Some classes are built by combining these tables. */ - -#define cbit_space 0 /* [:space:] or \s */ -#define cbit_xdigit 32 /* [:xdigit:] */ -#define cbit_digit 64 /* [:digit:] or \d */ -#define cbit_upper 96 /* [:upper:] */ -#define cbit_lower 128 /* [:lower:] */ -#define cbit_word 160 /* [:word:] or \w */ -#define cbit_graph 192 /* [:graph:] */ -#define cbit_print 224 /* [:print:] */ -#define cbit_punct 256 /* [:punct:] */ -#define cbit_cntrl 288 /* [:cntrl:] */ -#define cbit_length 320 /* Length of the cbits table */ - -/* Offsets of the various tables from the base tables pointer, and -total length. */ - -#define lcc_offset 0 -#define fcc_offset 256 -#define cbits_offset 512 -#define ctypes_offset (cbits_offset + cbit_length) -#define tables_length (ctypes_offset + 256) - -/* End of internal.h */ diff --git a/external/privoxy/pcre/licence b/external/privoxy/pcre/licence deleted file mode 100644 index 34d20db..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - -University of Cambridge Computing Service, -Cambridge, England. Phone: +44 1223 334714. - -Copyright (c) 1997-2000 University of Cambridge - -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. In practice, this means that if you use - PCRE in software which you distribute to others, commercially or - otherwise, you must put a sentence like this - - Regular expression support is provided by the PCRE library package, - which is open source software, written by Philip Hazel, and copyright - by the University of Cambridge, England. - - somewhere reasonably visible in your documentation and in any relevant - files or online help data or similar. A reference to the ftp site for - the source, that is, to - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ - - should also be given in the documentation. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. - -End diff --git a/external/privoxy/pcre/ltconfig b/external/privoxy/pcre/ltconfig deleted file mode 100644 index a01334f..0000000 --- a/external/privoxy/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 gord@gnu.ai.mit.edu, 1996 -# -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# A lot of this script is taken from autoconf-2.10. - -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} -echo=echo -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell. - exec "$SHELL" "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<EOF -$* -EOF - exit 0 -fi - -# Find the correct PATH separator. Usually this is `:', but -# DJGPP uses `;' like DOS. -if test "X${PATH_SEPARATOR+set}" != Xset; then - UNAME=${UNAME-`uname 2>/dev/null`} - case X$UNAME in - *-DOS) PATH_SEPARATOR=';' ;; - *) PATH_SEPARATOR=':' ;; - esac -fi - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string="`eval $cmd`") 2>/dev/null && - echo_test_string="`eval $cmd`" && - (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then - break - fi - done -fi - -if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || - test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\/\\/g' - # - # So, first we look for a working echo in the user's PATH. - - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for dir in $PATH /usr/ucb; do - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - echo="$dir/echo" - break - fi - done - IFS="$save_ifs" - - if test "X$echo" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && - test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - echo='print -r' - elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running ltconfig again with it. - ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} - else - # Try using printf. - echo='printf "%s\n"' - if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - # Cool, printf works - : - elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && - test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - echo="$CONFIG_SHELL $0 --fallback-echo" - elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && - test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - echo="$CONFIG_SHELL $0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do - if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "$0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} - else - # Oops. We lost completely, so just stick with echo. - echo=echo - fi - fi - fi - fi -fi - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -sed_quote_subst='s/([\"\`$\\])/\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/([\"\`\\])/\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\$/\\\$/g' - -# The name of this program. -progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` - -# Constants: -PROGRAM=ltconfig -PACKAGE=libtool -VERSION=1.3.4 -TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)" -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -rm="rm -f" - -help="Try `$progname --help' for more information." - -# Global variables: -default_ofile=libtool -can_build_shared=yes -enable_shared=yes -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -enable_static=yes -enable_fast_install=yes -enable_dlopen=unknown -enable_win32_dll=no -ltmain= -silent= -srcdir= -ac_config_guess= -ac_config_sub= -host= -nonopt= -ofile="$default_ofile" -verify_host=yes -with_gcc=no -with_gnu_ld=no -need_locks=yes -ac_ext=c -objext=o -libext=a -exeext= -cache_file= - -old_AR="$AR" -old_CC="$CC" -old_CFLAGS="$CFLAGS" -old_CPPFLAGS="$CPPFLAGS" -old_LDFLAGS="$LDFLAGS" -old_LD="$LD" -old_LN_S="$LN_S" -old_LIBS="$LIBS" -old_NM="$NM" -old_RANLIB="$RANLIB" -old_DLLTOOL="$DLLTOOL" -old_OBJDUMP="$OBJDUMP" -old_AS="$AS" - -# Parse the command line options. -args= -prev= -for option -do - case "$option" in - -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - eval "$prev=$option" - prev= - continue - fi - - case "$option" in - --help) cat <<EOM -Usage: $progname [OPTION]... [HOST [LTMAIN]] - -Generate a system-specific libtool script. - - --debug enable verbose shell tracing - --disable-shared do not build shared libraries - --disable-static do not build static libraries - --disable-fast-install do not optimize for fast installation - --enable-dlopen enable dlopen support - --enable-win32-dll enable building dlls on win32 hosts - --help display this help and exit - --no-verify do not verify that HOST is a valid host type --o, --output=FILE specify the output file [default=$default_ofile] - --quiet same as `--silent' - --silent do not print informational messages - --srcdir=DIR find `config.guess' in DIR - --version output version information and exit - --with-gcc assume that the GNU C compiler will be used - --with-gnu-ld assume that the C compiler uses the GNU linker - --disable-lock disable file locking - --cache-file=FILE configure cache file - -LTMAIN is the `ltmain.sh' shell script fragment or `ltmain.c' program -that provides basic libtool functionality. - -HOST is the canonical host system name [default=guessed]. -EOM - exit 0 - ;; - - --debug) - echo "$progname: enabling shell trace mode" - set -x - ;; - - --disable-shared) enable_shared=no ;; - - --disable-static) enable_static=no ;; - - --disable-fast-install) enable_fast_install=no ;; - - --enable-dlopen) enable_dlopen=yes ;; - - --enable-win32-dll) enable_win32_dll=yes ;; - - --quiet | --silent) silent=yes ;; - - --srcdir) prev=srcdir ;; - --srcdir=*) srcdir="$optarg" ;; - - --no-verify) verify_host=no ;; - - --output | -o) prev=ofile ;; - --output=*) ofile="$optarg" ;; - - --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"; exit 0 ;; - - --with-gcc) with_gcc=yes ;; - --with-gnu-ld) with_gnu_ld=yes ;; - - --disable-lock) need_locks=no ;; - - --cache-file=*) cache_file="$optarg" ;; - - -*) - echo "$progname: unrecognized option `$option'" 1>&2 - echo "$help" 1>&2 - exit 1 - ;; - - *) - if test -z "$ltmain"; then - ltmain="$option" - elif test -z "$host"; then -# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 -# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then -# echo "$progname: warning `$option' is not a valid host type" 1>&2 -# fi - host="$option" - else - echo "$progname: too many arguments" 1>&2 - echo "$help" 1>&2 - exit 1 - fi ;; - esac -done - -if test -z "$ltmain"; then - echo "$progname: you must specify a LTMAIN file" 1>&2 - echo "$help" 1>&2 - exit 1 -fi - -if test ! -f "$ltmain"; then - echo "$progname: `$ltmain' does not exist" 1>&2 - echo "$help" 1>&2 - exit 1 -fi - -# Quote any args containing shell metacharacters. -ltconfig_args= -for arg -do - case "$arg" in - *" "*|*" "*|*[[]~#$^&*(){}\|;<>?]*) - ltconfig_args="$ltconfig_args '$arg'" ;; - *) ltconfig_args="$ltconfig_args $arg" ;; - esac -done - -# A relevant subset of AC_INIT. - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 5 compiler messages saved in config.log -# 6 checking for... messages and results -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>>./config.log - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi -if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi - -if test -n "$cache_file" && test -r "$cache_file"; then - echo "loading cache $cache_file within ltconfig" - . $cache_file -fi - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - -if test -z "$srcdir"; then - # Assume the source directory is the same one as the path to LTMAIN. - srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` - test "$srcdir" = "$ltmain" && srcdir=. -fi - -trap "$rm conftest*; exit 1" 1 2 15 -if test "$verify_host" = yes; then - # Check for config.guess and config.sub. - ac_aux_dir= - for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/config.guess; then - ac_aux_dir=$ac_dir - break - fi - done - if test -z "$ac_aux_dir"; then - echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 - echo "$help" 1>&2 - exit 1 - fi - ac_config_guess=$ac_aux_dir/config.guess - ac_config_sub=$ac_aux_dir/config.sub - - # Make sure we can run config.sub. - if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : - else - echo "$progname: cannot run $ac_config_sub" 1>&2 - echo "$help" 1>&2 - exit 1 - fi - - echo $ac_n "checking host system type""... $ac_c" 1>&6 - - host_alias=$host - case "$host_alias" in - "") - if host_alias=`$SHELL $ac_config_guess`; then : - else - echo "$progname: cannot guess host type; you must specify one" 1>&2 - echo "$help" 1>&2 - exit 1 - fi ;; - esac - host=`$SHELL $ac_config_sub $host_alias` - echo "$ac_t$host" 1>&6 - - # Make sure the host verified. - test -z "$host" && exit 1 - -elif test -z "$host"; then - echo "$progname: you must specify a host type if you use `--no-verify'" 1>&2 - echo "$help" 1>&2 - exit 1 -else - host_alias=$host -fi - -# Transform linux* to *-*-linux-gnu*, to support old configure scripts. -case "$host_os" in -linux-gnu*) ;; -linux*) host=`echo $host | sed 's/^(.*-.*-linux)(.*)$/\1-gnu\2/'` -esac - -host_cpu=`echo $host | sed 's/^([^-]*)-([^-]*)-(.*)$/\1/'` -host_vendor=`echo $host | sed 's/^([^-]*)-([^-]*)-(.*)$/\2/'` -host_os=`echo $host | sed 's/^([^-]*)-([^-]*)-(.*)$/\3/'` - -case "$host_os" in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR cru $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -# Set a sane default for `AR'. -test -z "$AR" && AR=ar - -# Set a sane default for `OBJDUMP'. -test -z "$OBJDUMP" && OBJDUMP=objdump - -# If RANLIB is not set, then run the test. -if test "${RANLIB+set}" != "set"; then - result=no - - echo $ac_n "checking for ranlib... $ac_c" 1>&6 - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then - RANLIB="ranlib" - result="ranlib" - break - fi - done - IFS="$save_ifs" - - echo "$ac_t$result" 1>&6 -fi - -if test -n "$RANLIB"; then - old_archive_cmds="$old_archive_cmds~$RANLIB $oldlib" - old_postinstall_cmds="$RANLIB $oldlib~$old_postinstall_cmds" -fi - -# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$AS" && AS=as - -# Check to see if we are using GCC. -if test "$with_gcc" != yes || test -z "$CC"; then - # If CC is not set, then try to find GCC or a usable CC. - if test -z "$CC"; then - echo $ac_n "checking for gcc... $ac_c" 1>&6 - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then - CC="gcc" - break - fi - done - IFS="$save_ifs" - - if test -n "$CC"; then - echo "$ac_t$CC" 1>&6 - else - echo "$ac_t"no 1>&6 - fi - fi - - # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". - if test -z "$CC"; then - echo $ac_n "checking for cc... $ac_c" 1>&6 - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - cc_rejected=no - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/cc || test -f $dir/cc$ac_exeext; then - if test "$dir/cc" = "/usr/ucb/cc"; then - cc_rejected=yes - continue - fi - CC="cc" - break - fi - done - IFS="$save_ifs" - if test $cc_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same name, so the bogon will be chosen - # first if we set CC to just the name; use the full file name. - shift - set dummy "$dir/cc" "$@" - shift - CC="$@" - fi - fi - - if test -n "$CC"; then - echo "$ac_t$CC" 1>&6 - else - echo "$ac_t"no 1>&6 - fi - - if test -z "$CC"; then - echo "$progname: error: no acceptable cc found in $PATH" 1>&2 - exit 1 - fi - fi - - # Now see if the compiler is really GCC. - with_gcc=no - echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 - echo "$progname:581: checking whether we are using GNU C" >&5 - - $rm conftest.c - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF - if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:589: "$ac_try") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - with_gcc=yes - fi - $rm conftest.c - echo "$ac_t$with_gcc" 1>&6 -fi - -# Allow CC to be a program name with arguments. -set dummy $CC -compiler="$2" - -echo $ac_n "checking for object suffix... $ac_c" 1>&6 -$rm conftest* -echo 'int i = 1;' > conftest.c -echo "$progname:603: checking for object suffix" >& 5 -if { (eval echo $progname:604: "$ac_compile") 1>&5; (eval $ac_compile) 2>conftest.err; }; then - # Append any warnings to the config.log. - cat conftest.err 1>&5 - - for ac_file in conftest.*; do - case $ac_file in - *.c) ;; - *) objext=`echo $ac_file | sed -e s/conftest.//` ;; - esac - done -else - cat conftest.err 1>&5 - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 -fi -$rm conftest* -echo "$ac_t$objext" 1>&6 - -echo $ac_n "checking for executable suffix... $ac_c" 1>&6 -if eval "test "`echo '$''{'ac_cv_exeext'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_exeext="no" - $rm conftest* - echo 'main () { return 0; }' > conftest.c - echo "$progname:629: checking for executable suffix" >& 5 - if { (eval echo $progname:630: "$ac_link") 1>&5; (eval $ac_link) 2>conftest.err; }; then - # Append any warnings to the config.log. - cat conftest.err 1>&5 - - for ac_file in conftest.*; do - case $ac_file in - *.c | *.err | *.$objext ) ;; - *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; - esac - done - else - cat conftest.err 1>&5 - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - $rm conftest* -fi -if test "X$ac_cv_exeext" = Xno; then - exeext="" -else - exeext="$ac_cv_exeext" -fi -echo "$ac_t$ac_cv_exeext" 1>&6 - -echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 -pic_flag= -special_shlib_compile_flags= -wl= -link_static_flag= -no_builtin_flag= - -if test "$with_gcc" = yes; then - wl='-Wl,' - link_static_flag='-static' - - case "$host_os" in - beos* | irix5* | irix6* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - aix*) - # Below there is a dirty hack to force normal static linking with -ldl - # The problem is because libdl dynamically linked with both libc and - # libC (AIX C++ library), which obviously doesn't included in libraries - # list by gcc. This cause undefined symbols with -static flags. - # This hack allows C programs to be linked with "-static -ldl", but - # we not sure about C++ programs. - link_static_flag="$link_static_flag ${wl}-lC" - ;; - cygwin* | mingw* | os2*) - # We can build DLLs from non-PIC. - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - pic_flag='-m68020 -resident32 -malways-restore-a4' - ;; - sysv4*MP*) - if test -d /usr/nec; then - pic_flag=-Kconform_pic - fi - ;; - *) - pic_flag='-fPIC' - ;; - esac -else - # PORTME Check for PIC flags for the system compiler. - case "$host_os" in - aix3* | aix4*) - # All AIX code is PIC. - link_static_flag='-bnso -bI:/lib/syscalls.exp' - ;; - - hpux9* | hpux10* | hpux11*) - # Is there a better link_static_flag that works with the bundled CC? - wl='-Wl,' - link_static_flag="${wl}-a ${wl}archive" - pic_flag='+Z' - ;; - - irix5* | irix6*) - wl='-Wl,' - link_static_flag='-non_shared' - # PIC (with -KPIC) is the default. - ;; - - cygwin* | mingw* | os2*) - # We can build DLLs from non-PIC. - ;; - - osf3* | osf4* | osf5*) - # All OSF/1 code is PIC. - wl='-Wl,' - link_static_flag='-non_shared' - ;; - - sco3.2v5*) - pic_flag='-Kpic' - link_static_flag='-dn' - special_shlib_compile_flags='-belf' - ;; - - solaris*) - pic_flag='-KPIC' - link_static_flag='-Bstatic' - wl='-Wl,' - ;; - - sunos4*) - pic_flag='-PIC' - link_static_flag='-Bstatic' - wl='-Qoption ld ' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - pic_flag='-KPIC' - link_static_flag='-Bstatic' - wl='-Wl,' - ;; - - uts4*) - pic_flag='-pic' - link_static_flag='-Bstatic' - ;; - sysv4*MP*) - if test -d /usr/nec ;then - pic_flag='-Kconform_pic' - link_static_flag='-Bstatic' - fi - ;; - *) - can_build_shared=no - ;; - esac -fi - -if test -n "$pic_flag"; then - echo "$ac_t$pic_flag" 1>&6 - - # Check to make sure the pic_flag actually works. - echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $pic_flag -DPIC" - echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 - if { (eval echo $progname:777: "$ac_compile") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then - # Append any warnings to the config.log. - cat conftest.err 1>&5 - - case "$host_os" in - hpux9* | hpux10* | hpux11*) - # On HP-UX, both CC and GCC only warn that PIC is supported... then they - # create non-PIC objects. So, if there were any warnings, we assume that - # PIC is not supported. - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - can_build_shared=no - pic_flag= - else - echo "$ac_t"yes 1>&6 - pic_flag=" $pic_flag" - fi - ;; - *) - echo "$ac_t"yes 1>&6 - pic_flag=" $pic_flag" - ;; - esac - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - can_build_shared=no - pic_flag= - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* -else - echo "$ac_t"none 1>&6 -fi - -# Check to see if options -o and -c are simultaneously supported by compiler -echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 -$rm -r conftest 2>/dev/null -mkdir conftest -cd conftest -$rm conftest* -echo "int some_variable = 0;" > conftest.c -mkdir out -# According to Tom Tromey, Ian Lance Taylor reported there are C compilers -# that will create temporary files in the current directory regardless of -# the output directory. Thus, making CWD read-only will cause this test -# to fail, enabling locking or at least warning the user not to do parallel -# builds. -chmod -w . -save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -o out/conftest2.o" -echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 -if { (eval echo $progname:830: "$ac_compile") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s out/conftest.err; then - echo "$ac_t"no 1>&6 - compiler_c_o=no - else - echo "$ac_t"yes 1>&6 - compiler_c_o=yes - fi -else - # Append any errors to the config.log. - cat out/conftest.err 1>&5 - compiler_c_o=no - echo "$ac_t"no 1>&6 -fi -CFLAGS="$save_CFLAGS" -chmod u+w . -$rm conftest* out/* -rmdir out -cd .. -rmdir conftest -$rm -r conftest 2>/dev/null - -if test x"$compiler_c_o" = x"yes"; then - # Check to see if we can write to a .lo - echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -c -o conftest.lo" - echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 -if { (eval echo $progname:863: "$ac_compile") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - compiler_o_lo=no - else - echo "$ac_t"yes 1>&6 - compiler_o_lo=yes - fi - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - compiler_o_lo=no - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* -else - compiler_o_lo=no -fi - -# Check to see if we can do hard links to lock some files if needed -hard_links="nottested" -if test "$compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$ac_t$hard_links" 1>&6 - $rm conftest* - if test "$hard_links" = no; then - echo "*** WARNING: `$CC' does not support `-c -o', so `make -j' may be unsafe" >&2 - need_locks=warn - fi -else - need_locks=no -fi - -if test "$with_gcc" = yes; then - # Check to see if options -fno-rtti -fno-exceptions are supported by compiler - echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" - echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 - if { (eval echo $progname:915: "$ac_compile") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - compiler_rtti_exceptions=no - else - echo "$ac_t"yes 1>&6 - compiler_rtti_exceptions=yes - fi - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - compiler_rtti_exceptions=no - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* - - if test "$compiler_rtti_exceptions" = "yes"; then - no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' - else - no_builtin_flag=' -fno-builtin' - fi - -fi - -# Check for any special shared library compilation flags. -if test -n "$special_shlib_compile_flags"; then - echo "$progname: warning: `$CC' requires `$special_shlib_compile_flags' to build shared libraries" 1>&2 - if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : - else - echo "$progname: add `$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 - can_build_shared=no - fi -fi - -echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 -$rm conftest* -echo 'main(){return(0);}' > conftest.c -save_LDFLAGS="$LDFLAGS" -LDFLAGS="$LDFLAGS $link_static_flag" -echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 -if { (eval echo $progname:959: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - echo "$ac_t$link_static_flag" 1>&6 -else - echo "$ac_t"none 1>&6 - link_static_flag= -fi -LDFLAGS="$save_LDFLAGS" -$rm conftest* - -if test -z "$LN_S"; then - # Check to see if we can use ln -s, or we need hard links. - echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 - $rm conftest.dat - if ln -s X conftest.dat 2>/dev/null; then - $rm conftest.dat - LN_S="ln -s" - else - LN_S=ln - fi - if test "$LN_S" = "ln -s"; then - echo "$ac_t"yes 1>&6 - else - echo "$ac_t"no 1>&6 - fi -fi - -# Make sure LD is an absolute path. -if test -z "$LD"; then - ac_prog=ld - if test "$with_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 - echo "$progname:991: checking for ld used by GCC" >&5 - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. - [\/]* | [A-Za-z]:[\/]*) - re_direlt='/[^/][^/]*/../' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we are not using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac - elif test "$with_gnu_ld" = yes; then - echo $ac_n "checking for GNU ld... $ac_c" 1>&6 - echo "$progname:1015: checking for GNU ld" >&5 - else - echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 - echo "$progname:1018: checking for non-GNU ld" >&5 - fi - - if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" - fi - - if test -n "$LD"; then - echo "$ac_t$LD" 1>&6 - else - echo "$ac_t"no 1>&6 - fi - - if test -z "$LD"; then - echo "$progname: error: no acceptable ld found in $PATH" 1>&2 - exit 1 - fi -fi - -# Check to see if it really is or is not GNU ld. -echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 -# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then - with_gnu_ld=yes -else - with_gnu_ld=no -fi -echo "$ac_t$with_gnu_ld" 1>&6 - -# See if the linker supports building shared libraries. -echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 - -allow_undefined_flag= -no_undefined_flag= -need_lib_prefix=unknown -need_version=unknown -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -archive_cmds= -archive_expsym_cmds= -old_archive_from_new_cmds= -export_dynamic_flag_spec= -whole_archive_flag_spec= -thread_safe_flag_spec= -hardcode_libdir_flag_spec= -hardcode_libdir_separator= -hardcode_direct=no -hardcode_minus_L=no -hardcode_shlibpath_var=unsupported -runpath_var= -always_export_symbols=no -export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '''s/.* //''' | sort | uniq > $export_symbols' -# include_expsyms should be a list of space-separated symbols to be *always* -# included in the symbol list -include_expsyms= -# exclude_expsyms can be an egrep regular expression of symbols to exclude -# it will be wrapped by ` (' and `)$', so one must not match beginning or -# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', -# as well as any symbol that contains `d'. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" -# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out -# platforms (ab)use it in PIC code, but their linkers get confused if -# the symbol is explicitly referenced. Since portable code cannot -# rely on this symbol name, it's probably fine to never include it in -# preloaded symbol tables. - -case "$host_os" in -cygwin* | mingw*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$with_gcc" != yes; then - with_gnu_ld=no - fi - ;; - -esac - -ld_shlibs=yes -if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case "$host_os" in - aix3* | aix4*) - # On AIX, the GNU linker is very broken - ld_shlibs=no - cat <<EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - ;; - - amigaos*) - archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - - # Samuel A. Falvo II kc5tja@dolphin.openprojects.net reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can use - # them. - ld_shlibs=no - ;; - - beos*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach jrb3@best.com says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw*) - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - allow_undefined_flag=unsupported - always_export_symbols=yes - - # Extract the symbol export list from an `--export-all' def file, - # then regenerate the def file from the symbol export list, so that - # the compiled dll only exports the symbol export list. - export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# /* ltdll.c starts here *//,/^# /* ltdll.c ends here *// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ - test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ - $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ - sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' - - archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ - _lt_hint=1; - for symbol in `cat $export_symbols`; do - echo " $symbol @ $_lt_hint ; " >> $objdir/$soname-def; - _lt_hint=`expr 1 + $_lt_hint`; - done~ - test -f $objdir/$soname-ltdll.c || sed -e "/^# /* ltdll.c starts here *//,/^# /* ltdll.c ends here *// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ - test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ - $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ - $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ - $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' - - old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' - # can we support soname and/or expsyms with a.out? -oliva - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | egrep 'BFD 2.8' > /dev/null; then - ld_shlibs=no - cat <<EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - case $host_os in - cygwin* | mingw*) - # dlltool doesn't understand --whole-archive et. al. - whole_archive_flag_spec= - ;; - *) - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - ;; - esac - fi -else - # PORTME fill in a description of your system's linker (not GNU ld) - case "$host_os" in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$with_gcc" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix4*) - hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' - hardcode_libdir_separator=':' - if test "$with_gcc" = yes; then - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - shared_flag='-shared' - else - shared_flag='${wl}-bM:SRE' - hardcode_direct=yes - fi - allow_undefined_flag=' ${wl}-berok' - archive_cmds="$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' - archive_expsym_cmds="$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' - case "$host_os" in aix4.[01]|aix4.[01].*) - # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on - always_export_symbols=yes ;; - esac - ;; - - amigaos*) - archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - - cygwin* | mingw*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '''s/ -lc$//'''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib /OUT:$oldlib$oldobjs' - fix_srcfile_path='`cygpath -w $srcfile`' - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9* | hpux10* | hpux11*) - case "$host_os" in - hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; - *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; - esac - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_minus_L=yes # Not in the search PATH, but as the default - # location of the library. - export_dynamic_flag_spec='${wl}-E' - ;; - - irix5* | irix6*) - if test "$with_gcc" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF - fi - hardcode_libdir_flag_spec='${wl}-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - openbsd*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION "$libname"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' - ;; - - osf3*) - if test "$with_gcc" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved *' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # As osf3* with the addition of the -msym flag - if test "$with_gcc" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved *' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - sco3.2v5*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/(.*)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case "$host_os" in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv5*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/(.*)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' - hardcode_libdir_flag_spec= - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts' - hardcode_direct=yes - hardcode_minus_L=no - hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - unixware7*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac -fi -echo "$ac_t$ld_shlibs" 1>&6 -test "$ld_shlibs" = no && can_build_shared=no - -if test -z "$NM"; then - echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 - case "$NM" in - [\/]* | [A-Za-z]:[\/]*) ;; # Let the user override the test with a path. - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - NM="$ac_dir/nm -p" - break - else - NM=${NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$NM" && NM=nm - ;; - esac - echo "$ac_t$NM" 1>&6 -fi - -# Check for command to grab the raw symbol name followed by C symbol from nm. -echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='([_A-Za-z][_A-Za-z0-9]*)' - -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - -# Transform an extracted symbol line into a proper C declaration -global_symbol_to_cdecl="sed -n -e 's/^. .* (.*)$/extern char \1;/p'" - -# Define system-specific variables. -case "$host_os" in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw*) - symcode='[ABCDGISTW]' - ;; -hpux*) # Its linker distinguishes data from code symbols - global_symbol_to_cdecl="sed -n -e 's/^T .* (.*)$/extern char \1();/p' -e 's/^. .* (.*)$/extern char \1;/p'" - ;; -irix*) - symcode='[BCDEGRST]' - ;; -solaris*) - symcode='[BDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then - symcode='[ABCDGISTW]' -fi - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Write the raw and C identifiers. - global_symbol_pipe="sed -n -e 's/^.*[ ]($symcode)[ ][ ]*($ac_symprfx)$sympat$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - $rm conftest* - cat > conftest.c <<EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(){} -#ifdef __cplusplus -} -#endif -main(){nm_test_var='a';nm_test_func();return(0);} -EOF - - echo "$progname:1635: checking if global_symbol_pipe works" >&5 - if { (eval echo $progname:1636: "$ac_compile") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then - # Now try to grab the symbols. - nlist=conftest.nm - if { echo "$progname:1639: eval "$NM conftest.$objext | $global_symbol_pipe > $nlist"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then - - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if egrep ' nm_test_var$' "$nlist" >/dev/null; then - if egrep ' nm_test_func$' "$nlist" >/dev/null; then - cat <<EOF > conftest.c -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' - - cat <<EOF >> conftest.c -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[] = -{ -EOF - sed 's/^. (.*) (.*)$/ {"\2", (lt_ptr_t) &\2},/' < "$nlist" >> conftest.c - cat <<\EOF >> conftest.c - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$objext conftstm.$objext - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="conftstm.$objext" - CFLAGS="$CFLAGS$no_builtin_flag" - if { (eval echo $progname:1691: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - pipe_works=yes - else - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - LIBS="$save_LIBS" - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - $rm conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - global_symbol_pipe= - fi -done -if test "$pipe_works" = yes; then - echo "${ac_t}ok" 1>&6 -else - echo "${ac_t}failed" 1>&6 -fi - -if test -z "$global_symbol_pipe"; then - global_symbol_to_cdecl= -fi - -# Check hardcoding attributes. -echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var"; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$hardcode_shlibpath_var" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -echo "$ac_t$hardcode_action" 1>&6 - - -reload_flag= -reload_cmds='$LD$reload_flag -o $output$reload_objs' -echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 -# PORTME Some linkers may need a different reload flag. -reload_flag='-r' -echo "$ac_t$reload_flag" 1>&6 -test -n "$reload_flag" && reload_flag=" $reload_flag" - -# PORTME Fill in your ld.so characteristics -library_names_spec= -libname_spec='lib$name' -soname_spec= -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -file_magic_cmd= -file_magic_test_file= -deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [regex]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given egrep regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. -echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 -case "$host_os" in -aix3*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}.so$major' - ;; - -aix4*) - version_type=linux - # AIX has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - # We preserve .a as extension for shared libraries though AIX4.2 - # and later linker supports .so - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' - shlibpath_var=LIBPATH - deplibs_check_method=pass_all - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '''s%^.*/([^/]*).ixlibrary$%\1%'''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}.so' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - deplibs_check_method=pass_all - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - finish_cmds='PATH="$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - file_magic_cmd=/usr/bin/file - file_magic_test_file=/shlib/libc.so - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - export_dynamic_flag_spec=-rdynamic - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw*) - version_type=windows - need_version=no - need_lib_prefix=no - if test "$with_gcc" = yes; then - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' - else - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' - fi - dynamic_linker='Win32 ld.exe' - deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - file_magic_cmd='${OBJDUMP} -f' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case "$version_type" in - freebsd-elf*) - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /usr/lib/libc.so*` - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - deplibs_check_method=unknown - library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case "$host_os" in - freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - dynamic_linker="$host_os dld.sl" - version_type=sunos - need_lib_prefix=no - need_version=no - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' - soname_spec='${libname}${release}.sl$major' - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6*) - version_type=irix - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}.so.$major' - library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' - case "$host_os" in - irix5*) - libsuff= shlibsuff= - # this will be overridden with pass_all, but let us keep it just in case - deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case "$LD" in # libtool.m4 will add one of these switches to LD - *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /lib${libsuff}/libc.so*` - deplibs_check_method='pass_all' - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux-gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` - - if test -f /lib/ld.so.1; then - dynamic_linker='GNU ld.so' - else - # Only the GNU ld.so supports shared libraries on MkLinux. - case "$host_cpu" in - powerpc*) dynamic_linker=no ;; - *) dynamic_linker='Linux ld.so' ;; - esac - fi - ;; - -netbsd*) - version_type=sunos - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' - soname_spec='${libname}${release}.so$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - ;; - -openbsd*) - version_type=sunos - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - need_version=no - fi - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - ;; - -os2*) - libname_spec='$name' - need_lib_prefix=no - library_names_spec='$libname.dll $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_version=no - soname_spec='${libname}${release}.so' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' - shlibpath_var=LD_LIBRARY_PATH - # this will be overridden with pass_all, but let us keep it just in case - deplibs_check_method='file_magic COFF format alpha shared library' - file_magic_cmd=/usr/bin/file - file_magic_test_file=/shlib/libc.so - deplibs_check_method='pass_all' - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" - file_magic_cmd=/usr/bin/file - file_magic_test_file=/lib/libc.so - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - case "$host_vendor" in - ncr) - deplibs_check_method='pass_all' - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - esac - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' - soname_spec='$libname.so.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$ac_t$dynamic_linker" 1>&6 -test "$dynamic_linker" = no && can_build_shared=no - -# Report the final consequences. -echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 - -# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in -# configure.in, otherwise build static only libraries. -case "$host_os" in -cygwin* | mingw* | os2*) - if test x$can_build_shared = xyes; then - test x$enable_win32_dll = xno && can_build_shared=no - echo "checking if package supports dlls... $can_build_shared" 1>&6 - fi -;; -esac - -if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then - case "$deplibs_check_method" in - "file_magic "*) - file_magic_regex="`expr "$deplibs_check_method" : "file_magic (.*)"`" - if eval $file_magic_cmd $file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <<EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac -fi - -echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~$RANLIB $lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4*) - test "$enable_shared" = yes && enable_static=no - ;; -esac - -echo "$ac_t$enable_shared" 1>&6 - -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes - -echo "checking whether to build static libraries... $enable_static" 1>&6 - -if test "$hardcode_action" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -echo $ac_n "checking for objdir... $ac_c" 1>&6 -rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - objdir=_libs -fi -rmdir .libs 2>/dev/null -echo "$ac_t$objdir" 1>&6 - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else -if eval "test "`echo '$''{'lt_cv_dlopen'+set}'`" != set"; then - lt_cv_dlopen=no lt_cv_dlopen_libs= -echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "$progname:2212: checking for dlopen in -ldl" >&5 -ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` -if eval "test "`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldl $LIBS" -cat > conftest.$ac_ext <<EOF -#line 2220 "ltconfig" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen(); - -int main() { -dlopen() -; return 0; } -EOF -if { (eval echo $progname:2233: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test "`echo '$ac_cv_lib_'$ac_lib_var`" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dlopen""... $ac_c" 1>&6 -echo "$progname:2252: checking for dlopen" >&5 -if eval "test "`echo '$''{'ac_cv_func_dlopen'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2257 "ltconfig" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -dlopen(); -#endif - -; return 0; } -EOF -if { (eval echo $progname:2282: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_dlopen=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_dlopen=no" -fi -rm -f conftest* -fi -if eval "test "`echo '$ac_cv_func_'dlopen`" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 -echo "$progname:2299: checking for dld_link in -ldld" >&5 -ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` -if eval "test "`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <<EOF -#line 2307 "ltconfig" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link(); - -int main() { -dld_link() -; return 0; } -EOF -if { (eval echo $progname:2320: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test "`echo '$ac_cv_lib_'$ac_lib_var`" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for shl_load""... $ac_c" 1>&6 -echo "$progname:2339: checking for shl_load" >&5 -if eval "test "`echo '$''{'ac_cv_func_shl_load'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2344 "ltconfig" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -shl_load(); -#endif - -; return 0; } -EOF -if { (eval echo $progname:2369: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_shl_load=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_shl_load=no" -fi -rm -f conftest* -fi - -if eval "test "`echo '$ac_cv_func_'shl_load`" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 -echo "$progname:2387: checking for shl_load in -ldld" >&5 -ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` -if eval "test "`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <<EOF -#line 2395 "ltconfig" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load(); - -int main() { -shl_load() -; return 0; } -EOF -if { (eval echo $progname:2409: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test "`echo '$ac_cv_lib_'$ac_lib_var`" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - echo "$ac_t""no" 1>&6 -fi - - -fi - - -fi - - -fi - - -fi - -fi - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - fi - - case "$lt_cv_dlopen" in - dlopen) -for ac_hdr in dlfcn.h; do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "$progname:2452: checking for $ac_hdr" >&5 -if eval "test "`echo '$''{'ac_cv_header_$ac_safe'+set}'`" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2457 "ltconfig" -#include <$ac_hdr> -int fnord = 0; -EOF -ac_try="$ac_compile >/dev/null 2>conftest.out" -{ (eval echo $progname:2462: "$ac_try") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test "`echo '$ac_cv_header_'$ac_safe`" = yes"; then - echo "$ac_t""yes" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi -done - - if test "x$ac_cv_header_dlfcn_h" = xyes; then - CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - fi - eval LDFLAGS="$LDFLAGS $export_dynamic_flag_spec" - LIBS="$lt_cv_dlopen_libs $LIBS" - - echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 -echo "$progname:2490: checking whether a program can dlopen itself" >&5 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - lt_cv_dlopen_self=cross - else - cat > conftest.c <<EOF -#line 2498 "ltconfig" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LTDL_GLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LTDL_GLOBAL DL_GLOBAL -# else -# define LTDL_GLOBAL 0 -# endif -#endif - -/* We may have to define LTDL_LAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LTDL_LAZY_OR_NOW -# ifdef RTLD_LAZY -# define LTDL_LAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LTDL_LAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LTDL_LAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LTDL_LAZY_OR_NOW DL_NOW -# else -# define LTDL_LAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -fnord() { int i=42;} -main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); - if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); - if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } - -EOF -if { (eval echo $progname:2544: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - lt_cv_dlopen_self=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - lt_cv_dlopen_self=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$lt_cv_dlopen_self" 1>&6 - - if test "$lt_cv_dlopen_self" = yes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 -echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - lt_cv_dlopen_self_static=cross - else - cat > conftest.c <<EOF -#line 2571 "ltconfig" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LTDL_GLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LTDL_GLOBAL DL_GLOBAL -# else -# define LTDL_GLOBAL 0 -# endif -#endif - -/* We may have to define LTDL_LAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LTDL_LAZY_OR_NOW -# ifdef RTLD_LAZY -# define LTDL_LAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LTDL_LAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LTDL_LAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LTDL_LAZY_OR_NOW DL_NOW -# else -# define LTDL_LAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -fnord() { int i=42;} -main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); - if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); - if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } - -EOF -if { (eval echo $progname:2617: "$ac_link") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - lt_cv_dlopen_self_static=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - lt_cv_dlopen_self_static=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 -fi - ;; - esac - - case "$lt_cv_dlopen_self" in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case "$lt_cv_dlopen_self_static" in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - -# Copy echo and quote the copy, instead of the original, because it is -# used later. -ltecho="$echo" -if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then - ltecho="$CONFIG_SHELL $0 --fallback-echo" -fi -LTSHELL="$SHELL" - -LTCONFIG_VERSION="$VERSION" - -# Only quote variables if we're using ltmain.sh. -case "$ltmain" in -*.sh) - # Now quote all the things that may contain metacharacters. - for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ - old_LD old_LDFLAGS old_LIBS \ - old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ - AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ - reload_flag reload_cmds wl \ - pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ - thread_safe_flag_spec whole_archive_flag_spec libname_spec \ - library_names_spec soname_spec \ - RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ - old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ - file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ - finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ - hardcode_libdir_flag_spec hardcode_libdir_separator \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do - - case "$var" in - reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "$var=\"`$echo "X$$var" | $Xsed -e "$double_quote_subst" -e "$sed_quote_subst" -e "$delay_variable_subst"`\"" - ;; - *) - eval "$var=\"`$echo "X$$var" | $Xsed -e "$sed_quote_subst"`\"" - ;; - esac - done - - case "$ltecho" in - *'$0 --fallback-echo"') - ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - - trap "$rm "$ofile"; exit 1" 1 2 15 - echo "creating $ofile" - $rm "$ofile" - cat <<EOF > "$ofile" -#! $SHELL - -# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. -# -# Copyright (C) 1996-1999 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit gord@gnu.ai.mit.edu, 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="sed -e s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -### BEGIN LIBTOOL CONFIG -EOF - cfgfile="$ofile" - ;; - -*) - # Double-quote the variables that need it (for aesthetics). - for var in old_CC old_CFLAGS old_CPPFLAGS \ - old_LD old_LDFLAGS old_LIBS \ - old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do - eval "$var=\"$var\"" - done - - # Just create a config file. - cfgfile="$ofile.cfg" - trap "$rm "$cfgfile"; exit 1" 1 2 15 - echo "creating $cfgfile" - $rm "$cfgfile" - cat <<EOF > "$cfgfile" -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -EOF - ;; -esac - -cat <<EOF >> "$cfgfile" -# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \ -# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \ -# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \ -# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \ -# $0$ltconfig_args -# -# Compiler and other test output produced by $progname, useful for -# debugging $progname, is in ./config.log if it exists. - -# The version of $progname that generated this script. -LTCONFIG_VERSION=$LTCONFIG_VERSION - -# Shell to use when invoking shell scripts. -SHELL=$LTSHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$ltecho - -# The archiver. -AR=$AR - -# The default C compiler. -CC=$CC - -# The linker used to build libraries. -LD=$LD - -# Whether we need hard or soft links. -LN_S=$LN_S - -# A BSD-compatible nm program. -NM=$NM - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$reload_flag -reload_cmds=$reload_cmds - -# How to pass a linker flag through the compiler. -wl=$wl - -# Object file suffix (normally "o"). -objext="$objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$pic_flag - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$compiler_c_o - -# Can we write directly to a .lo ? -compiler_o_lo=$compiler_o_lo - -# Must we lock files when doing compilation ? -need_locks=$need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$link_static_flag - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$no_builtin_flag - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$whole_archive_flag_spec - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$thread_safe_flag_spec - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$RANLIB -old_archive_cmds=$old_archive_cmds -old_postinstall_cmds=$old_postinstall_cmds -old_postuninstall_cmds=$old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$old_archive_from_new_cmds - -# Commands used to build and install a shared archive. -archive_cmds=$archive_cmds -archive_expsym_cmds=$archive_expsym_cmds -postinstall_cmds=$postinstall_cmds -postuninstall_cmds=$postuninstall_cmds - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$allow_undefined_flag - -# Flag that forces no undefined symbols. -no_undefined_flag=$no_undefined_flag - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$global_symbol_to_cdecl - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# Flag to hardcode $libdir into a binary during linking. -# This must work even if $libdir does not exist. -hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$hardcode_libdir_separator - -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec - -# Fix the shell variable $srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$include_expsyms - -EOF - -case "$ltmain" in -*.sh) - echo '### END LIBTOOL CONFIG' >> "$ofile" - echo >> "$ofile" - case "$host_os" in - aix3*) - cat <<\EOF >> "$ofile" - -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -EOF - ;; - esac - - # Append the ltmain.sh script. - sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - - chmod +x "$ofile" - ;; - -*) - # Compile the libtool program. - echo "FIXME: would compile $ltmain" - ;; -esac - -test -n "$cache_file" || exit 0 - -# AC_CACHE_SAVE -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\ into \, and sed turns \ into ). - sed -n \ - -e "s/'/'\\''/g" \ - -e "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1='\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*)=(.*)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -exit 0 - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/external/privoxy/pcre/ltmain.sh b/external/privoxy/pcre/ltmain.sh deleted file mode 100644 index ab65054..0000000 --- a/external/privoxy/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 gord@gnu.ai.mit.edu, 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Check that we have a working $echo. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<EOF -$* -EOF - exit 0 -fi - -# The name of this program. -progname=`$echo "$0" | sed 's%^.*/%%'` -modename="$progname" - -# Constants. -PROGRAM=ltmain.sh -PACKAGE=libtool -VERSION=1.3.4 -TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)" - -default_mode= -help="Try `$progname --help' for more information." -magic="%%%MAGIC variable%%%" -mkdir="mkdir" -mv="mv -f" -rm="rm -f" - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' -sed_quote_subst='s/([\`\"$\\])/\\1/g' -SP2NL='tr \040 \012' -NL2SP='tr \015\012 \040\040' - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -# We save the old values to restore during execute mode. -if test "${LC_ALL+set}" = set; then - save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL -fi -if test "${LANG+set}" = set; then - save_LANG="$LANG"; LANG=C; export LANG -fi - -if test "$LTCONFIG_VERSION" != "$VERSION"; then - echo "$modename: ltconfig version `$LTCONFIG_VERSION' does not match $PROGRAM version `$VERSION'" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 -fi - -if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - echo "$modename: not configured to build any kind of library" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 -fi - -# Global variables. -mode=$default_mode -nonopt= -prev= -prevopt= -run= -show="$echo" -show_help= -execute_dlfiles= -lo2o="s/\.lo$/.${objext}/" -o2lo="s/\.${objext}$/.lo/" - -# Parse our command line options once, thoroughly. -while test $# -gt 0 -do - arg="$1" - shift - - case "$arg" in - -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case "$prev" in - execute_dlfiles) - eval "$prev="$$prev $arg"" - ;; - *) - eval "$prev=$arg" - ;; - esac - - prev= - prevopt= - continue - fi - - # Have we seen a non-optional argument yet? - case "$arg" in - --help) - show_help=yes - ;; - - --version) - echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - exit 0 - ;; - - --config) - sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 - exit 0 - ;; - - --debug) - echo "$progname: enabling shell trace mode" - set -x - ;; - - --dry-run | -n) - run=: - ;; - - --features) - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - exit 0 - ;; - - --finish) mode="finish" ;; - - --mode) prevopt="--mode" prev=mode ;; - --mode=*) mode="$optarg" ;; - - --quiet | --silent) - show=: - ;; - - -dlopen) - prevopt="-dlopen" - prev=execute_dlfiles - ;; - - -*) - $echo "$modename: unrecognized option `$arg'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - - *) - nonopt="$arg" - break - ;; - esac -done - -if test -n "$prevopt"; then - $echo "$modename: option `$prevopt' requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 -fi - -if test -z "$show_help"; then - - # Infer the operation mode. - if test -z "$mode"; then - case "$nonopt" in - *cc | *++ | gcc* | *-gcc*) - mode=link - for arg - do - case "$arg" in - -c) - mode=compile - break - ;; - esac - done - ;; - *db | *dbx | *strace | *truss) - mode=execute - ;; - *install*|cp|mv) - mode=install - ;; - *rm) - mode=uninstall - ;; - *) - # If we have no mode, but dlfiles were specified, then do execute mode. - test -n "$execute_dlfiles" && mode=execute - - # Just use the default operation mode. - if test -z "$mode"; then - if test -n "$nonopt"; then - $echo "$modename: warning: cannot infer operation mode from `$nonopt'" 1>&2 - else - $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 - fi - fi - ;; - esac - fi - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - $echo "$modename: unrecognized option `-dlopen'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try `$modename --help --mode=$mode' for more information." - - # These modes are in order of execution frequency so that they run quickly. - case "$mode" in - # libtool compile mode - compile) - modename="$modename: compile" - # Get the compilation command and the source file. - base_compile= - lastarg= - srcfile="$nonopt" - suppress_output= - - user_target=no - for arg - do - # Accept any command-line options. - case "$arg" in - -o) - if test "$user_target" != "no"; then - $echo "$modename: you cannot specify `-o' more than once" 1>&2 - exit 1 - fi - user_target=next - ;; - - -static) - build_old_libs=yes - continue - ;; - esac - - case "$user_target" in - next) - # The next one is the -o target name - user_target=yes - continue - ;; - yes) - # We got the output file - user_target=set - libobj="$arg" - continue - ;; - esac - - # Accept the current argument as the source file. - lastarg="$srcfile" - srcfile="$arg" - - # Aesthetically quote the previous argument. - - # Backslashify any backslashes, double quotes, and dollar signs. - # These are the only characters that are still specially - # interpreted inside of double-quoted scrings. - lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly in scan - # sets, so we specify it separately. - case "$lastarg" in - *[[~#^&*(){}|;<>?'\ \ ]*|*]*) - lastarg=""$lastarg"" - ;; - esac - - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - done - - case "$user_target" in - set) - ;; - no) - # Get the name of the library object. - libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` - ;; - *) - $echo "$modename: you must specify a target with `-o'" 1>&2 - exit 1 - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSfmso]' - case "$libobj" in - *.ada) xform=ada ;; - *.adb) xform=adb ;; - *.ads) xform=ads ;; - *.asm) xform=asm ;; - *.c++) xform=c++ ;; - *.cc) xform=cc ;; - *.cpp) xform=cpp ;; - *.cxx) xform=cxx ;; - *.f90) xform=f90 ;; - *.for) xform=for ;; - esac - - libobj=`$echo "X$libobj" | $Xsed -e "s/.$xform$/.lo/"` - - case "$libobj" in - *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; - *) - $echo "$modename: cannot determine name of library object from `$libobj'" 1>&2 - exit 1 - ;; - esac - - if test -z "$base_compile"; then - $echo "$modename: you must specify a compilation command" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $libobj" - else - removelist="$libobj" - fi - - $run $rm $removelist - trap "$run $rm $removelist; exit 1" 1 2 15 - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%..*$%%'`.${objext} - lockfile="$output_obj.lock" - removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit 1" 1 2 15 - else - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until ln "$0" "$lockfile" 2>/dev/null; do - $show "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - echo "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support `-c' and `-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - echo $srcfile > "$lockfile" - fi - - if test -n "$fix_srcfile_path"; then - eval srcfile="$fix_srcfile_path" - fi - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - # All platforms use -DPIC, to notify preprocessed assembler code. - command="$base_compile $srcfile $pic_flag -DPIC" - if test "$build_old_libs" = yes; then - lo_libobj="$libobj" - dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$libobj"; then - dir="$objdir" - else - dir="$dir/$objdir" - fi - libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - - if test -d "$dir"; then - $show "$rm $libobj" - $run $rm $libobj - else - $show "$mkdir $dir" - $run $mkdir $dir - status=$? - if test $status -ne 0 && test ! -d $dir; then - exit $status - fi - fi - fi - if test "$compiler_o_lo" = yes; then - output_obj="$libobj" - command="$command -o $output_obj" - elif test "$compiler_c_o" = yes; then - output_obj="$obj" - command="$command -o $output_obj" - fi - - $run $rm "$output_obj" - $show "$command" - if $run eval "$command"; then : - else - test -n "$output_obj" && $run $rm $removelist - exit 1 - fi - - if test "$need_locks" = warn && - test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support `-c' and `-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed, then go on to compile the next one - if test x"$output_obj" != x"$libobj"; then - $show "$mv $output_obj $libobj" - if $run $mv $output_obj $libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # If we have no pic_flag, then copy the object into place and finish. - if test -z "$pic_flag" && test "$build_old_libs" = yes; then - # Rename the .lo from within objdir to obj - if test -f $obj; then - $show $rm $obj - $run $rm $obj - fi - - $show "$mv $libobj $obj" - if $run $mv $libobj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` - libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - # Now arrange that obj and lo_libobj become the same file - $show "(cd $xdir && $LN_S $baseobj $libobj)" - if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then - exit 0 - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Allow error messages only from the first compilation. - suppress_output=' >/dev/null 2>&1' - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - command="$base_compile $srcfile" - if test "$compiler_c_o" = yes; then - command="$command -o $obj" - output_obj="$obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - command="$command$suppress_output" - $run $rm "$output_obj" - $show "$command" - if $run eval "$command"; then : - else - $run $rm $removelist - exit 1 - fi - - if test "$need_locks" = warn && - test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support `-c' and `-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed - if test x"$output_obj" != x"$obj"; then - $show "$mv $output_obj $obj" - if $run $mv $output_obj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Create an invalid libtool object if no PIC, so that we do not - # accidentally link it into a program. - if test "$build_libtool_libs" != yes; then - $show "echo timestamp > $libobj" - $run eval "echo timestamp > $libobj" || exit $? - else - # Move the .lo from within objdir - $show "$mv $libobj $lo_libobj" - if $run $mv $libobj $lo_libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - fi - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - $rm "$lockfile" - fi - - exit 0 - ;; - - # libtool link mode - link) - modename="$modename: link" - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invokation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - - # This is a source program that is used to create dlls on Windows - # Don't remove nor modify the starting and closing comments -# /* ltdll.c starts here */ -# #define WIN32_LEAN_AND_MEAN -# #include <windows.h> -# #undef WIN32_LEAN_AND_MEAN -# #include <stdio.h> -# -# #ifndef __CYGWIN__ -# # ifdef __CYGWIN32__ -# # define __CYGWIN__ __CYGWIN32__ -# # endif -# #endif -# -# #ifdef __cplusplus -# extern "C" { -# #endif -# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -# #ifdef __cplusplus -# } -# #endif -# -# #ifdef __CYGWIN__ -# #include <cygwin/cygwin_dll.h> -# DECLARE_CYGWIN_DLL( DllMain ); -# #endif -# HINSTANCE __hDllInstance_base; -# -# BOOL APIENTRY -# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -# { -# __hDllInstance_base = hInst; -# return TRUE; -# } -# /* ltdll.c ends here */ - # This is a source program that is used to create import libraries - # on Windows for dlls which lack them. Don't remove nor modify the - # starting and closing comments -# /* impgen.c starts here */ -# /* Copyright (C) 1999 Free Software Foundation, Inc. -# -# This file is part of GNU libtool. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# */ -# -# #include <stdio.h> /* for printf() */ -# #include <unistd.h> /* for open(), lseek(), read() */ -# #include <fcntl.h> /* for O_RDONLY, O_BINARY */ -# #include <string.h> /* for strdup() */ -# -# static unsigned int -# pe_get16 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[2]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 2); -# return b[0] + (b[1]<<8); -# } -# -# static unsigned int -# pe_get32 (fd, offset) -# int fd; -# int offset; -# { -# unsigned char b[4]; -# lseek (fd, offset, SEEK_SET); -# read (fd, b, 4); -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# static unsigned int -# pe_as32 (ptr) -# void *ptr; -# { -# unsigned char *b = ptr; -# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); -# } -# -# int -# main (argc, argv) -# int argc; -# char *argv[]; -# { -# int dll; -# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; -# unsigned long export_rva, export_size, nsections, secptr, expptr; -# unsigned long name_rvas, nexp; -# unsigned char *expdata, *erva; -# char *filename, *dll_name; -# -# filename = argv[1]; -# -# dll = open(filename, O_RDONLY|O_BINARY); -# if (!dll) -# return 1; -# -# dll_name = filename; -# -# for (i=0; filename[i]; i++) -# if (filename[i] == '/' || filename[i] == '\' || filename[i] == ':') -# dll_name = filename + i +1; -# -# pe_header_offset = pe_get32 (dll, 0x3c); -# opthdr_ofs = pe_header_offset + 4 + 20; -# num_entries = pe_get32 (dll, opthdr_ofs + 92); -# -# if (num_entries < 1) /* no exports */ -# return 1; -# -# export_rva = pe_get32 (dll, opthdr_ofs + 96); -# export_size = pe_get32 (dll, opthdr_ofs + 100); -# nsections = pe_get16 (dll, pe_header_offset + 4 +2); -# secptr = (pe_header_offset + 4 + 20 + -# pe_get16 (dll, pe_header_offset + 4 + 16)); -# -# expptr = 0; -# for (i = 0; i < nsections; i++) -# { -# char sname[8]; -# unsigned long secptr1 = secptr + 40 * i; -# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); -# unsigned long vsize = pe_get32 (dll, secptr1 + 16); -# unsigned long fptr = pe_get32 (dll, secptr1 + 20); -# lseek(dll, secptr1, SEEK_SET); -# read(dll, sname, 8); -# if (vaddr <= export_rva && vaddr+vsize > export_rva) -# { -# expptr = fptr + (export_rva - vaddr); -# if (export_rva + export_size > vaddr + vsize) -# export_size = vsize - (export_rva - vaddr); -# break; -# } -# } -# -# expdata = (unsigned char*)malloc(export_size); -# lseek (dll, expptr, SEEK_SET); -# read (dll, expdata, export_size); -# erva = expdata - export_rva; -# -# nexp = pe_as32 (expdata+24); -# name_rvas = pe_as32 (expdata+32); -# -# printf ("EXPORTS\n"); -# for (i = 0; i<nexp; i++) -# { -# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4); -# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i); -# } -# -# return 0; -# } -# /* impgen.c ends here */ - ;; - *) - allow_undefined=yes - ;; - esac - compile_command="$nonopt" - finalize_command="$nonopt" - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - linkopts= - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval lib_search_path=`$echo "X ${$shlibpath_var}" | $Xsed -e 's/:/ /g'` - else - lib_search_path= - fi - # now prepend the system-specific ones - eval lib_search_path="$sys_lib_search_path_spec$lib_search_path" - eval sys_lib_dlsearch_path="$sys_lib_dlsearch_path_spec" - - avoid_version=no - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - link_against_libtool_libs= - ltlibs= - module=no - objs= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - - # We need to know -static, to get the right output filenames. - for arg - do - case "$arg" in - -all-static | -static) - if test "X$arg" = "X-all-static"; then - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - else - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - fi - build_libtool_libs=no - build_old_libs=yes - prefer_static_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test $# -gt 0; do - arg="$1" - shift - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case "$prev" in - output) - compile_command="$compile_command @OUTPUT@" - finalize_command="$finalize_command @OUTPUT@" - ;; - esac - - case "$prev" in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - compile_command="$compile_command @SYMFILE@" - finalize_command="$finalize_command @SYMFILE@" - preload=yes - fi - case "$arg" in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - else - dlprefiles="$dlprefiles $arg" - fi - prev= - ;; - esac - ;; - expsyms) - export_symbols="$arg" - if test ! -f "$arg"; then - $echo "$modename: symbol file `$arg' does not exist" - exit 1 - fi - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case "$arg" in - [\/]* | [A-Za-z]:[\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) rpath="$rpath $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; - esac - fi - prev= - continue - ;; - *) - eval "$prev="$arg"" - prev= - continue - ;; - esac - fi - - prevarg="$arg" - - case "$arg" in - -all-static) - if test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - $echo "$modename: `-allow-undefined' is deprecated because it is the default" 1>&2 - continue - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: not more than one -exported-symbols argument allowed" - exit 1 - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -L*) - dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` - # We need an absolute path. - case "$dir" in - [\/]* | [A-Za-z]:[\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of `$dir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - absdir="$dir" - fi - dir="$absdir" - ;; - esac - case " $deplibs " in - *" $arg "*) ;; - *) deplibs="$deplibs $arg";; - esac - case " $lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir";; - esac - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - dllsearchdir=`cd "$dir" && pwd || echo "$dir"` - case ":$dllsearchpath:" in - ::) dllsearchpath="$dllsearchdir";; - *":$dllsearchdir:"*) ;; - *) dllsearchpath="$dllsearchpath:$dllsearchdir";; - esac - ;; - esac - ;; - - -l*) - if test "$arg" = "-lc"; then - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) - # These systems don't actually have c library (as such) - continue - ;; - esac - elif test "$arg" = "-lm"; then - case "$host" in - *-*-cygwin* | *-*-beos*) - # These systems don't actually have math library (as such) - continue - ;; - esac - fi - deplibs="$deplibs $arg" - ;; - - -module) - module=yes - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -o) prev=output ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` - # We need an absolute path. - case "$dir" in - [\/]* | [A-Za-z]:[\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -static) - # If we have no pic_flag, then this is the same as -all-static. - if test -z "$pic_flag" && test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - # Some other compiler flag. - -* | +*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[[~#^&*(){}|;<>?'\ \ ]*|*]*) - arg=""$arg"" - ;; - esac - ;; - - *.o | *.obj | *.a | *.lib) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A library object. - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` - prev= - fi - libobjs="$libobjs $arg" - ;; - - *.la) - # A libtool-controlled library. - - dlname= - libdir= - library_names= - old_library= - - # Check to see that this really is a libtool archive. - if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: `$arg' is not a valid libtool archive" 1>&2 - exit 1 - fi - - # If the library was installed with an old release of libtool, - # it will not redefine variable installed. - installed=yes - - # Read the .la file - # If there is no directory component, then add one. - case "$arg" in - */* | *\*) . $arg ;; - *) . ./$arg ;; - esac - - # Get the name of the library we link against. - linklib= - for l in $old_library $library_names; do - linklib="$l" - done - - if test -z "$linklib"; then - $echo "$modename: cannot find name of link library for `$arg'" 1>&2 - exit 1 - fi - - # Find the relevant object directory and library name. - name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/.la$//' -e 's/^lib//'` - - if test "X$installed" = Xyes; then - dir="$libdir" - else - dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$arg"; then - dir="$objdir" - else - dir="$dir/$objdir" - fi - fi - - if test -n "$dependency_libs"; then - # Extract -R and -L from dependency_libs - temp_deplibs= - for deplib in $dependency_libs; do - case "$deplib" in - -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` - case " $rpath $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - -L*) case "$compile_command $temp_deplibs " in - *" $deplib "*) ;; - *) temp_deplibs="$temp_deplibs $deplib";; - esac - temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` - case " $lib_search_path " in - *" $temp_dir "*) ;; - *) lib_search_path="$lib_search_path $temp_dir";; - esac - ;; - *) temp_deplibs="$temp_deplibs $deplib";; - esac - done - dependency_libs="$temp_deplibs" - fi - - if test -z "$libdir"; then - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $dir/$old_library" - old_convenience="$old_convenience $dir/$old_library" - deplibs="$deplibs$dependency_libs" - compile_command="$compile_command $dir/$old_library$dependency_libs" - finalize_command="$finalize_command $dir/$old_library$dependency_libs" - continue - fi - - # This library was specified with -dlopen. - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking statically, - # we need to preload. - prev=dlprefiles - else - # We should not create a dependency on this library, but we - # may need any libraries it requires. - compile_command="$compile_command$dependency_libs" - finalize_command="$finalize_command$dependency_libs" - prev= - continue - fi - fi - - # The library was specified with -dlpreopen. - if test "$prev" = dlprefiles; then - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - dlprefiles="$dlprefiles $dir/$old_library" - else - dlprefiles="$dlprefiles $dir/$linklib" - fi - prev= - fi - - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - link_against_libtool_libs="$link_against_libtool_libs $arg" - if test -n "$shlibpath_var"; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *) temp_rpath="$temp_rpath $dir" ;; - esac - fi - - # We need an absolute path. - case "$dir" in - [\/] | [A-Za-z]:[\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of `$dir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - absdir="$dir" - fi - ;; - esac - - # This is the magic to use -rpath. - # Skip directories that are in the system default run-time - # search path, unless they have been requested with -R. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - - lib_linked=yes - case "$hardcode_action" in - immediate | unsupported) - if test "$hardcode_direct" = no; then - compile_command="$compile_command $dir/$linklib" - deplibs="$deplibs $dir/$linklib" - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2*) - dllsearchdir=`cd "$dir" && pwd || echo "$dir"` - if test -n "$dllsearchpath"; then - dllsearchpath="$dllsearchpath:$dllsearchdir" - else - dllsearchpath="$dllsearchdir" - fi - ;; - esac - elif test "$hardcode_minus_L" = no; then - case "$host" in - *-*-sunos*) - compile_shlibpath="$compile_shlibpath$dir:" - ;; - esac - case "$compile_command " in - *" -L$dir "*) ;; - *) compile_command="$compile_command -L$dir";; - esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -L$dir -l$name" - elif test "$hardcode_shlibpath_var" = no; then - case ":$compile_shlibpath:" in - *":$dir:"*) ;; - *) compile_shlibpath="$compile_shlibpath$dir:";; - esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -l$name" - else - lib_linked=no - fi - ;; - - relink) - if test "$hardcode_direct" = yes; then - compile_command="$compile_command $absdir/$linklib" - deplibs="$deplibs $absdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - case "$compile_command " in - *" -L$absdir "*) ;; - *) compile_command="$compile_command -L$absdir";; - esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -L$absdir -l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case ":$compile_shlibpath:" in - *":$absdir:"*) ;; - *) compile_shlibpath="$compile_shlibpath$absdir:";; - esac - compile_command="$compile_command -l$name" - deplibs="$deplibs -l$name" - else - lib_linked=no - fi - ;; - - *) - lib_linked=no - ;; - esac - - if test "$lib_linked" != yes; then - $echo "$modename: configuration error: unsupported hardcode properties" - exit 1 - fi - - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes; then - finalize_command="$finalize_command $libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - case "$finalize_command " in - *" -L$libdir "*) ;; - *) finalize_command="$finalize_command -L$libdir";; - esac - finalize_command="$finalize_command -l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case ":$finalize_shlibpath:" in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:";; - esac - finalize_command="$finalize_command -l$name" - else - # We cannot seem to hardcode it, guess we'll fake it. - case "$finalize_command " in - *" -L$dir "*) ;; - *) finalize_command="$finalize_command -L$libdir";; - esac - finalize_command="$finalize_command -l$name" - fi - else - # Transform directly to old archives if we don't build new libraries. - if test -n "$pic_flag" && test -z "$old_library"; then - $echo "$modename: cannot find static library for `$arg'" 1>&2 - exit 1 - fi - - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_command="$compile_command $dir/$linklib" - finalize_command="$finalize_command $dir/$linklib" - else - case "$compile_command " in - *" -L$dir "*) ;; - *) compile_command="$compile_command -L$dir";; - esac - compile_command="$compile_command -l$name" - case "$finalize_command " in - *" -L$dir "*) ;; - *) finalize_command="$finalize_command -L$dir";; - esac - finalize_command="$finalize_command -l$name" - fi - fi - - # Add in any libraries that this one depends upon. - compile_command="$compile_command$dependency_libs" - finalize_command="$finalize_command$dependency_libs" - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[[~#^&*(){}|;<>?'\ \ ]*|*]*) - arg=""$arg"" - ;; - esac - ;; - esac - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - done - - if test -n "$prev"; then - $echo "$modename: the `$prevarg' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg="$export_dynamic_flag_spec" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` - libobjs_save="$libobjs" - - case "$output" in - "") - $echo "$modename: you must specify an output file" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - - *.a | *.lib) - if test -n "$link_against_libtool_libs"; then - $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 - exit 1 - fi - - if test -n "$deplibs"; then - $echo "$modename: warning: `-l' and `-L' are ignored for archives" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: `-dlopen' is ignored for archives" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: `-rpath' is ignored for archives" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: `-R' is ignored for archives" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: `-version-info' is ignored for archives" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: `-release' is ignored for archives" 1>&2 - fi - - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: warning: `-export-symbols' is ignored for archives" 1>&2 - fi - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - ;; - - *.la) - # Make sure we only generate libraries of the form `libNAME.la'. - case "$outputname" in - lib*) - name=`$echo "X$outputname" | $Xsed -e 's/.la$//' -e 's/^lib//'` - eval libname="$libname_spec" - ;; - *) - if test "$module" = no; then - $echo "$modename: libtool library `$output' must begin with `lib'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - name=`$echo "X$outputname" | $Xsed -e 's/.la$//'` - eval libname="$libname_spec" - else - libname=`$echo "X$outputname" | $Xsed -e 's/.la$//'` - fi - ;; - esac - - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - - if test -n "$objs"; then - $echo "$modename: cannot build libtool library `$output' from non-libtool objects:$objs" 2>&1 - exit 1 - fi - - # How the heck are we supposed to write a wrapper for a shared library? - if test -n "$link_against_libtool_libs"; then - $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 - exit 1 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: `-dlopen' is ignored for libtool libraries" 1>&2 - fi - - set dummy $rpath - if test $# -gt 2; then - $echo "$modename: warning: ignoring multiple `-rpath's for a libtool library" 1>&2 - fi - install_libdir="$2" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - libext=al - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - dependency_libs="$deplibs" - - if test -n "$vinfo"; then - $echo "$modename: warning: `-version-info' is ignored for convenience libraries" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: `-release' is ignored for convenience libraries" 1>&2 - fi - else - - # Parse the version information argument. - IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - IFS="$save_ifs" - - if test -n "$8"; then - $echo "$modename: too many parameters to `-version-info'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - current="$2" - revision="$3" - age="$4" - - # Check that each of the things are valid numbers. - case "$current" in - 0 | [1-9] | [1-9][0-9]*) ;; - *) - $echo "$modename: CURRENT `$current' is not a nonnegative integer" 1>&2 - $echo "$modename: `$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case "$revision" in - 0 | [1-9] | [1-9][0-9]*) ;; - *) - $echo "$modename: REVISION `$revision' is not a nonnegative integer" 1>&2 - $echo "$modename: `$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case "$age" in - 0 | [1-9] | [1-9][0-9]*) ;; - *) - $echo "$modename: AGE `$age' is not a nonnegative integer" 1>&2 - $echo "$modename: `$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - if test $age -gt $current; then - $echo "$modename: AGE `$age' is greater than the current interface number `$current'" 1>&2 - $echo "$modename: `$vinfo' is not valid version information" 1>&2 - exit 1 - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case "$version_type" in - none) ;; - - irix) - major=`expr $current - $age + 1` - versuffix="$major.$revision" - verstring="sgi$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test $loop != 0; do - iface=`expr $revision - $loop` - loop=`expr $loop - 1` - verstring="sgi$major.$iface:$verstring" - done - ;; - - linux) - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - ;; - - osf) - major=`expr $current - $age` - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test $loop != 0; do - iface=`expr $current - $loop` - loop=`expr $loop - 1` - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current"; - ;; - - windows) - # Like Linux, but with '-' rather than '.', since we only - # want one extension on Windows 95. - major=`expr $current - $age` - versuffix="-$major-$age-$revision" - ;; - - *) - $echo "$modename: unknown library version type `$version_type'" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - verstring="0.0" - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - dependency_libs="$deplibs" - case "$host" in - *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) - # these systems don't actually have a c library (as such)! - ;; - *) - # Add libc to deplibs on all other systems. - deplibs="$deplibs -lc" - ;; - esac - fi - - # Create the output directory, or remove our outputs if we need to. - if test -d $output_objdir; then - $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" - $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* - else - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - status=$? - if test $status -ne 0 && test ! -d $output_objdir; then - exit $status - fi - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - if test "$build_libtool_libs" = yes; then - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case "$deplibs_check_method" in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behaviour. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $rm conftest.c - cat > conftest.c <<EOF - int main() { return 0; } -EOF - $rm conftest - $CC -o conftest conftest.c $deplibs - if test $? -eq 0 ; then - ldd_output=`ldd conftest` - for i in $deplibs; do - name="`expr $i : '-l(.*)'`" - # If $name is empty we are operating on a -L argument. - if test "$name" != "" ; then - libname=`eval \$echo "$libname_spec"` - deplib_matches=`eval \$echo "$library_names_spec"` - set dummy $deplib_matches - deplib_match=$2 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - fi - else - newdeplibs="$newdeplibs $i" - fi - done - else - # Error occured in the first compile. Let's try to salvage the situation: - # Compile a seperate program for each library. - for i in $deplibs; do - name="`expr $i : '-l(.*)'`" - # If $name is empty we are operating on a -L argument. - if test "$name" != "" ; then - $rm conftest - $CC -o conftest conftest.c $i - # Did it work? - if test $? -eq 0 ; then - ldd_output=`ldd conftest` - libname=`eval \$echo "$libname_spec"` - deplib_matches=`eval \$echo "$library_names_spec"` - set dummy $deplib_matches - deplib_match=$2 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - fi - else - droppeddeps=yes - echo - echo "*** Warning! Library $i is needed by this library but I was not able to" - echo "*** make it link in! You will probably need to install it or some" - echo "*** library that it depends on before this library will be fully" - echo "*** functional. Installing it before continuing would be even better." - fi - else - newdeplibs="$newdeplibs $i" - fi - done - fi - ;; - file_magic*) - set dummy $deplibs_check_method - file_magic_regex="`expr "$deplibs_check_method" : "$2 (.*)"`" - for a_deplib in $deplibs; do - name="`expr $a_deplib : '-l(.*)'`" - # If $name is empty we are operating on a -L argument. - if test "$name" != "" ; then - libname=`eval \$echo "$libname_spec"` - for i in $lib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null \ - | grep " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | sed 's/.* -> //'` - case "$potliblink" in - [\/]* | [A-Za-z]:[\/]*) potlib="$potliblink";; - *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd "$potlib" 2>/dev/null \ - | sed 10q \ - | egrep "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | - grep . >/dev/null; then - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - fi - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - echo "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using `nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** `nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - # Get the real and link names of the library. - eval library_names="$library_names_spec" - set dummy $library_names - realname="$2" - shift; shift - - if test -n "$soname_spec"; then - eval soname="$soname_spec" - else - soname="$realname" - fi - - lib="$output_objdir/$realname" - for link - do - linknames="$linknames $link" - done - - # Ensure that we have .o objects for linkers which dislike .lo - # (e.g. aix) in case we are running --disable-static - for obj in $libobjs; do - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - if test ! -f $xdir/$oldobj; then - $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" - $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? - fi - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - $show "generating symbol list for `$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - eval cmds="$export_symbols_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - if test -n "$export_symbols_regex"; then - $show "egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"" - $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - $show "$mv "${export_symbols}T" "$export_symbols"" - $run eval '$mv "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' - fi - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval libobjs="$libobjs $whole_archive_flag_spec" - else - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case "$xlib" in - [\/]* | [A-Za-z]:[\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd $xdir && $AR x $xabs)" || exit $? - - libobjs="$libobjs "`find $xdir -name *.o -print -o -name *.lo -print | $NL2SP` - done - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag="$thread_safe_flag_spec" - linkopts="$linkopts $flag" - fi - - # Do each of the archive commands. - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds="$archive_expsym_cmds" - else - eval cmds="$archive_cmds" - fi - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - *.lo | *.o | *.obj) - if test -n "$link_against_libtool_libs"; then - $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 - exit 1 - fi - - if test -n "$deplibs"; then - $echo "$modename: warning: `-l' and `-L' are ignored for objects" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: `-dlopen' is ignored for objects" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: `-rpath' is ignored for objects" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: `-R' is ignored for objects" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: `-version-info' is ignored for objects" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: `-release' is ignored for objects" 1>&2 - fi - - case "$output" in - *.lo) - if test -n "$objs"; then - $echo "$modename: cannot build library object `$output' from non-libtool objects" 1>&2 - exit 1 - fi - libobj="$output" - obj=`$echo "X$output" | $Xsed -e "$lo2o"` - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $run $rm $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval reload_conv_objs="$reload_objs $whole_archive_flag_spec" - else - gentop="$output_objdir/${obj}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case "$xlib" in - [\/]* | [A-Za-z]:[\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd $xdir && $AR x $xabs)" || exit $? - - reload_conv_objs="$reload_objs "`find $xdir -name *.o -print -o -name *.lo -print | $NL2SP` - done - fi - fi - - # Create the old-style object. - reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/.'${libext}$'/d' -e '/.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" - - output="$obj" - eval cmds="$reload_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - $show "echo timestamp > $libobj" - $run eval "echo timestamp > $libobj" || exit $? - exit 0 - fi - - if test -n "$pic_flag"; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - eval cmds="$reload_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - else - # Just create a symlink. - $show $rm $libobj - $run $rm $libobj - xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$libobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - $show "(cd $xdir && $LN_S $oldobj $baseobj)" - $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? - fi - - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - ;; - - # Anything else should be a program. - *) - if test -n "$vinfo"; then - $echo "$modename: warning: `-version-info' is ignored for programs" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: `-release' is ignored for programs" 1>&2 - fi - - if test "$preload" = yes; then - if test "$dlopen" = unknown && test "$dlopen_self" = unknown && - test "$dlopen_self_static" = unknown; then - $echo "$modename: warning: `AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." - fi - fi - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$compile_rpath " in - *" $libdir "*) ;; - *) compile_rpath="$compile_rpath $libdir" ;; - esac - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag="$hardcode_libdir_flag_spec" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=" $hardcode_libdir_flag_spec" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag="$hardcode_libdir_flag_spec" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=" $hardcode_libdir_flag_spec" - fi - finalize_rpath="$rpath" - - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - - # Create the binary in the object directory, then wrap it. - if test ! -d $output_objdir; then - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - status=$? - if test $status -ne 0 && test ! -d $output_objdir; then - exit $status - fi - fi - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - fi - - dlsyms= - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - dlsyms="${outputname}S.c" - else - $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 - fi - fi - - if test -n "$dlsyms"; then - case "$dlsyms" in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${outputname}.nm" - - $show "$rm $nlist ${nlist}S ${nlist}T" - $run $rm "$nlist" "${nlist}S" "${nlist}T" - - # Parse the name list into a source file. - $show "creating $output_objdir/$dlsyms" - - test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ -/* $dlsyms - symbol resolution table for `$outputname' dlsym emulation. */ -/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Prevent the only kind of declaration conflicts we can make. */ -#define lt_preloaded_symbols some_other_symbol - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - $show "generating symbol list for `$output'" - - test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - for arg in $progfiles; do - $show "extracting global C symbols from `$arg'" - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - if test -n "$export_symbols_regex"; then - $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$output.exp" - $run $rm $export_symbols - $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* (.*)$/\1/p' "'< "$nlist" > "$export_symbols"' - else - $run eval "sed -e 's/([][.*^$])/\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' - $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' - $run eval 'mv "$nlist"T "$nlist"' - fi - fi - - for arg in $dlprefiles; do - $show "extracting global C symbols from `$arg'" - name=`echo "$arg" | sed -e 's%^.*/%%'` - $run eval 'echo ": $name " >> "$nlist"' - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -z "$run"; then - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $mv "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then - : - else - grep -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$dlsyms" - fi - - $echo >> "$output_objdir/$dlsyms" "\ - -#undef lt_preloaded_symbols - -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[] = -{\ -" - - sed -n -e 's/^: ([^ ]*) $/ {"\1", (lt_ptr_t) 0},/p' \ - -e 's/^. ([^ ]*) ([^ ]*)$/ {"\2", (lt_ptr_t) &\2},/p' \ - < "$nlist" >> "$output_objdir/$dlsyms" - - $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr_t) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - fi - - pic_flag_for_symtable= - case "$host" in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; - esac;; - *-*-hpux*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC";; - esac - esac - - # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")" - $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? - - # Clean up the generated files. - $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" - $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" - - # Transform the symbol file into the correct name. - compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - ;; - *) - $echo "$modename: unknown suffix for `$dlsyms'" 1>&2 - exit 1 - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` - fi - - if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then - # Replace the output file specification. - compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - $show "$link_command" - $run eval "$link_command" - status=$? - - # Delete the generated files. - if test -n "$dlsyms"; then - $show "$rm $output_objdir/${outputname}S.${objext}" - $run $rm "$output_objdir/${outputname}S.${objext}" - fi - - exit $status - fi - - if test -n "$shlibpath_var"; then - # We should set the shlibpath_var - rpath= - for dir in $temp_rpath; do - case "$dir" in - [\/]* | [A-Za-z]:[\/]*) - # Absolute path. - rpath="$rpath$dir:" - ;; - *) - # Relative path: add a thisdir entry. - rpath="$rpath$thisdir/$dir:" - ;; - esac - done - temp_rpath="$rpath" - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var="$compile_shlibpath$finalize_shlibpath$$shlibpath_var" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var="$finalize_shlibpath$$shlibpath_var" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - compile_var="$runpath_var="$rpath$$runpath_var" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" - done - finalize_var="$runpath_var="$rpath$$runpath_var" " - fi - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 - $echo "$modename: `$output' will be relinked during installation" 1>&2 - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%$progdir/$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname - - $show "$link_command" - $run eval "$link_command" || exit $? - - # Now create the wrapper script. - $show "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $0 --fallback-echo"; then - case "$0" in - [\/]* | [A-Za-z]:[\/]*) qecho="$SHELL $0 --fallback-echo";; - *) qecho="$SHELL `pwd`/$0 --fallback-echo";; - esac - qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` - fi - - # Only actually do things if our run command is non-null. - if test -z "$run"; then - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) output=`echo $output|sed 's,.exe$,,'` ;; - esac - $rm $output - trap "$rm $output; exit 1" 1 2 15 - - $echo > $output "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' -sed_quote_subst='$sed_quote_subst' - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "${CDPATH+set}" = set; then CDPATH=:; export CDPATH; fi - -relink_command="$relink_command" - -# This environment variable determines our operation mode. -if test "$libtool_install_magic" = "$magic"; then - # install mode needs the following variable: - link_against_libtool_libs='$link_against_libtool_libs' -else - # When we are sourced in execute mode, $file and $echo are already set. - if test "$libtool_execute_magic" != "$magic"; then - echo="$qecho" - file="$0" - # Make sure echo works. - if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : - else - # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$0" --no-reexec ${1+"$@"} - fi - fi\ -" - $echo >> $output "\ - - # Find the directory that this script lives in. - thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "x$thisdir" = "x$file" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=`ls -ld "$file" | sed -n 's/.*-> //p'` - while test -n "$file"; do - destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - - # If there was a directory component, then change thisdir. - if test "x$destdir" != "x$file"; then - case "$destdir" in - [\/]* | [A-Za-z]:[\/]*) thisdir="$destdir" ;; - *) thisdir="$thisdir/$destdir" ;; - esac - fi - - file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - file=`ls -ld "$thisdir/$file" | sed -n 's/.*-> //p'` - done - - # Try to get the absolute directory name. - absdir=`cd "$thisdir" && pwd` - test -n "$absdir" && thisdir="$absdir" -" - - if test "$fast_install" = yes; then - echo >> $output "\ - program=lt-'$outputname' - progdir="$thisdir/$objdir" - - if test ! -f "$progdir/$program" || \ - { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | sed 1q`; \ - test "X$file" != "X$progdir/$program"; }; then - - file="$$-$program" - - if test ! -d "$progdir"; then - $mkdir "$progdir" - else - $rm "$progdir/$file" - fi" - - echo >> $output "\ - - # relink executable if necessary - if test -n "$relink_command"; then - if (cd "$thisdir" && eval $relink_command); then : - else - $rm "$progdir/$file" - exit 1 - fi - fi - - $mv "$progdir/$file" "$progdir/$program" 2>/dev/null || - { $rm "$progdir/$program"; - $mv "$progdir/$file" "$progdir/$program"; } - $rm "$progdir/$file" - fi" - else - echo >> $output "\ - program='$outputname' - progdir="$thisdir/$objdir" -" - fi - - echo >> $output "\ - - if test -f "$progdir/$program"; then" - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $echo >> $output "\ - # Add our own library path to $shlibpath_var - $shlibpath_var="$temp_rpath$$shlibpath_var" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=`$echo "X$$shlibpath_var" | $Xsed -e 's/::*$//'` - - export $shlibpath_var -" - fi - - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $echo >> $output "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:$PATH -" - fi - - $echo >> $output "\ - if test "$libtool_execute_magic" != "$magic"; then - # Run the actual program with our arguments. -" - case $host in - *-*-cygwin* | *-*-mingw | *-*-os2*) - # win32 systems need to use the prog path for dll - # lookup to work - $echo >> $output "\ - exec $progdir\\$program ${1+"$@"} -" - ;; - *) - $echo >> $output "\ - # Export the path to the program. - PATH="$progdir:$PATH" - export PATH - - exec $program ${1+"$@"} -" - ;; - esac - $echo >> $output "\ - $echo "$0: cannot exec $program ${1+"$@"}" - exit 1 - fi - else - # The program doesn't exist. - $echo "$0: error: $progdir/$program does not exist" 1>&2 - $echo "This script is just a wrapper for $program." 1>&2 - echo "See the $PACKAGE documentation for more information." 1>&2 - exit 1 - fi -fi\ -" - chmod +x $output - fi - exit 0 - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/.'${libext}'$/d' -e '/.lib$/d' -e "$lo2o" | $NL2SP` - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - # Add in members from convenience archives. - for xlib in $addlibs; do - # Extract the objects. - case "$xlib" in - [\/]* | [A-Za-z]:[\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd $xdir && $AR x $xabs)" || exit $? - - oldobjs="$oldobjs "`find $xdir -name *.${objext} -print -o -name *.lo -print | $NL2SP` - done - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - eval cmds="$old_archive_from_new_cmds" - else - # Ensure that we have .o objects in place in case we decided - # not to build a shared library, and have fallen back to building - # static libs even though --disable-static was passed! - for oldobj in $oldobjs; do - if test ! -f $oldobj; then - xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$oldobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` - obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - $show "(cd $xdir && ${LN_S} $obj $baseobj)" - $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? - fi - done - - eval cmds="$old_archive_cmds" - fi - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$generated"; then - $show "${rm}r$generated" - $run ${rm}r$generated - fi - - # Now create the libtool archive. - case "$output" in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - $show "creating $output" - - if test -n "$xrpath"; then - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - done - dependency_libs="$temp_xrpath $dependency_libs" - fi - - # Only create the output if not a dry run. - if test -z "$run"; then - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - fi - $rm $output - $echo > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$dlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Directory that this library needs to be installed in: -libdir='$install_libdir'\ -" - done - fi - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" - $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $? - ;; - esac - exit 0 - ;; - - # libtool install mode - install) - modename="$modename: install" - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then - # Aesthetically quote it. - arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[[~#^&*(){}|;<>?'\ \ ]*|*]*) - arg=""$arg"" - ;; - esac - install_prog="$arg " - arg="$1" - shift - else - install_prog= - arg="$nonopt" - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[[~#^&*(){}|;<>?'\ \ ]*|*]*) - arg=""$arg"" - ;; - esac - install_prog="$install_prog$arg" - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - for arg - do - if test -n "$dest"; then - files="$files $dest" - dest="$arg" - continue - fi - - case "$arg" in - -d) isdir=yes ;; - -f) prev="-f" ;; - -g) prev="-g" ;; - -m) prev="-m" ;; - -o) prev="-o" ;; - -s) - stripme=" -s" - continue - ;; - -*) ;; - - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - prev= - else - dest="$arg" - continue - fi - ;; - esac - - # Aesthetically quote the argument. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case "$arg" in - *[[~#^&*(){}|;<>?'\ \ ]*|*]*) - arg=""$arg"" - ;; - esac - install_prog="$install_prog $arg" - done - - if test -z "$install_prog"; then - $echo "$modename: you must specify an install program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -n "$prev"; then - $echo "$modename: the `$prev' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -z "$files"; then - if test -z "$dest"; then - $echo "$modename: no file or destination specified" 1>&2 - else - $echo "$modename: you must specify a destination" 1>&2 - fi - $echo "$help" 1>&2 - exit 1 - fi - - # Strip any trailing slash from the destination. - dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` - test "X$destdir" = "X$dest" && destdir=. - destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` - - # Not a directory, so check to see that there is only one file specified. - set dummy $files - if test $# -gt 2; then - $echo "$modename: `$dest' is not a directory" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - fi - case "$destdir" in - [\/]* | [A-Za-z]:[\/]*) ;; - *) - for file in $files; do - case "$file" in - *.lo) ;; - *) - $echo "$modename: `$destdir' must be an absolute directory name" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case "$file" in - *.a | *.lib) - # Do the static libraries later. - staticlibs="$staticlibs $file" - ;; - - *.la) - # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: `$file' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - library_names= - old_library= - # If there is no directory component, then add one. - case "$file" in - */* | *\*) . $file ;; - *) . ./$file ;; - esac - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; - esac - fi - - dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" - test "X$dir" = "X$file/" && dir= - dir="$dir$objdir" - - # See the names of the shared library. - set dummy $library_names - if test -n "$2"; then - realname="$2" - shift - shift - - # Install the shared library and build the symlinks. - $show "$install_prog $dir/$realname $destdir/$realname" - $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? - - if test $# -gt 0; then - # Delete the old symlinks, and create new ones. - for linkname - do - if test "$linkname" != "$realname"; then - $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - fi - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - eval cmds="$postinstall_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Install the pseudo-library for information purposes. - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - instname="$dir/$name"i - $show "$install_prog $instname $destdir/$name" - $run eval "$install_prog $instname $destdir/$name" || exit $? - - # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case "$destfile" in - *.lo) - staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` - ;; - *.o | *.obj) - staticdest="$destfile" - destfile= - ;; - *) - $echo "$modename: cannot copy a libtool object to `$destfile'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - - # Install the libtool object if requested. - if test -n "$destfile"; then - $show "$install_prog $file $destfile" - $run eval "$install_prog $file $destfile" || exit $? - fi - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` - - $show "$install_prog $staticobj $staticdest" - $run eval "$install_prog $staticobj $staticdest" || exit $? - fi - exit 0 - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - link_against_libtool_libs= - relink_command= - - # If there is no directory component, then add one. - case "$file" in - */* | *\*) . $file ;; - *) . ./$file ;; - esac - - # Check the variables that should have been set. - if test -z "$link_against_libtool_libs"; then - $echo "$modename: invalid libtool wrapper script `$file'" 1>&2 - exit 1 - fi - - finalize=yes - for lib in $link_against_libtool_libs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - # If there is no directory component, then add one. - case "$lib" in - */* | *\*) . $lib ;; - *) . ./$lib ;; - esac - fi - libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" - if test -n "$libdir" && test ! -f "$libfile"; then - $echo "$modename: warning: `$lib' has not been installed in `$libdir'" 1>&2 - finalize=no - fi - done - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - if test "$finalize" = yes && test -z "$run"; then - tmpdir="/tmp" - test -n "$TMPDIR" && tmpdir="$TMPDIR" - tmpdir="$tmpdir/libtool-$$" - if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : - else - $echo "$modename: error: cannot create temporary directory `$tmpdir'" 1>&2 - continue - fi - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` - - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink `$file' with the above command before installing it" 1>&2 - ${rm}r "$tmpdir" - continue - fi - file="$outputname" - else - $echo "$modename: warning: cannot relink `$file'" 1>&2 - fi - else - # Install the binary that we compiled earlier. - file=`$echo "X$file" | $Xsed -e "s%([^/]*)$%$objdir/\1%"` - fi - fi - - $show "$install_prog$stripme $file $destfile" - $run eval "$install_prog$stripme $file $destfile" || exit $? - test -n "$outputname" && ${rm}r "$tmpdir" - ;; - esac - done - - for file in $staticlibs; do - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - $show "$install_prog $file $oldlib" - $run eval "$install_prog $file $oldlib" || exit $? - - # Do each command in the postinstall commands. - eval cmds="$old_postinstall_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$future_libdirs"; then - $echo "$modename: warning: remember to run `$progname --finish$future_libdirs'" 1>&2 - fi - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - test -n "$run" && current_libdirs=" -n$current_libdirs" - exec $SHELL $0 --finish$current_libdirs - exit 1 - fi - - exit 0 - ;; - - # libtool finish mode - finish) - modename="$modename: finish" - libdirs="$nonopt" - admincmds= - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done - - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - eval cmds="$finish_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || admincmds="$admincmds - $cmd" - done - IFS="$save_ifs" - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds="$finish_eval" - $run eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - test "$show" = : && exit 0 - - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - echo " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use `-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the `$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the `$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag="$hardcode_libdir_flag_spec" - - echo " - use the `$flag' linker flag" - fi - if test -n "$admincmds"; then - echo " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to `/etc/ld.so.conf'" - fi - echo - echo "See any operating system documentation about shared libraries for" - echo "more information, such as the ld(1) and ld.so(8) manual pages." - echo "----------------------------------------------------------------------" - exit 0 - ;; - - # libtool execute mode - execute) - modename="$modename: execute" - - # The first argument is the command name. - cmd="$nonopt" - if test -z "$cmd"; then - $echo "$modename: you must specify a COMMAND" 1>&2 - $echo "$help" - exit 1 - fi - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - if test ! -f "$file"; then - $echo "$modename: `$file' is not a file" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - dir= - case "$file" in - *.la) - # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: `$lib' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Read the libtool library. - dlname= - library_names= - - # If there is no directory component, then add one. - case "$file" in - */* | *\*) . $file ;; - *) . ./$file ;; - esac - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && $echo "$modename: warning: `$file' was not linked with `-export-dynamic'" - continue - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - $echo "$modename: cannot find `$dlname' in `$dir' or `$dir/$objdir'" 1>&2 - exit 1 - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - ;; - - *) - $echo "$modename: warning `-dlopen' is ignored for non-libtool libraries and objects" 1>&2 - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z "$$shlibpath_var""; then - eval "$shlibpath_var="$dir"" - else - eval "$shlibpath_var="$dir:$$shlibpath_var"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case "$file" in - -*) ;; - *) - # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - # If there is no directory component, then add one. - case "$file" in - */* | *\*) . $file ;; - *) . ./$file ;; - esac - - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` - args="$args "$file"" - done - - if test -z "$run"; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved enviroment variables - if test "${save_LC_ALL+set}" = set; then - LC_ALL="$save_LC_ALL"; export LC_ALL - fi - if test "${save_LANG+set}" = set; then - LANG="$save_LANG"; export LANG - fi - - # Now actually exec the command. - eval "exec $cmd$args" - - $echo "$modename: cannot exec $cmd$args" - exit 1 - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "$echo "$shlibpath_var=$$shlibpath_var"" - $echo "export $shlibpath_var" - fi - $echo "$cmd$args" - exit 0 - fi - ;; - - # libtool uninstall mode - uninstall) - modename="$modename: uninstall" - rm="$nonopt" - files= - - for arg - do - case "$arg" in - -*) rm="$rm $arg" ;; - *) files="$files $arg" ;; - esac - done - - if test -z "$rm"; then - $echo "$modename: you must specify an RM program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - for file in $files; do - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - - rmfiles="$file" - - case "$name" in - *.la) - # Possibly a libtool archive, so verify it. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - . $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - rmfiles="$rmfiles $dir/$n" - done - test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" - - $show "$rm $rmfiles" - $run $rm $rmfiles - - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - eval cmds="$postuninstall_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - done - IFS="$save_ifs" - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - eval cmds="$old_postuninstall_cmds" - IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - done - IFS="$save_ifs" - fi - - # FIXME: should reinstall the best remaining shared library. - fi - ;; - - *.lo) - if test "$build_old_libs" = yes; then - oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` - rmfiles="$rmfiles $dir/$oldobj" - fi - $show "$rm $rmfiles" - $run $rm $rmfiles - ;; - - *) - $show "$rm $rmfiles" - $run $rm $rmfiles - ;; - esac - done - exit 0 - ;; - - "") - $echo "$modename: you must specify a MODE" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 - ;; - esac - - $echo "$modename: invalid operation mode `$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 -fi # test -z "$show_help" - -# We need to display help for each of the modes. -case "$mode" in -"") $echo \ -"Usage: $modename [OPTION]... [MODE-ARG]... - -Provide generalized library-building support services. - - --config show all configuration variables - --debug enable verbose shell tracing --n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --finish same as `--mode=finish' - --help display this help message and exit - --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] - --quiet same as `--silent' - --silent don't print informational messages - --version print version information - -MODE must be one of the following: - - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. Try `$modename --help --mode=MODE' for -a more detailed description of MODE." - exit 0 - ;; - -compile) - $echo \ -"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -static always build a `.o' file suitable for static linking - -COMPILE-COMMAND is a command to be used in creating a `standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix `.c' with the -library object suffix, `.lo'." - ;; - -execute) - $echo \ -"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to `-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - -finish) - $echo \ -"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the `--dry-run' option if you just want to see what would be executed." - ;; - -install) - $echo \ -"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the `install' or `cp' program. - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - -link) - $echo \ -"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -dlopen FILE `-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -static do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -All other options (arguments beginning with `-') are ignored. - -Every other argument is treated as a filename. Files ending in `.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in `.la', then a libtool library is created, -only library objects (`.lo' files) may be specified, and `-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in `.a' or `.lib', then a standard library is created -using `ar' and `ranlib', or on Windows using `lib'. - -If OUTPUT-FILE ends in `.lo' or `.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - -uninstall) - $echo \ -"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically `/bin/rm'). RM-OPTIONS are options (such as `-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - -*) - $echo "$modename: invalid operation mode `$mode'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; -esac - -echo -$echo "Try `$modename --help' for more information about other modes." - -exit 0 - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/external/privoxy/pcre/maketables.c b/external/privoxy/pcre/maketables.c deleted file mode 100644 index c0f06c0..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - - Copyright (c) 1997-2000 University of Cambridge - ------------------------------------------------------------------------------ -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. ------------------------------------------------------------------------------ - -See the file Tech.Notes for some information on the internals. -*/ - - -/* This file is compiled on its own as part of the PCRE library. However, -it is also included in the compilation of dftables.c, in which case the macro -DFTABLES is defined. */ - -#ifndef DFTABLES -#include "internal.h" -#endif - - - -/************************************************* -* Create PCRE character tables * -*************************************************/ - -/* This function builds a set of character tables for use by PCRE and returns -a pointer to them. They are build using the ctype functions, and consequently -their contents will depend upon the current locale setting. When compiled as -part of the library, the store is obtained via pcre_malloc(), but when compiled -inside dftables, use malloc(). - -Arguments: none -Returns: pointer to the contiguous block of data -*/ - -unsigned const char * -pcre_maketables(void) -{ -unsigned char *yield, *p; -int i; - -#ifndef DFTABLES -yield = (unsigned char*)(pcre_malloc)(tables_length); -#else -yield = (unsigned char*)malloc(tables_length); -#endif - -if (yield == NULL) return NULL; -p = yield; - -/* First comes the lower casing table */ - -for (i = 0; i < 256; i++) *p++ = tolower(i); - -/* Next the case-flipping table */ - -for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); - -/* Then the character class tables. Don't try to be clever and save effort -on exclusive ones - in some locales things may be different. */ - -memset(p, 0, cbit_length); -for (i = 0; i < 256; i++) - { - if (isdigit(i)) - { - p[cbit_digit + i/8] |= 1 << (i&7); - p[cbit_word + i/8] |= 1 << (i&7); - } - if (isupper(i)) - { - p[cbit_upper + i/8] |= 1 << (i&7); - p[cbit_word + i/8] |= 1 << (i&7); - } - if (islower(i)) - { - p[cbit_lower + i/8] |= 1 << (i&7); - p[cbit_word + i/8] |= 1 << (i&7); - } - if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); - if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); - if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); - if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); - if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); - if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); - if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); - } -p += cbit_length; - -/* Finally, the character type table */ - -for (i = 0; i < 256; i++) - { - int x = 0; - if (isspace(i)) x += ctype_space; - if (isalpha(i)) x += ctype_letter; - if (isdigit(i)) x += ctype_digit; - if (isxdigit(i)) x += ctype_xdigit; - if (isalnum(i) || i == '_') x += ctype_word; - if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; - *p++ = x; - } - -return yield; -} - -/* End of maketables.c */ diff --git a/external/privoxy/pcre/pcre-config b/external/privoxy/pcre/pcre-config deleted file mode 100755 index ac9ccfe..0000000 --- a/external/privoxy/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/external/privoxy/pcre/pcre-config.in b/external/privoxy/pcre/pcre-config.in deleted file mode 100644 index 8daded9..0000000 --- a/external/privoxy/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/external/privoxy/pcre/pcre.c b/external/privoxy/pcre/pcre.c deleted file mode 100644 index 5149f8d..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - - Copyright (c) 1997-2000 University of Cambridge - ------------------------------------------------------------------------------ -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. ------------------------------------------------------------------------------ -*/ - - -/* Define DEBUG to get debugging output on stdout. */ - -/* #define DEBUG */ - -/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef -inline, and there are *still* stupid compilers about that don't like indented -pre-processor statements. I suppose it's only been 10 years... */ - -#ifdef DEBUG -#define DPRINTF(p) printf p -#else -#define DPRINTF(p) /*nothing*/ -#endif - -/* Include the internals header, which itself includes Standard C headers plus -the external pcre header. */ - -#include "internal.h" - - -/* Allow compilation as C++ source code, should anybody want to do that. */ - -#ifdef __cplusplus -#define class pcre_class -#endif - - -/* Number of items on the nested bracket stacks at compile time. This should -not be set greater than 200. */ - -#define BRASTACK_SIZE 200 - - -/* The number of bytes in a literal character string above which we can't add -any more is different when UTF-8 characters may be encountered. */ - -#ifdef SUPPORT_UTF8 -#define MAXLIT 250 -#else -#define MAXLIT 255 -#endif - - -/* Min and max values for the common repeats; for the maxima, 0 => infinity */ - -static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; -static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; - -/* Text forms of OP_ values and things, for debugging (not all used) */ - -#ifdef DEBUG -static const char *OP_names[] = { - "End", "\A", "\B", "\b", "\D", "\d", - "\S", "\s", "\W", "\w", "\Z", "\z", - "Opt", "^", "$", "Any", "chars", "not", - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", - "*", "*?", "+", "+?", "?", "??", "{", "{", - "class", "Ref", "Recurse", - "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", - "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref", - "Brazero", "Braminzero", "Bra" -}; -#endif - -/* Table for handling escaped characters in the range '0'-'z'. Positive returns -are simple data values; negative values are for special things like \d and so -on. Zero means further processing is needed (for things like \x), or the escape -is invalid. */ - -static const short int escapes[] = { - 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ - 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */ - '@', -ESC_A, -ESC_B, 0, -ESC_D, 0, 0, 0, /* @ - G */ - 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ - 0, 0, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */ - 0, 0, -ESC_Z, '[', '\', ']', '^', '_', /* X - _ */ - '`', 7, -ESC_b, 0, -ESC_d, 27, '\f', 0, /* ` - g */ - 0, 0, 0, 0, 0, 0, '\n', 0, /* h - o */ - 0, 0, '\r', -ESC_s, '\t', 0, 0, -ESC_w, /* p - w */ - 0, 0, -ESC_z /* x - z */ -}; - -/* Tables of names of POSIX character classes and their lengths. The list is -terminated by a zero length entry. The first three must be alpha, upper, lower, -as this is assumed for handling case independence. */ - -static const char *posix_names[] = { - "alpha", "lower", "upper", - "alnum", "ascii", "cntrl", "digit", "graph", - "print", "punct", "space", "word", "xdigit" }; - -static const uschar posix_name_lengths[] = { - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; - -/* Table of class bit maps for each POSIX class; up to three may be combined -to form the class. */ - -static const int posix_class_maps[] = { - cbit_lower, cbit_upper, -1, /* alpha */ - cbit_lower, -1, -1, /* lower */ - cbit_upper, -1, -1, /* upper */ - cbit_digit, cbit_lower, cbit_upper, /* alnum */ - cbit_print, cbit_cntrl, -1, /* ascii */ - cbit_cntrl, -1, -1, /* cntrl */ - cbit_digit, -1, -1, /* digit */ - cbit_graph, -1, -1, /* graph */ - cbit_print, -1, -1, /* print */ - cbit_punct, -1, -1, /* punct */ - cbit_space, -1, -1, /* space */ - cbit_word, -1, -1, /* word */ - cbit_xdigit,-1, -1 /* xdigit */ -}; - - -/* Definition to allow mutual recursion */ - -static BOOL - compile_regex(int, int, int *, uschar **, const uschar **, const char **, - BOOL, int, int *, int *, compile_data *); - -/* Structure for building a chain of data that actually lives on the -stack, for holding the values of the subject pointer at the start of each -subpattern, so as to detect when an empty string has been matched by a -subpattern - to break infinite loops. */ - -typedef struct eptrblock { - struct eptrblock *prev; - const uschar *saved_eptr; -} eptrblock; - -/* Flag bits for the match() function */ - -#define match_condassert 0x01 /* Called to check a condition assertion */ -#define match_isgroup 0x02 /* Set if start of bracketed group */ - - - -/************************************************* -* Global variables * -*************************************************/ - -/* PCRE is thread-clean and doesn't use any global variables in the normal -sense. However, it calls memory allocation and free functions via the two -indirections below, which are can be changed by the caller, but are shared -between all threads. */ - -void *(*pcre_malloc)(size_t) = malloc; -void (*pcre_free)(void *) = free; - - - -/************************************************* -* Macros and tables for character handling * -*************************************************/ - -/* When UTF-8 encoding is being used, a character is no longer just a single -byte. The macros for character handling generate simple sequences when used in -byte-mode, and more complicated ones for UTF-8 characters. */ - -#ifndef SUPPORT_UTF8 -#define GETCHARINC(c, eptr) c = *eptr++; -#define GETCHARLEN(c, eptr, len) c = *eptr; -#define BACKCHAR(eptr) - -#else /* SUPPORT_UTF8 */ - -/* Get the next UTF-8 character, advancing the pointer */ - -#define GETCHARINC(c, eptr) \ - c = *eptr++; \ - if (md->utf8 && (c & 0xc0) == 0xc0) \ - { \ - int a = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ - int s = 6 - a; /* Amount to shift next byte */ \ - c &= utf8_table3[a]; /* Low order bits from first byte */ \ - while (a-- > 0) \ - { \ - c |= (*eptr++ & 0x3f) << s; \ - s += 6; \ - } \ - } - -/* Get the next UTF-8 character, not advancing the pointer, setting length */ - -#define GETCHARLEN(c, eptr, len) \ - c = *eptr; \ - len = 1; \ - if (md->utf8 && (c & 0xc0) == 0xc0) \ - { \ - int i; \ - int a = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ - int s = 6 - a; /* Amount to shift next byte */ \ - c &= utf8_table3[a]; /* Low order bits from first byte */ \ - for (i = 1; i <= a; i++) \ - { \ - c |= (eptr[i] & 0x3f) << s; \ - s += 6; \ - } \ - len += a; \ - } - -/* If the pointer is not at the start of a character, move it back until -it is. */ - -#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--; - -#endif - - - -/************************************************* -* Default character tables * -*************************************************/ - -/* A default set of character tables is included in the PCRE binary. Its source -is built by the maketables auxiliary program, which uses the default C ctypes -functions, and put in the file chartables.c. These tables are used by PCRE -whenever the caller of pcre_compile() does not provide an alternate set of -tables. */ - -#include "chartables.c" - - - -#ifdef SUPPORT_UTF8 -/************************************************* -* Tables for UTF-8 support * -*************************************************/ - -/* These are the breakpoints for different numbers of bytes in a UTF-8 -character. */ - -static int utf8_table1[] = { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; - -/* These are the indicator bits and the mask for the data bits to set in the -first byte of a character, indexed by the number of additional bytes. */ - -static int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; -static int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; - -/* Table of the number of extra characters, indexed by the first character -masked with 0x3f. The highest number for a valid UTF-8 character is in fact -0x3d. */ - -static uschar utf8_table4[] = { - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; - - -/************************************************* -* Convert character value to UTF-8 * -*************************************************/ - -/* This function takes an integer value in the range 0 - 0x7fffffff -and encodes it as a UTF-8 character in 0 to 6 bytes. - -Arguments: - cvalue the character value - buffer pointer to buffer for result - at least 6 bytes long - -Returns: number of characters placed in the buffer -*/ - -static int -ord2utf8(int cvalue, uschar *buffer) -{ -register int i, j; -for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) - if (cvalue <= utf8_table1[i]) break; -*buffer++ = utf8_table2[i] | (cvalue & utf8_table3[i]); -cvalue >>= 6 - i; -for (j = 0; j < i; j++) - { - *buffer++ = 0x80 | (cvalue & 0x3f); - cvalue >>= 6; - } -return i + 1; -} -#endif - - - -/************************************************* -* Return version string * -*************************************************/ - -#define STRING(a) # a -#define XSTRING(s) STRING(s) - -const char * -pcre_version(void) -{ -return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE); -} - - - - -/************************************************* -* (Obsolete) Return info about compiled pattern * -*************************************************/ - -/* This is the original "info" function. It picks potentially useful data out -of the private structure, but its interface was too rigid. It remains for -backwards compatibility. The public options are passed back in an int - though -the re->options field has been expanded to a long int, all the public options -at the low end of it, and so even on 16-bit systems this will still be OK. -Therefore, I haven't changed the API for pcre_info(). - -Arguments: - external_re points to compiled code - optptr where to pass back the options - first_char where to pass back the first character, - or -1 if multiline and all branches start ^, - or -2 otherwise - -Returns: number of capturing subpatterns - or negative values on error -*/ - -int -pcre_info(const pcre *external_re, int *optptr, int *first_char) -{ -const real_pcre *re = (const real_pcre *)external_re; -if (re == NULL) return PCRE_ERROR_NULL; -if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; -if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS); -if (first_char != NULL) - *first_char = ((re->options & PCRE_FIRSTSET) != 0)? re->first_char : - ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; -return re->top_bracket; -} - - - -/************************************************* -* Return info about compiled pattern * -*************************************************/ - -/* This is a newer "info" function which has an extensible interface so -that additional items can be added compatibly. - -Arguments: - external_re points to compiled code - external_study points to study data, or NULL - what what information is required - where where to put the information - -Returns: 0 if data returned, negative on error -*/ - -int -pcre_fullinfo(const pcre *external_re, const pcre_extra *study_data, int what, - void *where) -{ -const real_pcre *re = (const real_pcre *)external_re; -const real_pcre_extra *study = (const real_pcre_extra *)study_data; - -if (re == NULL || where == NULL) return PCRE_ERROR_NULL; -if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; - -switch (what) - { - case PCRE_INFO_OPTIONS: - *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS; - break; - - case PCRE_INFO_SIZE: - *((size_t *)where) = re->size; - break; - - case PCRE_INFO_CAPTURECOUNT: - *((int *)where) = re->top_bracket; - break; - - case PCRE_INFO_BACKREFMAX: - *((int *)where) = re->top_backref; - break; - - case PCRE_INFO_FIRSTCHAR: - *((int *)where) = - ((re->options & PCRE_FIRSTSET) != 0)? re->first_char : - ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; - break; - - case PCRE_INFO_FIRSTTABLE: - *((const uschar **)where) = - (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? - study->start_bits : NULL; - break; - - case PCRE_INFO_LASTLITERAL: - *((int *)where) = - ((re->options & PCRE_REQCHSET) != 0)? re->req_char : -1; - break; - - default: return PCRE_ERROR_BADOPTION; - } - -return 0; -} - - - -#ifdef DEBUG -/************************************************* -* Debugging function to print chars * -*************************************************/ - -/* Print a sequence of chars in printable format, stopping at the end of the -subject if the requested. - -Arguments: - p points to characters - length number to print - is_subject TRUE if printing from within md->start_subject - md pointer to matching data block, if is_subject is TRUE - -Returns: nothing -*/ - -static void -pchars(const uschar *p, int length, BOOL is_subject, match_data *md) -{ -int c; -if (is_subject && length > md->end_subject - p) length = md->end_subject - p; -while (length-- > 0) - if (isprint(c = *(p++))) printf("%c", c); else printf("\x%02x", c); -} -#endif - - - - -/************************************************* -* Handle escapes * -*************************************************/ - -/* This function is called when a \ has been encountered. It either returns a -positive value for a simple escape such as \n, or a negative value which -encodes one of the more complicated things such as \d. When UTF-8 is enabled, -a positive value greater than 255 may be returned. On entry, ptr is pointing at -the . On exit, it is on the final character of the escape sequence. - -Arguments: - ptrptr points to the pattern position pointer - errorptr points to the pointer to the error message - bracount number of previous extracting brackets - options the options bits - isclass TRUE if inside a character class - cd pointer to char tables block - -Returns: zero or positive => a data character - negative => a special escape sequence - on error, errorptr is set -*/ - -static int -check_escape(const uschar **ptrptr, const char **errorptr, int bracount, - int options, BOOL isclass, compile_data *cd) -{ -const uschar *ptr = *ptrptr; -int c, i; - -/* If backslash is at the end of the pattern, it's an error. */ - -c = *(++ptr); -if (c == 0) *errorptr = ERR1; - -/* Digits or letters may have special meaning; all others are literals. */ - -else if (c < '0' || c > 'z') {} - -/* Do an initial lookup in a table. A non-zero result is something that can be -returned immediately. Otherwise further processing may be required. */ - -else if ((i = escapes[c - '0']) != 0) c = i; - -/* Escapes that need further processing, or are illegal. */ - -else - { - const uschar *oldptr; - switch (c) - { - /* The handling of escape sequences consisting of a string of digits - starting with one that is not zero is not straightforward. By experiment, - the way Perl works seems to be as follows: - - Outside a character class, the digits are read as a decimal number. If the - number is less than 10, or if there are that many previous extracting - left brackets, then it is a back reference. Otherwise, up to three octal - digits are read to form an escaped byte. Thus \123 is likely to be octal - 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal - value is greater than 377, the least significant 8 bits are taken. Inside a - character class, \ followed by a digit is always an octal number. */ - - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - - if (!isclass) - { - oldptr = ptr; - c -= '0'; - while ((cd->ctypes[ptr[1]] & ctype_digit) != 0) - c = c * 10 + *(++ptr) - '0'; - if (c < 10 || c <= bracount) - { - c = -(ESC_REF + c); - break; - } - ptr = oldptr; /* Put the pointer back and fall through */ - } - - /* Handle an octal number following . If the first digit is 8 or 9, Perl - generates a binary zero byte and treats the digit as a following literal. - Thus we have to pull back the pointer by one. */ - - if ((c = *ptr) >= '8') - { - ptr--; - c = 0; - break; - } - - /* \0 always starts an octal number, but we may drop through to here with a - larger first octal digit. */ - - case '0': - c -= '0'; - while(i++ < 2 && (cd->ctypes[ptr[1]] & ctype_digit) != 0 && - ptr[1] != '8' && ptr[1] != '9') - c = c * 8 + *(++ptr) - '0'; - c &= 255; /* Take least significant 8 bits */ - break; - - /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number - which can be greater than 0xff, but only if the ddd are hex digits. */ - - case 'x': -#ifdef SUPPORT_UTF8 - if (ptr[1] == '{' && (options & PCRE_UTF8) != 0) - { - const uschar *pt = ptr + 2; - register int count = 0; - c = 0; - while ((cd->ctypes[*pt] & ctype_xdigit) != 0) - { - count++; - c = c * 16 + cd->lcc[*pt] - - (((cd->ctypes[*pt] & ctype_digit) != 0)? '0' : 'W'); - pt++; - } - if (*pt == '}') - { - if (c < 0 || count > 8) *errorptr = ERR34; - ptr = pt; - break; - } - /* If the sequence of hex digits does not end with '}', then we don't - recognize this construct; fall through to the normal \x handling. */ - } -#endif - - /* Read just a single hex char */ - - c = 0; - while (i++ < 2 && (cd->ctypes[ptr[1]] & ctype_xdigit) != 0) - { - ptr++; - c = c * 16 + cd->lcc[*ptr] - - (((cd->ctypes[*ptr] & ctype_digit) != 0)? '0' : 'W'); - } - break; - - /* Other special escapes not starting with a digit are straightforward */ - - case 'c': - c = *(++ptr); - if (c == 0) - { - *errorptr = ERR2; - return 0; - } - - /* A letter is upper-cased; then the 0x40 bit is flipped */ - - if (c >= 'a' && c <= 'z') c = cd->fcc[c]; - c ^= 0x40; - break; - - /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any - other alphameric following \ is an error if PCRE_EXTRA was set; otherwise, - for Perl compatibility, it is a literal. This code looks a bit odd, but - there used to be some cases other than the default, and there may be again - in future, so I haven't "optimized" it. */ - - default: - if ((options & PCRE_EXTRA) != 0) switch(c) - { - default: - *errorptr = ERR3; - break; - } - break; - } - } - -*ptrptr = ptr; -return c; -} - - - -/************************************************* -* Check for counted repeat * -*************************************************/ - -/* This function is called when a '{' is encountered in a place where it might -start a quantifier. It looks ahead to see if it really is a quantifier or not. -It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} -where the ddds are digits. - -Arguments: - p pointer to the first char after '{' - cd pointer to char tables block - -Returns: TRUE or FALSE -*/ - -static BOOL -is_counted_repeat(const uschar *p, compile_data *cd) -{ -if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; -while ((cd->ctypes[*p] & ctype_digit) != 0) p++; -if (*p == '}') return TRUE; - -if (*p++ != ',') return FALSE; -if (*p == '}') return TRUE; - -if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; -while ((cd->ctypes[*p] & ctype_digit) != 0) p++; -return (*p == '}'); -} - - - -/************************************************* -* Read repeat counts * -*************************************************/ - -/* Read an item of the form {n,m} and return the values. This is called only -after is_counted_repeat() has confirmed that a repeat-count quantifier exists, -so the syntax is guaranteed to be correct, but we need to check the values. - -Arguments: - p pointer to first char after '{' - minp pointer to int for min - maxp pointer to int for max - returned as -1 if no max - errorptr points to pointer to error message - cd pointer to character tables clock - -Returns: pointer to '}' on success; - current ptr on error, with errorptr set -*/ - -static const uschar * -read_repeat_counts(const uschar *p, int *minp, int *maxp, - const char **errorptr, compile_data *cd) -{ -int min = 0; -int max = -1; - -while ((cd->ctypes[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; - -if (*p == '}') max = min; else - { - if (*(++p) != '}') - { - max = 0; - while((cd->ctypes[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; - if (max < min) - { - *errorptr = ERR4; - return p; - } - } - } - -/* Do paranoid checks, then fill in the required variables, and pass back the -pointer to the terminating '}'. */ - -if (min > 65535 || max > 65535) - *errorptr = ERR5; -else - { - *minp = min; - *maxp = max; - } -return p; -} - - - -/************************************************* -* Find the fixed length of a pattern * -*************************************************/ - -/* Scan a pattern and compute the fixed length of subject that will match it, -if the length is fixed. This is needed for dealing with backward assertions. - -Arguments: - code points to the start of the pattern (the bracket) - options the compiling options - -Returns: the fixed length, or -1 if there is no fixed length -*/ - -static int -find_fixedlength(uschar *code, int options) -{ -int length = -1; - -register int branchlength = 0; -register uschar *cc = code + 3; - -/* Scan along the opcodes for this branch. If we get to the end of the -branch, check the length against that of the other branches. */ - -for (;;) - { - int d; - register int op = *cc; - if (op >= OP_BRA) op = OP_BRA; - - switch (op) - { - case OP_BRA: - case OP_ONCE: - case OP_COND: - d = find_fixedlength(cc, options); - if (d < 0) return -1; - branchlength += d; - do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); - cc += 3; - break; - - /* Reached end of a branch; if it's a ket it is the end of a nested - call. If it's ALT it is an alternation in a nested call. If it is - END it's the end of the outer call. All can be handled by the same code. */ - - case OP_ALT: - case OP_KET: - case OP_KETRMAX: - case OP_KETRMIN: - case OP_END: - if (length < 0) length = branchlength; - else if (length != branchlength) return -1; - if (*cc != OP_ALT) return length; - cc += 3; - branchlength = 0; - break; - - /* Skip over assertive subpatterns */ - - case OP_ASSERT: - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); - cc += 3; - break; - - /* Skip over things that don't match chars */ - - case OP_REVERSE: - cc++; - /* Fall through */ - - case OP_CREF: - case OP_OPT: - cc++; - /* Fall through */ - - case OP_SOD: - case OP_EOD: - case OP_EODN: - case OP_CIRC: - case OP_DOLL: - case OP_NOT_WORD_BOUNDARY: - case OP_WORD_BOUNDARY: - cc++; - break; - - /* Handle char strings. In UTF-8 mode we must count characters, not bytes. - This requires a scan of the string, unfortunately. We assume valid UTF-8 - strings, so all we do is reduce the length by one for byte whose bits are - 10xxxxxx. */ - - case OP_CHARS: - branchlength += *(++cc); -#ifdef SUPPORT_UTF8 - for (d = 1; d <= *cc; d++) - if ((cc[d] & 0xc0) == 0x80) branchlength--; -#endif - cc += *cc + 1; - break; - - /* Handle exact repetitions */ - - case OP_EXACT: - case OP_TYPEEXACT: - branchlength += (cc[1] << 8) + cc[2]; - cc += 4; - break; - - /* Handle single-char matchers */ - - case OP_NOT_DIGIT: - case OP_DIGIT: - case OP_NOT_WHITESPACE: - case OP_WHITESPACE: - case OP_NOT_WORDCHAR: - case OP_WORDCHAR: - case OP_ANY: - branchlength++; - cc++; - break; - - - /* Check a class for variable quantification */ - - case OP_CLASS: - cc += (*cc == OP_REF)? 2 : 33; - - switch (*cc) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRQUERY: - case OP_CRMINQUERY: - return -1; - - case OP_CRRANGE: - case OP_CRMINRANGE: - if ((cc[1] << 8) + cc[2] != (cc[3] << 8) + cc[4]) return -1; - branchlength += (cc[1] << 8) + cc[2]; - cc += 5; - break; - - default: - branchlength++; - } - break; - - /* Anything else is variable length */ - - default: - return -1; - } - } -/* Control never gets here */ -} - - - - -/************************************************* -* Check for POSIX class syntax * -*************************************************/ - -/* This function is called when the sequence "[:" or "[." or "[=" is -encountered in a character class. It checks whether this is followed by an -optional ^ and then a sequence of letters, terminated by a matching ":]" or -".]" or "=]". - -Argument: - ptr pointer to the initial [ - endptr where to return the end pointer - cd pointer to compile data - -Returns: TRUE or FALSE -*/ - -static BOOL -check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd) -{ -int terminator; /* Don't combine these lines; the Solaris cc */ -terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ -if (*(++ptr) == '^') ptr++; -while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; -if (*ptr == terminator && ptr[1] == ']') - { - *endptr = ptr; - return TRUE; - } -return FALSE; -} - - - - -/************************************************* -* Check POSIX class name * -*************************************************/ - -/* This function is called to check the name given in a POSIX-style class entry -such as [:alnum:]. - -Arguments: - ptr points to the first letter - len the length of the name - -Returns: a value representing the name, or -1 if unknown -*/ - -static int -check_posix_name(const uschar *ptr, int len) -{ -register int yield = 0; -while (posix_name_lengths[yield] != 0) - { - if (len == posix_name_lengths[yield] && - strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield; - yield++; - } -return -1; -} - - - - -/************************************************* -* Compile one branch * -*************************************************/ - -/* Scan the pattern, compiling it into the code vector. - -Arguments: - options the option bits - brackets points to number of brackets used - code points to the pointer to the current code point - ptrptr points to the current pattern pointer - errorptr points to pointer to error message - optchanged set to the value of the last OP_OPT item compiled - reqchar set to the last literal character required, else -1 - countlits set to count of mandatory literal characters - cd contains pointers to tables - -Returns: TRUE on success - FALSE, with *errorptr set on error -*/ - -static BOOL -compile_branch(int options, int *brackets, uschar **codeptr, - const uschar **ptrptr, const char **errorptr, int *optchanged, - int *reqchar, int *countlits, compile_data *cd) -{ -int repeat_type, op_type; -int repeat_min, repeat_max; -int bravalue, length; -int greedy_default, greedy_non_default; -int prevreqchar; -int condcount = 0; -int subcountlits = 0; -register int c; -register uschar *code = *codeptr; -uschar *tempcode; -const uschar *ptr = *ptrptr; -const uschar *tempptr; -uschar *previous = NULL; -uschar class[32]; - -/* Set up the default and non-default settings for greediness */ - -greedy_default = ((options & PCRE_UNGREEDY) != 0); -greedy_non_default = greedy_default ^ 1; - -/* Initialize no required char, and count of literals */ - -*reqchar = prevreqchar = -1; -*countlits = 0; - -/* Switch on next character until the end of the branch */ - -for (;; ptr++) - { - BOOL negate_class; - int class_charcount; - int class_lastchar; - int newoptions; - int condref; - int subreqchar; - - c = *ptr; - if ((options & PCRE_EXTENDED) != 0) - { - if ((cd->ctypes[c] & ctype_space) != 0) continue; - if (c == '#') - { - /* The space before the ; is to avoid a warning on a silly compiler - on the Macintosh. */ - while ((c = *(++ptr)) != 0 && c != '\n') ; - continue; - } - } - - switch(c) - { - /* The branch terminates at end of string, |, or ). */ - - case 0: - case '|': - case ')': - *codeptr = code; - *ptrptr = ptr; - return TRUE; - - /* Handle single-character metacharacters */ - - case '^': - previous = NULL; - *code++ = OP_CIRC; - break; - - case '$': - previous = NULL; - *code++ = OP_DOLL; - break; - - case '.': - previous = code; - *code++ = OP_ANY; - break; - - /* Character classes. These always build a 32-byte bitmap of the permitted - characters, except in the special case where there is only one character. - For negated classes, we build the map as usual, then invert it at the end. - */ - - case '[': - previous = code; - *code++ = OP_CLASS; - - /* If the first character is '^', set the negation flag and skip it. */ - - if ((c = *(++ptr)) == '^') - { - negate_class = TRUE; - c = *(++ptr); - } - else negate_class = FALSE; - - /* Keep a count of chars so that we can optimize the case of just a single - character. */ - - class_charcount = 0; - class_lastchar = -1; - - /* Initialize the 32-char bit map to all zeros. We have to build the - map in a temporary bit of store, in case the class contains only 1 - character, because in that case the compiled code doesn't use the - bit map. */ - - memset(class, 0, 32 * sizeof(uschar)); - - /* Process characters until ] is reached. By writing this as a "do" it - means that an initial ] is taken as a data character. */ - - do - { - if (c == 0) - { - *errorptr = ERR6; - goto FAILED; - } - - /* Handle POSIX class names. Perl allows a negation extension of the - form [:^name]. A square bracket that doesn't match the syntax is - treated as a literal. We also recognize the POSIX constructions - [.ch.] and [=ch=] ("collating elements") and fault them, as Perl - 5.6 does. */ - - if (c == '[' && - (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && - check_posix_syntax(ptr, &tempptr, cd)) - { - BOOL local_negate = FALSE; - int posix_class, i; - register const uschar *cbits = cd->cbits; - - if (ptr[1] != ':') - { - *errorptr = ERR31; - goto FAILED; - } - - ptr += 2; - if (*ptr == '^') - { - local_negate = TRUE; - ptr++; - } - - posix_class = check_posix_name(ptr, tempptr - ptr); - if (posix_class < 0) - { - *errorptr = ERR30; - goto FAILED; - } - - /* If matching is caseless, upper and lower are converted to - alpha. This relies on the fact that the class table starts with - alpha, lower, upper as the first 3 entries. */ - - if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) - posix_class = 0; - - /* Or into the map we are building up to 3 of the static class - tables, or their negations. */ - - posix_class *= 3; - for (i = 0; i < 3; i++) - { - int taboffset = posix_class_maps[posix_class + i]; - if (taboffset < 0) break; - if (local_negate) - for (c = 0; c < 32; c++) class[c] |= ~cbits[c+taboffset]; - else - for (c = 0; c < 32; c++) class[c] |= cbits[c+taboffset]; - } - - ptr = tempptr + 1; - class_charcount = 10; /* Set > 1; assumes more than 1 per class */ - continue; - } - - /* Backslash may introduce a single character, or it may introduce one - of the specials, which just set a flag. Escaped items are checked for - validity in the pre-compiling pass. The sequence \b is a special case. - Inside a class (and only there) it is treated as backspace. Elsewhere - it marks a word boundary. Other escapes have preset maps ready to - or into the one we are building. We assume they have more than one - character in them, so set class_count bigger than one. */ - - if (c == '\') - { - c = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd); - if (-c == ESC_b) c = '\b'; - else if (c < 0) - { - register const uschar *cbits = cd->cbits; - class_charcount = 10; - switch (-c) - { - case ESC_d: - for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_digit]; - continue; - - case ESC_D: - for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_digit]; - continue; - - case ESC_w: - for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_word]; - continue; - - case ESC_W: - for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_word]; - continue; - - case ESC_s: - for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_space]; - continue; - - case ESC_S: - for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_space]; - continue; - - default: - *errorptr = ERR7; - goto FAILED; - } - } - - /* Fall through if single character, but don't at present allow - chars > 255 in UTF-8 mode. */ - -#ifdef SUPPORT_UTF8 - if (c > 255) - { - *errorptr = ERR33; - goto FAILED; - } -#endif - } - - /* A single character may be followed by '-' to form a range. However, - Perl does not permit ']' to be the end of the range. A '-' character - here is treated as a literal. */ - - if (ptr[1] == '-' && ptr[2] != ']') - { - int d; - ptr += 2; - d = *ptr; - - if (d == 0) - { - *errorptr = ERR6; - goto FAILED; - } - - /* The second part of a range can be a single-character escape, but - not any of the other escapes. Perl 5.6 treats a hyphen as a literal - in such circumstances. */ - - if (d == '\') - { - const uschar *oldptr = ptr; - d = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd); - -#ifdef SUPPORT_UTF8 - if (d > 255) - { - *errorptr = ERR33; - goto FAILED; - } -#endif - /* \b is backslash; any other special means the '-' was literal */ - - if (d < 0) - { - if (d == -ESC_b) d = '\b'; else - { - ptr = oldptr - 2; - goto SINGLE_CHARACTER; /* A few lines below */ - } - } - } - - if (d < c) - { - *errorptr = ERR8; - goto FAILED; - } - - for (; c <= d; c++) - { - class[c/8] |= (1 << (c&7)); - if ((options & PCRE_CASELESS) != 0) - { - int uc = cd->fcc[c]; /* flip case */ - class[uc/8] |= (1 << (uc&7)); - } - class_charcount++; /* in case a one-char range */ - class_lastchar = c; - } - continue; /* Go get the next char in the class */ - } - - /* Handle a lone single character - we can get here for a normal - non-escape char, or after \ that introduces a single character. */ - - SINGLE_CHARACTER: - - class [c/8] |= (1 << (c&7)); - if ((options & PCRE_CASELESS) != 0) - { - c = cd->fcc[c]; /* flip case */ - class[c/8] |= (1 << (c&7)); - } - class_charcount++; - class_lastchar = c; - } - - /* Loop until ']' reached; the check for end of string happens inside the - loop. This "while" is the end of the "do" above. */ - - while ((c = *(++ptr)) != ']'); - - /* If class_charcount is 1 and class_lastchar is not negative, we saw - precisely one character. This doesn't need the whole 32-byte bit map. - We turn it into a 1-character OP_CHAR if it's positive, or OP_NOT if - it's negative. */ - - if (class_charcount == 1 && class_lastchar >= 0) - { - if (negate_class) - { - code[-1] = OP_NOT; - } - else - { - code[-1] = OP_CHARS; - *code++ = 1; - } - *code++ = class_lastchar; - } - - /* Otherwise, negate the 32-byte map if necessary, and copy it into - the code vector. */ - - else - { - if (negate_class) - for (c = 0; c < 32; c++) code[c] = ~class[c]; - else - memcpy(code, class, 32); - code += 32; - } - break; - - /* Various kinds of repeat */ - - case '{': - if (!is_counted_repeat(ptr+1, cd)) goto NORMAL_CHAR; - ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr, cd); - if (*errorptr != NULL) goto FAILED; - goto REPEAT; - - case '*': - repeat_min = 0; - repeat_max = -1; - goto REPEAT; - - case '+': - repeat_min = 1; - repeat_max = -1; - goto REPEAT; - - case '?': - repeat_min = 0; - repeat_max = 1; - - REPEAT: - if (previous == NULL) - { - *errorptr = ERR9; - goto FAILED; - } - - /* If the next character is '?' this is a minimizing repeat, by default, - but if PCRE_UNGREEDY is set, it works the other way round. Advance to the - next character. */ - - if (ptr[1] == '?') - { repeat_type = greedy_non_default; ptr++; } - else repeat_type = greedy_default; - - /* If previous was a string of characters, chop off the last one and use it - as the subject of the repeat. If there was only one character, we can - abolish the previous item altogether. A repeat with a zero minimum wipes - out any reqchar setting, backing up to the previous value. We must also - adjust the countlits value. */ - - if (*previous == OP_CHARS) - { - int len = previous[1]; - - if (repeat_min == 0) *reqchar = prevreqchar; - *countlits += repeat_min - 1; - - if (len == 1) - { - c = previous[2]; - code = previous; - } - else - { - c = previous[len+1]; - previous[1]--; - code--; - } - op_type = 0; /* Use single-char op codes */ - goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ - } - - /* If previous was a single negated character ([^a] or similar), we use - one of the special opcodes, replacing it. The code is shared with single- - character repeats by adding a suitable offset into repeat_type. */ - - else if ((int)*previous == OP_NOT) - { - op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */ - c = previous[1]; - code = previous; - goto OUTPUT_SINGLE_REPEAT; - } - - /* If previous was a character type match (\d or similar), abolish it and - create a suitable repeat item. The code is shared with single-character - repeats by adding a suitable offset into repeat_type. */ - - else if ((int)*previous < OP_EODN || *previous == OP_ANY) - { - op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ - c = *previous; - code = previous; - - OUTPUT_SINGLE_REPEAT: - - /* If the maximum is zero then the minimum must also be zero; Perl allows - this case, so we do too - by simply omitting the item altogether. */ - - if (repeat_max == 0) goto END_REPEAT; - - /* Combine the op_type with the repeat_type */ - - repeat_type += op_type; - - /* A minimum of zero is handled either as the special case * or ?, or as - an UPTO, with the maximum given. */ - - if (repeat_min == 0) - { - if (repeat_max == -1) *code++ = OP_STAR + repeat_type; - else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; - else - { - *code++ = OP_UPTO + repeat_type; - *code++ = repeat_max >> 8; - *code++ = (repeat_max & 255); - } - } - - /* The case {1,} is handled as the special case + */ - - else if (repeat_min == 1 && repeat_max == -1) - *code++ = OP_PLUS + repeat_type; - - /* The case {n,n} is just an EXACT, while the general case {n,m} is - handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */ - - else - { - if (repeat_min != 1) - { - *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ - *code++ = repeat_min >> 8; - *code++ = (repeat_min & 255); - } - - /* If the mininum is 1 and the previous item was a character string, - we either have to put back the item that got cancelled if the string - length was 1, or add the character back onto the end of a longer - string. For a character type nothing need be done; it will just get - put back naturally. Note that the final character is always going to - get added below. */ - - else if (*previous == OP_CHARS) - { - if (code == previous) code += 2; else previous[1]++; - } - - /* For a single negated character we also have to put back the - item that got cancelled. */ - - else if (*previous == OP_NOT) code++; - - /* If the maximum is unlimited, insert an OP_STAR. */ - - if (repeat_max < 0) - { - *code++ = c; - *code++ = OP_STAR + repeat_type; - } - - /* Else insert an UPTO if the max is greater than the min. */ - - else if (repeat_max != repeat_min) - { - *code++ = c; - repeat_max -= repeat_min; - *code++ = OP_UPTO + repeat_type; - *code++ = repeat_max >> 8; - *code++ = (repeat_max & 255); - } - } - - /* The character or character type itself comes last in all cases. */ - - *code++ = c; - } - - /* If previous was a character class or a back reference, we put the repeat - stuff after it, but just skip the item if the repeat was {0,0}. */ - - else if (*previous == OP_CLASS || *previous == OP_REF) - { - if (repeat_max == 0) - { - code = previous; - goto END_REPEAT; - } - if (repeat_min == 0 && repeat_max == -1) - *code++ = OP_CRSTAR + repeat_type; - else if (repeat_min == 1 && repeat_max == -1) - *code++ = OP_CRPLUS + repeat_type; - else if (repeat_min == 0 && repeat_max == 1) - *code++ = OP_CRQUERY + repeat_type; - else - { - *code++ = OP_CRRANGE + repeat_type; - *code++ = repeat_min >> 8; - *code++ = repeat_min & 255; - if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ - *code++ = repeat_max >> 8; - *code++ = repeat_max & 255; - } - } - - /* If previous was a bracket group, we may have to replicate it in certain - cases. */ - - else if ((int)*previous >= OP_BRA || (int)*previous == OP_ONCE || - (int)*previous == OP_COND) - { - register int i; - int ketoffset = 0; - int len = code - previous; - uschar *bralink = NULL; - - /* If the maximum repeat count is unlimited, find the end of the bracket - by scanning through from the start, and compute the offset back to it - from the current code pointer. There may be an OP_OPT setting following - the final KET, so we can't find the end just by going back from the code - pointer. */ - - if (repeat_max == -1) - { - register uschar *ket = previous; - do ket += (ket[1] << 8) + ket[2]; while (*ket != OP_KET); - ketoffset = code - ket; - } - - /* The case of a zero minimum is special because of the need to stick - OP_BRAZERO in front of it, and because the group appears once in the - data, whereas in other cases it appears the minimum number of times. For - this reason, it is simplest to treat this case separately, as otherwise - the code gets far too mess. There are several special subcases when the - minimum is zero. */ - - if (repeat_min == 0) - { - /* If we set up a required char from the bracket, we must back off - to the previous value and reset the countlits value too. */ - - if (subcountlits > 0) - { - *reqchar = prevreqchar; - *countlits -= subcountlits; - } - - /* If the maximum is also zero, we just omit the group from the output - altogether. */ - - if (repeat_max == 0) - { - code = previous; - goto END_REPEAT; - } - - /* If the maximum is 1 or unlimited, we just have to stick in the - BRAZERO and do no more at this point. */ - - if (repeat_max <= 1) - { - memmove(previous+1, previous, len); - code++; - *previous++ = OP_BRAZERO + repeat_type; - } - - /* If the maximum is greater than 1 and limited, we have to replicate - in a nested fashion, sticking OP_BRAZERO before each set of brackets. - The first one has to be handled carefully because it's the original - copy, which has to be moved up. The remainder can be handled by code - that is common with the non-zero minimum case below. We just have to - adjust the value or repeat_max, since one less copy is required. */ - - else - { - int offset; - memmove(previous+4, previous, len); - code += 4; - *previous++ = OP_BRAZERO + repeat_type; - *previous++ = OP_BRA; - - /* We chain together the bracket offset fields that have to be - filled in later when the ends of the brackets are reached. */ - - offset = (bralink == NULL)? 0 : previous - bralink; - bralink = previous; - *previous++ = offset >> 8; - *previous++ = offset & 255; - } - - repeat_max--; - } - - /* If the minimum is greater than zero, replicate the group as many - times as necessary, and adjust the maximum to the number of subsequent - copies that we need. */ - - else - { - for (i = 1; i < repeat_min; i++) - { - memcpy(code, previous, len); - code += len; - } - if (repeat_max > 0) repeat_max -= repeat_min; - } - - /* This code is common to both the zero and non-zero minimum cases. If - the maximum is limited, it replicates the group in a nested fashion, - remembering the bracket starts on a stack. In the case of a zero minimum, - the first one was set up above. In all cases the repeat_max now specifies - the number of additional copies needed. */ - - if (repeat_max >= 0) - { - for (i = repeat_max - 1; i >= 0; i--) - { - *code++ = OP_BRAZERO + repeat_type; - - /* All but the final copy start a new nesting, maintaining the - chain of brackets outstanding. */ - - if (i != 0) - { - int offset; - *code++ = OP_BRA; - offset = (bralink == NULL)? 0 : code - bralink; - bralink = code; - *code++ = offset >> 8; - *code++ = offset & 255; - } - - memcpy(code, previous, len); - code += len; - } - - /* Now chain through the pending brackets, and fill in their length - fields (which are holding the chain links pro tem). */ - - while (bralink != NULL) - { - int oldlinkoffset; - int offset = code - bralink + 1; - uschar *bra = code - offset; - oldlinkoffset = (bra[1] << 8) + bra[2]; - bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; - *code++ = OP_KET; - *code++ = bra[1] = offset >> 8; - *code++ = bra[2] = (offset & 255); - } - } - - /* If the maximum is unlimited, set a repeater in the final copy. We - can't just offset backwards from the current code point, because we - don't know if there's been an options resetting after the ket. The - correct offset was computed above. */ - - else code[-ketoffset] = OP_KETRMAX + repeat_type; - } - - /* Else there's some kind of shambles */ - - else - { - *errorptr = ERR11; - goto FAILED; - } - - /* In all case we no longer have a previous item. */ - - END_REPEAT: - previous = NULL; - break; - - - /* Start of nested bracket sub-expression, or comment or lookahead or - lookbehind or option setting or condition. First deal with special things - that can come after a bracket; all are introduced by ?, and the appearance - of any of them means that this is not a referencing group. They were - checked for validity in the first pass over the string, so we don't have to - check for syntax errors here. */ - - case '(': - newoptions = options; - condref = -1; - - if (*(++ptr) == '?') - { - int set, unset; - int *optset; - - switch (*(++ptr)) - { - case '#': /* Comment; skip to ket */ - ptr++; - while (*ptr != ')') ptr++; - continue; - - case ':': /* Non-extracting bracket */ - bravalue = OP_BRA; - ptr++; - break; - - case '(': - bravalue = OP_COND; /* Conditional group */ - if ((cd->ctypes[*(++ptr)] & ctype_digit) != 0) - { - condref = *ptr - '0'; - while (*(++ptr) != ')') condref = condref*10 + *ptr - '0'; - if (condref == 0) - { - *errorptr = ERR35; - goto FAILED; - } - ptr++; - } - else ptr--; - break; - - case '=': /* Positive lookahead */ - bravalue = OP_ASSERT; - ptr++; - break; - - case '!': /* Negative lookahead */ - bravalue = OP_ASSERT_NOT; - ptr++; - break; - - case '<': /* Lookbehinds */ - switch (*(++ptr)) - { - case '=': /* Positive lookbehind */ - bravalue = OP_ASSERTBACK; - ptr++; - break; - - case '!': /* Negative lookbehind */ - bravalue = OP_ASSERTBACK_NOT; - ptr++; - break; - - default: /* Syntax error */ - *errorptr = ERR24; - goto FAILED; - } - break; - - case '>': /* One-time brackets */ - bravalue = OP_ONCE; - ptr++; - break; - - case 'R': /* Pattern recursion */ - *code++ = OP_RECURSE; - ptr++; - continue; - - default: /* Option setting */ - set = unset = 0; - optset = &set; - - while (*ptr != ')' && *ptr != ':') - { - switch (*ptr++) - { - case '-': optset = &unset; break; - - case 'i': *optset |= PCRE_CASELESS; break; - case 'm': *optset |= PCRE_MULTILINE; break; - case 's': *optset |= PCRE_DOTALL; break; - case 'x': *optset |= PCRE_EXTENDED; break; - case 'U': *optset |= PCRE_UNGREEDY; break; - case 'X': *optset |= PCRE_EXTRA; break; - - default: - *errorptr = ERR12; - goto FAILED; - } - } - - /* Set up the changed option bits, but don't change anything yet. */ - - newoptions = (options | set) & (~unset); - - /* If the options ended with ')' this is not the start of a nested - group with option changes, so the options change at this level. At top - level there is nothing else to be done (the options will in fact have - been set from the start of compiling as a result of the first pass) but - at an inner level we must compile code to change the ims options if - necessary, and pass the new setting back so that it can be put at the - start of any following branches, and when this group ends, a resetting - item can be compiled. */ - - if (*ptr == ')') - { - if ((options & PCRE_INGROUP) != 0 && - (options & PCRE_IMS) != (newoptions & PCRE_IMS)) - { - *code++ = OP_OPT; - *code++ = *optchanged = newoptions & PCRE_IMS; - } - options = newoptions; /* Change options at this level */ - previous = NULL; /* This item can't be repeated */ - continue; /* It is complete */ - } - - /* If the options ended with ':' we are heading into a nested group - with possible change of options. Such groups are non-capturing and are - not assertions of any kind. All we need to do is skip over the ':'; - the newoptions value is handled below. */ - - bravalue = OP_BRA; - ptr++; - } - } - - /* Else we have a referencing group; adjust the opcode. */ - - else - { - if (++(*brackets) > EXTRACT_MAX) - { - *errorptr = ERR13; - goto FAILED; - } - bravalue = OP_BRA + *brackets; - } - - /* Process nested bracketed re. Assertions may not be repeated, but other - kinds can be. We copy code into a non-register variable in order to be able - to pass its address because some compilers complain otherwise. Pass in a - new setting for the ims options if they have changed. */ - - previous = (bravalue >= OP_ONCE)? code : NULL; - *code = bravalue; - tempcode = code; - - if (!compile_regex( - options | PCRE_INGROUP, /* Set for all nested groups */ - ((options & PCRE_IMS) != (newoptions & PCRE_IMS))? - newoptions & PCRE_IMS : -1, /* Pass ims options if changed */ - brackets, /* Bracket level */ - &tempcode, /* Where to put code (updated) */ - &ptr, /* Input pointer (updated) */ - errorptr, /* Where to put an error message */ - (bravalue == OP_ASSERTBACK || - bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ - condref, /* Condition reference number */ - &subreqchar, /* For possible last char */ - &subcountlits, /* For literal count */ - cd)) /* Tables block */ - goto FAILED; - - /* At the end of compiling, code is still pointing to the start of the - group, while tempcode has been updated to point past the end of the group - and any option resetting that may follow it. The pattern pointer (ptr) - is on the bracket. */ - - /* If this is a conditional bracket, check that there are no more than - two branches in the group. */ - - if (bravalue == OP_COND) - { - uschar *tc = code; - condcount = 0; - - do { - condcount++; - tc += (tc[1] << 8) | tc[2]; - } - while (*tc != OP_KET); - - if (condcount > 2) - { - *errorptr = ERR27; - goto FAILED; - } - } - - /* Handle updating of the required character. If the subpattern didn't - set one, leave it as it was. Otherwise, update it for normal brackets of - all kinds, forward assertions, and conditions with two branches. Don't - update the literal count for forward assertions, however. If the bracket - is followed by a quantifier with zero repeat, we have to back off. Hence - the definition of prevreqchar and subcountlits outside the main loop so - that they can be accessed for the back off. */ - - if (subreqchar > 0 && - (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_ASSERT || - (bravalue == OP_COND && condcount == 2))) - { - prevreqchar = *reqchar; - *reqchar = subreqchar; - if (bravalue != OP_ASSERT) *countlits += subcountlits; - } - - /* Now update the main code pointer to the end of the group. */ - - code = tempcode; - - /* Error if hit end of pattern */ - - if (*ptr != ')') - { - *errorptr = ERR14; - goto FAILED; - } - break; - - /* Check \ for being a real metacharacter; if not, fall through and handle - it as a data character at the start of a string. Escape items are checked - for validity in the pre-compiling pass. */ - - case '\': - tempptr = ptr; - c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd); - - /* Handle metacharacters introduced by . For ones like \d, the ESC_ values - are arranged to be the negation of the corresponding OP_values. For the - back references, the values are ESC_REF plus the reference number. Only - back references and those types that consume a character may be repeated. - We can test for values between ESC_b and ESC_Z for the latter; this may - have to change if any new ones are ever created. */ - - if (c < 0) - { - if (-c >= ESC_REF) - { - previous = code; - *code++ = OP_REF; - *code++ = -c - ESC_REF; - } - else - { - previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; - *code++ = -c; - } - continue; - } - - /* Data character: reset and fall through */ - - ptr = tempptr; - c = '\'; - - /* Handle a run of data characters until a metacharacter is encountered. - The first character is guaranteed not to be whitespace or # when the - extended flag is set. */ - - NORMAL_CHAR: - default: - previous = code; - *code = OP_CHARS; - code += 2; - length = 0; - - do - { - if ((options & PCRE_EXTENDED) != 0) - { - if ((cd->ctypes[c] & ctype_space) != 0) continue; - if (c == '#') - { - /* The space before the ; is to avoid a warning on a silly compiler - on the Macintosh. */ - while ((c = *(++ptr)) != 0 && c != '\n') ; - if (c == 0) break; - continue; - } - } - - /* Backslash may introduce a data char or a metacharacter. Escaped items - are checked for validity in the pre-compiling pass. Stop the string - before a metaitem. */ - - if (c == '\') - { - tempptr = ptr; - c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd); - if (c < 0) { ptr = tempptr; break; } - - /* If a character is > 127 in UTF-8 mode, we have to turn it into - two or more characters in the UTF-8 encoding. */ - -#ifdef SUPPORT_UTF8 - if (c > 127 && (options & PCRE_UTF8) != 0) - { - uschar buffer[8]; - int len = ord2utf8(c, buffer); - for (c = 0; c < len; c++) *code++ = buffer[c]; - length += len; - continue; - } -#endif - } - - /* Ordinary character or single-char escape */ - - *code++ = c; - length++; - } - - /* This "while" is the end of the "do" above. */ - - while (length < MAXLIT && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0); - - /* Update the last character and the count of literals */ - - prevreqchar = (length > 1)? code[-2] : *reqchar; - *reqchar = code[-1]; - *countlits += length; - - /* Compute the length and set it in the data vector, and advance to - the next state. */ - - previous[1] = length; - if (length < MAXLIT) ptr--; - break; - } - } /* end of big loop */ - -/* Control never reaches here by falling through, only by a goto for all the -error states. Pass back the position in the pattern so that it can be displayed -to the user for diagnosing the error. */ - -FAILED: -*ptrptr = ptr; -return FALSE; -} - - - - -/************************************************* -* Compile sequence of alternatives * -*************************************************/ - -/* On entry, ptr is pointing past the bracket character, but on return -it points to the closing bracket, or vertical bar, or end of string. -The code variable is pointing at the byte into which the BRA operator has been -stored. If the ims options are changed at the start (for a (?ims: group) or -during any branch, we need to insert an OP_OPT item at the start of every -following branch to ensure they get set correctly at run time, and also pass -the new options into every subsequent branch compile. - -Argument: - options the option bits - optchanged new ims options to set as if (?ims) were at the start, or -1 - for no change - brackets -> int containing the number of extracting brackets used - codeptr -> the address of the current code pointer - ptrptr -> the address of the current pattern pointer - errorptr -> pointer to error message - lookbehind TRUE if this is a lookbehind assertion - condref >= 0 for OPT_CREF setting at start of conditional group - reqchar -> place to put the last required character, or a negative number - countlits -> place to put the shortest literal count of any branch - cd points to the data block with tables pointers - -Returns: TRUE on success -*/ - -static BOOL -compile_regex(int options, int optchanged, int *brackets, uschar **codeptr, - const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int condref, - int *reqchar, int *countlits, compile_data *cd) -{ -const uschar *ptr = *ptrptr; -uschar *code = *codeptr; -uschar *last_branch = code; -uschar *start_bracket = code; -uschar *reverse_count = NULL; -int oldoptions = options & PCRE_IMS; -int branchreqchar, branchcountlits; - -*reqchar = -1; -*countlits = INT_MAX; -code += 3; - -/* At the start of a reference-based conditional group, insert the reference -number as an OP_CREF item. */ - -if (condref >= 0) - { - *code++ = OP_CREF; - *code++ = condref; - } - -/* Loop for each alternative branch */ - -for (;;) - { - int length; - - /* Handle change of options */ - - if (optchanged >= 0) - { - *code++ = OP_OPT; - *code++ = optchanged; - options = (options & ~PCRE_IMS) | optchanged; - } - - /* Set up dummy OP_REVERSE if lookbehind assertion */ - - if (lookbehind) - { - *code++ = OP_REVERSE; - reverse_count = code; - *code++ = 0; - *code++ = 0; - } - - /* Now compile the branch */ - - if (!compile_branch(options, brackets, &code, &ptr, errorptr, &optchanged, - &branchreqchar, &branchcountlits, cd)) - { - *ptrptr = ptr; - return FALSE; - } - - /* Fill in the length of the last branch */ - - length = code - last_branch; - last_branch[1] = length >> 8; - last_branch[2] = length & 255; - - /* Save the last required character if all branches have the same; a current - value of -1 means unset, while -2 means "previous branch had no last required - char". */ - - if (*reqchar != -2) - { - if (branchreqchar >= 0) - { - if (*reqchar == -1) *reqchar = branchreqchar; - else if (*reqchar != branchreqchar) *reqchar = -2; - } - else *reqchar = -2; - } - - /* Keep the shortest literal count */ - - if (branchcountlits < *countlits) *countlits = branchcountlits; - DPRINTF(("literal count = %d min=%d\n", branchcountlits, *countlits)); - - /* If lookbehind, check that this branch matches a fixed-length string, - and put the length into the OP_REVERSE item. Temporarily mark the end of - the branch with OP_END. */ - - if (lookbehind) - { - *code = OP_END; - length = find_fixedlength(last_branch, options); - DPRINTF(("fixed length = %d\n", length)); - if (length < 0) - { - *errorptr = ERR25; - *ptrptr = ptr; - return FALSE; - } - reverse_count[0] = (length >> 8); - reverse_count[1] = length & 255; - } - - /* Reached end of expression, either ')' or end of pattern. Insert a - terminating ket and the length of the whole bracketed item, and return, - leaving the pointer at the terminating char. If any of the ims options - were changed inside the group, compile a resetting op-code following. */ - - if (*ptr != '|') - { - length = code - start_bracket; - *code++ = OP_KET; - *code++ = length >> 8; - *code++ = length & 255; - if (optchanged >= 0) - { - *code++ = OP_OPT; - *code++ = oldoptions; - } - *codeptr = code; - *ptrptr = ptr; - return TRUE; - } - - /* Another branch follows; insert an "or" node and advance the pointer. */ - - *code = OP_ALT; - last_branch = code; - code += 3; - ptr++; - } -/* Control never reaches here */ -} - - - - -/************************************************* -* Find first significant op code * -*************************************************/ - -/* This is called by several functions that scan a compiled expression looking -for a fixed first character, or an anchoring op code etc. It skips over things -that do not influence this. For one application, a change of caseless option is -important. - -Arguments: - code pointer to the start of the group - options pointer to external options - optbit the option bit whose changing is significant, or - zero if none are - optstop TRUE to return on option change, otherwise change the options - value and continue - -Returns: pointer to the first significant opcode -*/ - -static const uschar* -first_significant_code(const uschar *code, int *options, int optbit, - BOOL optstop) -{ -for (;;) - { - switch ((int)*code) - { - case OP_OPT: - if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit)) - { - if (optstop) return code; - *options = (int)code[1]; - } - code += 2; - break; - - case OP_CREF: - code += 2; - break; - - case OP_WORD_BOUNDARY: - case OP_NOT_WORD_BOUNDARY: - code++; - break; - - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - do code += (code[1] << 8) + code[2]; while (*code == OP_ALT); - code += 3; - break; - - default: - return code; - } - } -/* Control never reaches here */ -} - - - - -/************************************************* -* Check for anchored expression * -*************************************************/ - -/* Try to find out if this is an anchored regular expression. Consider each -alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket -all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then -it's anchored. However, if this is a multiline pattern, then only OP_SOD -counts, since OP_CIRC can match in the middle. - -A branch is also implicitly anchored if it starts with .* and DOTALL is set, -because that will try the rest of the pattern at all possible matching points, -so there is no point trying them again. - -Arguments: - code points to start of expression (the bracket) - options points to the options setting - -Returns: TRUE or FALSE -*/ - -static BOOL -is_anchored(register const uschar *code, int *options) -{ -do { - const uschar *scode = first_significant_code(code + 3, options, - PCRE_MULTILINE, FALSE); - register int op = *scode; - if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) - { if (!is_anchored(scode, options)) return FALSE; } - else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) && - (*options & PCRE_DOTALL) != 0) - { if (scode[1] != OP_ANY) return FALSE; } - else if (op != OP_SOD && - ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) - return FALSE; - code += (code[1] << 8) + code[2]; - } -while (*code == OP_ALT); -return TRUE; -} - - - -/************************************************* -* Check for starting with ^ or .* * -*************************************************/ - -/* This is called to find out if every branch starts with ^ or .* so that -"first char" processing can be done to speed things up in multiline -matching and for non-DOTALL patterns that start with .* (which must start at -the beginning or after \n). - -Argument: points to start of expression (the bracket) -Returns: TRUE or FALSE -*/ - -static BOOL -is_startline(const uschar *code) -{ -do { - const uschar *scode = first_significant_code(code + 3, NULL, 0, FALSE); - register int op = *scode; - if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) - { if (!is_startline(scode)) return FALSE; } - else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR) - { if (scode[1] != OP_ANY) return FALSE; } - else if (op != OP_CIRC) return FALSE; - code += (code[1] << 8) + code[2]; - } -while (*code == OP_ALT); -return TRUE; -} - - - -/************************************************* -* Check for fixed first char * -*************************************************/ - -/* Try to find out if there is a fixed first character. This is called for -unanchored expressions, as it speeds up their processing quite considerably. -Consider each alternative branch. If they all start with the same char, or with -a bracket all of whose alternatives start with the same char (recurse ad lib), -then we return that char, otherwise -1. - -Arguments: - code points to start of expression (the bracket) - options pointer to the options (used to check casing changes) - -Returns: -1 or the fixed first char -*/ - -static int -find_firstchar(const uschar *code, int *options) -{ -register int c = -1; -do { - int d; - const uschar *scode = first_significant_code(code + 3, options, - PCRE_CASELESS, TRUE); - register int op = *scode; - - if (op >= OP_BRA) op = OP_BRA; - - switch(op) - { - default: - return -1; - - case OP_BRA: - case OP_ASSERT: - case OP_ONCE: - case OP_COND: - if ((d = find_firstchar(scode, options)) < 0) return -1; - if (c < 0) c = d; else if (c != d) return -1; - break; - - case OP_EXACT: /* Fall through */ - scode++; - - case OP_CHARS: /* Fall through */ - scode++; - - case OP_PLUS: - case OP_MINPLUS: - if (c < 0) c = scode[1]; else if (c != scode[1]) return -1; - break; - } - - code += (code[1] << 8) + code[2]; - } -while (*code == OP_ALT); -return c; -} - - - - - -/************************************************* -* Compile a Regular Expression * -*************************************************/ - -/* This function takes a string and returns a pointer to a block of store -holding a compiled version of the expression. - -Arguments: - pattern the regular expression - options various option bits - errorptr pointer to pointer to error text - erroroffset ptr offset in pattern where error was detected - tables pointer to character tables or NULL - -Returns: pointer to compiled data block, or NULL on error, - with errorptr and erroroffset set -*/ - -pcre * -pcre_compile(const char *pattern, int options, const char **errorptr, - int *erroroffset, const unsigned char *tables) -{ -real_pcre *re; -int length = 3; /* For initial BRA plus length */ -int runlength; -int c, reqchar, countlits; -int bracount = 0; -int top_backref = 0; -int branch_extra = 0; -int branch_newextra; -unsigned int brastackptr = 0; -size_t size; -uschar *code; -const uschar *ptr; -compile_data compile_block; -int brastack[BRASTACK_SIZE]; -uschar bralenstack[BRASTACK_SIZE]; - -#ifdef DEBUG -uschar *code_base, *code_end; -#endif - -/* Can't support UTF8 unless PCRE has been compiled to include the code. */ - -#ifndef SUPPORT_UTF8 -if ((options & PCRE_UTF8) != 0) - { - *errorptr = ERR32; - return NULL; - } -#endif - -/* We can't pass back an error message if errorptr is NULL; I guess the best we -can do is just return NULL. */ - -if (errorptr == NULL) return NULL; -*errorptr = NULL; - -/* However, we can give a message for this error */ - -if (erroroffset == NULL) - { - *errorptr = ERR16; - return NULL; - } -*erroroffset = 0; - -if ((options & ~PUBLIC_OPTIONS) != 0) - { - *errorptr = ERR17; - return NULL; - } - -/* Set up pointers to the individual character tables */ - -if (tables == NULL) tables = pcre_default_tables; -compile_block.lcc = tables + lcc_offset; -compile_block.fcc = tables + fcc_offset; -compile_block.cbits = tables + cbits_offset; -compile_block.ctypes = tables + ctypes_offset; - -/* Reflect pattern for debugging output */ - -DPRINTF(("------------------------------------------------------------------\n")); -DPRINTF(("%s\n", pattern)); - -/* The first thing to do is to make a pass over the pattern to compute the -amount of store required to hold the compiled code. This does not have to be -perfect as long as errors are overestimates. At the same time we can detect any -internal flag settings. Make an attempt to correct for any counted white space -if an "extended" flag setting appears late in the pattern. We can't be so -clever for #-comments. */ - -ptr = (const uschar *)(pattern - 1); -while ((c = *(++ptr)) != 0) - { - int min, max; - int class_charcount; - - if ((options & PCRE_EXTENDED) != 0) - { - if ((compile_block.ctypes[c] & ctype_space) != 0) continue; - if (c == '#') - { - /* The space before the ; is to avoid a warning on a silly compiler - on the Macintosh. */ - while ((c = *(++ptr)) != 0 && c != '\n') ; - continue; - } - } - - switch(c) - { - /* A backslashed item may be an escaped "normal" character or a - character type. For a "normal" character, put the pointers and - character back so that tests for whitespace etc. in the input - are done correctly. */ - - case '\': - { - const uschar *save_ptr = ptr; - c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if (c >= 0) - { - ptr = save_ptr; - c = '\'; - goto NORMAL_CHAR; - } - } - length++; - - /* A back reference needs an additional char, plus either one or 5 - bytes for a repeat. We also need to keep the value of the highest - back reference. */ - - if (c <= -ESC_REF) - { - int refnum = -c - ESC_REF; - if (refnum > top_backref) top_backref = refnum; - length++; /* For single back reference */ - if (ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block)) - { - ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if ((min == 0 && (max == 1 || max == -1)) || - (min == 1 && max == -1)) - length++; - else length += 5; - if (ptr[1] == '?') ptr++; - } - } - continue; - - case '^': - case '.': - case '$': - case '*': /* These repeats won't be after brackets; */ - case '+': /* those are handled separately */ - case '?': - length++; - continue; - - /* This covers the cases of repeats after a single char, metachar, class, - or back reference. */ - - case '{': - if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR; - ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if ((min == 0 && (max == 1 || max == -1)) || - (min == 1 && max == -1)) - length++; - else - { - length--; /* Uncount the original char or metachar */ - if (min == 1) length++; else if (min > 0) length += 4; - if (max > 0) length += 4; else length += 2; - } - if (ptr[1] == '?') ptr++; - continue; - - /* An alternation contains an offset to the next branch or ket. If any ims - options changed in the previous branch(es), and/or if we are in a - lookbehind assertion, extra space will be needed at the start of the - branch. This is handled by branch_extra. */ - - case '|': - length += 3 + branch_extra; - continue; - - /* A character class uses 33 characters. Don't worry about character types - that aren't allowed in classes - they'll get picked up during the compile. - A character class that contains only one character uses 2 or 3 bytes, - depending on whether it is negated or not. Notice this where we can. */ - - case '[': - class_charcount = 0; - if (*(++ptr) == '^') ptr++; - do - { - if (*ptr == '\') - { - int ch = check_escape(&ptr, errorptr, bracount, options, TRUE, - &compile_block); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if (-ch == ESC_b) class_charcount++; else class_charcount = 10; - } - else class_charcount++; - ptr++; - } - while (*ptr != 0 && *ptr != ']'); - - /* Repeats for negated single chars are handled by the general code */ - - if (class_charcount == 1) length += 3; else - { - length += 33; - - /* A repeat needs either 1 or 5 bytes. */ - - if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block)) - { - ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if ((min == 0 && (max == 1 || max == -1)) || - (min == 1 && max == -1)) - length++; - else length += 5; - if (ptr[1] == '?') ptr++; - } - } - continue; - - /* Brackets may be genuine groups or special things */ - - case '(': - branch_newextra = 0; - - /* Handle special forms of bracket, which all start (? */ - - if (ptr[1] == '?') - { - int set, unset; - int *optset; - - switch (c = ptr[2]) - { - /* Skip over comments entirely */ - case '#': - ptr += 3; - while (*ptr != 0 && *ptr != ')') ptr++; - if (*ptr == 0) - { - *errorptr = ERR18; - goto PCRE_ERROR_RETURN; - } - continue; - - /* Non-referencing groups and lookaheads just move the pointer on, and - then behave like a non-special bracket, except that they don't increment - the count of extracting brackets. Ditto for the "once only" bracket, - which is in Perl from version 5.005. */ - - case ':': - case '=': - case '!': - case '>': - ptr += 2; - break; - - /* A recursive call to the regex is an extension, to provide the - facility which can be obtained by $(?p{perl-code}) in Perl 5.6. */ - - case 'R': - if (ptr[3] != ')') - { - *errorptr = ERR29; - goto PCRE_ERROR_RETURN; - } - ptr += 3; - length += 1; - break; - - /* Lookbehinds are in Perl from version 5.005 */ - - case '<': - if (ptr[3] == '=' || ptr[3] == '!') - { - ptr += 3; - branch_newextra = 3; - length += 3; /* For the first branch */ - break; - } - *errorptr = ERR24; - goto PCRE_ERROR_RETURN; - - /* Conditionals are in Perl from version 5.005. The bracket must either - be followed by a number (for bracket reference) or by an assertion - group. */ - - case '(': - if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0) - { - ptr += 4; - length += 2; - while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++; - if (*ptr != ')') - { - *errorptr = ERR26; - goto PCRE_ERROR_RETURN; - } - } - else /* An assertion must follow */ - { - ptr++; /* Can treat like ':' as far as spacing is concerned */ - if (ptr[2] != '?' || - (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') ) - { - ptr += 2; /* To get right offset in message */ - *errorptr = ERR28; - goto PCRE_ERROR_RETURN; - } - } - break; - - /* Else loop checking valid options until ) is met. Anything else is an - error. If we are without any brackets, i.e. at top level, the settings - act as if specified in the options, so massage the options immediately. - This is for backward compatibility with Perl 5.004. */ - - default: - set = unset = 0; - optset = &set; - ptr += 2; - - for (;; ptr++) - { - c = *ptr; - switch (c) - { - case 'i': - *optset |= PCRE_CASELESS; - continue; - - case 'm': - *optset |= PCRE_MULTILINE; - continue; - - case 's': - *optset |= PCRE_DOTALL; - continue; - - case 'x': - *optset |= PCRE_EXTENDED; - continue; - - case 'X': - *optset |= PCRE_EXTRA; - continue; - - case 'U': - *optset |= PCRE_UNGREEDY; - continue; - - case '-': - optset = &unset; - continue; - - /* A termination by ')' indicates an options-setting-only item; - this is global at top level; otherwise nothing is done here and - it is handled during the compiling process on a per-bracket-group - basis. */ - - case ')': - if (brastackptr == 0) - { - options = (options | set) & (~unset); - set = unset = 0; /* To save length */ - } - /* Fall through */ - - /* A termination by ':' indicates the start of a nested group with - the given options set. This is again handled at compile time, but - we must allow for compiled space if any of the ims options are - set. We also have to allow for resetting space at the end of - the group, which is why 4 is added to the length and not just 2. - If there are several changes of options within the same group, this - will lead to an over-estimate on the length, but this shouldn't - matter very much. We also have to allow for resetting options at - the start of any alternations, which we do by setting - branch_newextra to 2. Finally, we record whether the case-dependent - flag ever changes within the regex. This is used by the "required - character" code. */ - - case ':': - if (((set|unset) & PCRE_IMS) != 0) - { - length += 4; - branch_newextra = 2; - if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED; - } - goto END_OPTIONS; - - /* Unrecognized option character */ - - default: - *errorptr = ERR12; - goto PCRE_ERROR_RETURN; - } - } - - /* If we hit a closing bracket, that's it - this is a freestanding - option-setting. We need to ensure that branch_extra is updated if - necessary. The only values branch_newextra can have here are 0 or 2. - If the value is 2, then branch_extra must either be 2 or 5, depending - on whether this is a lookbehind group or not. */ - - END_OPTIONS: - if (c == ')') - { - if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3)) - branch_extra += branch_newextra; - continue; - } - - /* If options were terminated by ':' control comes here. Fall through - to handle the group below. */ - } - } - - /* Extracting brackets must be counted so we can process escapes in a - Perlish way. */ - - else bracount++; - - /* Non-special forms of bracket. Save length for computing whole length - at end if there's a repeat that requires duplication of the group. Also - save the current value of branch_extra, and start the new group with - the new value. If non-zero, this will either be 2 for a (?imsx: group, or 3 - for a lookbehind assertion. */ - - if (brastackptr >= sizeof(brastack)/sizeof(int)) - { - *errorptr = ERR19; - goto PCRE_ERROR_RETURN; - } - - bralenstack[brastackptr] = branch_extra; - branch_extra = branch_newextra; - - brastack[brastackptr++] = length; - length += 3; - continue; - - /* Handle ket. Look for subsequent max/min; for certain sets of values we - have to replicate this bracket up to that many times. If brastackptr is - 0 this is an unmatched bracket which will generate an error, but take care - not to try to access brastack[-1] when computing the length and restoring - the branch_extra value. */ - - case ')': - length += 3; - { - int minval = 1; - int maxval = 1; - int duplength; - - if (brastackptr > 0) - { - duplength = length - brastack[--brastackptr]; - branch_extra = bralenstack[brastackptr]; - } - else duplength = 0; - - /* Leave ptr at the final char; for read_repeat_counts this happens - automatically; for the others we need an increment. */ - - if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2, &compile_block)) - { - ptr = read_repeat_counts(ptr+2, &minval, &maxval, errorptr, - &compile_block); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - } - else if (c == '*') { minval = 0; maxval = -1; ptr++; } - else if (c == '+') { maxval = -1; ptr++; } - else if (c == '?') { minval = 0; ptr++; } - - /* If the minimum is zero, we have to allow for an OP_BRAZERO before the - group, and if the maximum is greater than zero, we have to replicate - maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting - bracket set - hence the 7. */ - - if (minval == 0) - { - length++; - if (maxval > 0) length += (maxval - 1) * (duplength + 7); - } - - /* When the minimum is greater than zero, 1 we have to replicate up to - minval-1 times, with no additions required in the copies. Then, if - there is a limited maximum we have to replicate up to maxval-1 times - allowing for a BRAZERO item before each optional copy and nesting - brackets for all but one of the optional copies. */ - - else - { - length += (minval - 1) * duplength; - if (maxval > minval) /* Need this test as maxval=-1 means no limit */ - length += (maxval - minval) * (duplength + 7) - 6; - } - } - continue; - - /* Non-special character. For a run of such characters the length required - is the number of characters + 2, except that the maximum run length is 255. - We won't get a skipped space or a non-data escape or the start of a # - comment as the first character, so the length can't be zero. */ - - NORMAL_CHAR: - default: - length += 2; - runlength = 0; - do - { - if ((options & PCRE_EXTENDED) != 0) - { - if ((compile_block.ctypes[c] & ctype_space) != 0) continue; - if (c == '#') - { - /* The space before the ; is to avoid a warning on a silly compiler - on the Macintosh. */ - while ((c = *(++ptr)) != 0 && c != '\n') ; - continue; - } - } - - /* Backslash may introduce a data char or a metacharacter; stop the - string before the latter. */ - - if (c == '\') - { - const uschar *saveptr = ptr; - c = check_escape(&ptr, errorptr, bracount, options, FALSE, - &compile_block); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if (c < 0) { ptr = saveptr; break; } - -#ifdef SUPPORT_UTF8 - if (c > 127 && (options & PCRE_UTF8) != 0) - { - int i; - for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) - if (c <= utf8_table1[i]) break; - runlength += i; - } -#endif - } - - /* Ordinary character or single-char escape */ - - runlength++; - } - - /* This "while" is the end of the "do" above. */ - - while (runlength < MAXLIT && - (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0); - - ptr--; - length += runlength; - continue; - } - } - -length += 4; /* For final KET and END */ - -if (length > 65539) - { - *errorptr = ERR20; - return NULL; - } - -/* Compute the size of data block needed and get it, either from malloc or -externally provided function. We specify "code[0]" in the offsetof() expression -rather than just "code", because it has been reported that one broken compiler -fails on "code" because it is also an independent variable. It should make no -difference to the value of the offsetof(). */ - -size = length + offsetof(real_pcre, code[0]); -re = (real_pcre *)(pcre_malloc)(size); - -if (re == NULL) - { - *errorptr = ERR21; - return NULL; - } - -/* Put in the magic number, and save the size, options, and table pointer */ - -re->magic_number = MAGIC_NUMBER; -re->size = size; -re->options = options; -re->tables = tables; - -/* Set up a starting, non-extracting bracket, then compile the expression. On -error, *errorptr will be set non-NULL, so we don't need to look at the result -of the function here. */ - -ptr = (const uschar *)pattern; -code = re->code; -*code = OP_BRA; -bracount = 0; -(void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, -1, - &reqchar, &countlits, &compile_block); -re->top_bracket = bracount; -re->top_backref = top_backref; - -/* If not reached end of pattern on success, there's an excess bracket. */ - -if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22; - -/* Fill in the terminating state and check for disastrous overflow, but -if debugging, leave the test till after things are printed out. */ - -*code++ = OP_END; - -#ifndef DEBUG -if (code - re->code > length) *errorptr = ERR23; -#endif - -/* Give an error if there's back reference to a non-existent capturing -subpattern. */ - -if (top_backref > re->top_bracket) *errorptr = ERR15; - -/* Failed to compile */ - -if (*errorptr != NULL) - { - (pcre_free)(re); - PCRE_ERROR_RETURN: - *erroroffset = ptr - (const uschar *)pattern; - return NULL; - } - -/* If the anchored option was not passed, set flag if we can determine that the -pattern is anchored by virtue of ^ characters or \A or anything else (such as -starting with .* when DOTALL is set). - -Otherwise, see if we can determine what the first character has to be, because -that speeds up unanchored matches no end. If not, see if we can set the -PCRE_STARTLINE flag. This is helpful for multiline matches when all branches -start with ^. and also when all branches start with .* for non-DOTALL matches. -*/ - -if ((options & PCRE_ANCHORED) == 0) - { - int temp_options = options; - if (is_anchored(re->code, &temp_options)) - re->options |= PCRE_ANCHORED; - else - { - int ch = find_firstchar(re->code, &temp_options); - if (ch >= 0) - { - re->first_char = ch; - re->options |= PCRE_FIRSTSET; - } - else if (is_startline(re->code)) - re->options |= PCRE_STARTLINE; - } - } - -/* Save the last required character if there are at least two literal -characters on all paths, or if there is no first character setting. */ - -if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0)) - { - re->req_char = reqchar; - re->options |= PCRE_REQCHSET; - } - -/* Print out the compiled data for debugging */ - -#ifdef DEBUG - -printf("Length = %d top_bracket = %d top_backref = %d\n", - length, re->top_bracket, re->top_backref); - -if (re->options != 0) - { - printf("%s%s%s%s%s%s%s%s%s\n", - ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "", - ((re->options & PCRE_CASELESS) != 0)? "caseless " : "", - ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "", - ((re->options & PCRE_EXTENDED) != 0)? "extended " : "", - ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "", - ((re->options & PCRE_DOTALL) != 0)? "dotall " : "", - ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "", - ((re->options & PCRE_EXTRA) != 0)? "extra " : "", - ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : ""); - } - -if ((re->options & PCRE_FIRSTSET) != 0) - { - if (isprint(re->first_char)) printf("First char = %c\n", re->first_char); - else printf("First char = \x%02x\n", re->first_char); - } - -if ((re->options & PCRE_REQCHSET) != 0) - { - if (isprint(re->req_char)) printf("Req char = %c\n", re->req_char); - else printf("Req char = \x%02x\n", re->req_char); - } - -code_end = code; -code_base = code = re->code; - -while (code < code_end) - { - int charlength; - - printf("%3d ", code - code_base); - - if (*code >= OP_BRA) - { - printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA); - code += 2; - } - - else switch(*code) - { - case OP_OPT: - printf(" %.2x %s", code[1], OP_names[*code]); - code++; - break; - - case OP_COND: - printf("%3d Cond", (code[1] << 8) + code[2]); - code += 2; - break; - - case OP_CREF: - printf(" %.2d %s", code[1], OP_names[*code]); - code++; - break; - - case OP_CHARS: - charlength = *(++code); - printf("%3d ", charlength); - while (charlength-- > 0) - if (isprint(c = *(++code))) printf("%c", c); else printf("\x%02x", c); - break; - - case OP_KETRMAX: - case OP_KETRMIN: - case OP_ALT: - case OP_KET: - case OP_ASSERT: - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - case OP_ONCE: - printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]); - code += 2; - break; - - case OP_REVERSE: - printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]); - code += 2; - break; - - case OP_STAR: - case OP_MINSTAR: - case OP_PLUS: - case OP_MINPLUS: - case OP_QUERY: - case OP_MINQUERY: - case OP_TYPESTAR: - case OP_TYPEMINSTAR: - case OP_TYPEPLUS: - case OP_TYPEMINPLUS: - case OP_TYPEQUERY: - case OP_TYPEMINQUERY: - if (*code >= OP_TYPESTAR) - printf(" %s", OP_names[code[1]]); - else if (isprint(c = code[1])) printf(" %c", c); - else printf(" \x%02x", c); - printf("%s", OP_names[*code++]); - break; - - case OP_EXACT: - case OP_UPTO: - case OP_MINUPTO: - if (isprint(c = code[3])) printf(" %c{", c); - else printf(" \x%02x{", c); - if (*code != OP_EXACT) printf("0,"); - printf("%d}", (code[1] << 8) + code[2]); - if (*code == OP_MINUPTO) printf("?"); - code += 3; - break; - - case OP_TYPEEXACT: - case OP_TYPEUPTO: - case OP_TYPEMINUPTO: - printf(" %s{", OP_names[code[3]]); - if (*code != OP_TYPEEXACT) printf(","); - printf("%d}", (code[1] << 8) + code[2]); - if (*code == OP_TYPEMINUPTO) printf("?"); - code += 3; - break; - - case OP_NOT: - if (isprint(c = *(++code))) printf(" [^%c]", c); - else printf(" [^\x%02x]", c); - break; - - case OP_NOTSTAR: - case OP_NOTMINSTAR: - case OP_NOTPLUS: - case OP_NOTMINPLUS: - case OP_NOTQUERY: - case OP_NOTMINQUERY: - if (isprint(c = code[1])) printf(" [^%c]", c); - else printf(" [^\x%02x]", c); - printf("%s", OP_names[*code++]); - break; - - case OP_NOTEXACT: - case OP_NOTUPTO: - case OP_NOTMINUPTO: - if (isprint(c = code[3])) printf(" [^%c]{", c); - else printf(" [^\x%02x]{", c); - if (*code != OP_NOTEXACT) printf(","); - printf("%d}", (code[1] << 8) + code[2]); - if (*code == OP_NOTMINUPTO) printf("?"); - code += 3; - break; - - case OP_REF: - printf(" \%d", *(++code)); - code ++; - goto CLASS_REF_REPEAT; - - case OP_CLASS: - { - int i, min, max; - code++; - printf(" ["); - - for (i = 0; i < 256; i++) - { - if ((code[i/8] & (1 << (i&7))) != 0) - { - int j; - for (j = i+1; j < 256; j++) - if ((code[j/8] & (1 << (j&7))) == 0) break; - if (i == '-' || i == ']') printf("\"); - if (isprint(i)) printf("%c", i); else printf("\x%02x", i); - if (--j > i) - { - printf("-"); - if (j == '-' || j == ']') printf("\"); - if (isprint(j)) printf("%c", j); else printf("\x%02x", j); - } - i = j; - } - } - printf("]"); - code += 32; - - CLASS_REF_REPEAT: - - switch(*code) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRPLUS: - case OP_CRMINPLUS: - case OP_CRQUERY: - case OP_CRMINQUERY: - printf("%s", OP_names[*code]); - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - min = (code[1] << 8) + code[2]; - max = (code[3] << 8) + code[4]; - if (max == 0) printf("{%d,}", min); - else printf("{%d,%d}", min, max); - if (*code == OP_CRMINRANGE) printf("?"); - code += 4; - break; - - default: - code--; - } - } - break; - - /* Anything else is just a one-node item */ - - default: - printf(" %s", OP_names[*code]); - break; - } - - code++; - printf("\n"); - } -printf("------------------------------------------------------------------\n"); - -/* This check is done here in the debugging case so that the code that -was compiled can be seen. */ - -if (code - re->code > length) - { - *errorptr = ERR23; - (pcre_free)(re); - *erroroffset = ptr - (uschar *)pattern; - return NULL; - } -#endif - -return (pcre *)re; -} - - - -/************************************************* -* Match a back-reference * -*************************************************/ - -/* If a back reference hasn't been set, the length that is passed is greater -than the number of characters left in the string, so the match fails. - -Arguments: - offset index into the offset vector - eptr points into the subject - length length to be matched - md points to match data block - ims the ims flags - -Returns: TRUE if matched -*/ - -static BOOL -match_ref(int offset, register const uschar *eptr, int length, match_data *md, - unsigned long int ims) -{ -const uschar *p = md->start_subject + md->offset_vector[offset]; - -#ifdef DEBUG -if (eptr >= md->end_subject) - printf("matching subject <null>"); -else - { - printf("matching subject "); - pchars(eptr, length, TRUE, md); - } -printf(" against backref "); -pchars(p, length, FALSE, md); -printf("\n"); -#endif - -/* Always fail if not enough characters left */ - -if (length > md->end_subject - eptr) return FALSE; - -/* Separate the caselesss case for speed */ - -if ((ims & PCRE_CASELESS) != 0) - { - while (length-- > 0) - if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; - } -else - { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } - -return TRUE; -} - - - -/************************************************* -* Match from current position * -*************************************************/ - -/* On entry ecode points to the first opcode, and eptr to the first character -in the subject string, while eptrb holds the value of eptr at the start of the -last bracketed group - used for breaking infinite loops matching zero-length -strings. - -Arguments: - eptr pointer in subject - ecode position in code - offset_top current top pointer - md pointer to "static" info for the match - ims current /i, /m, and /s options - eptrb pointer to chain of blocks containing eptr at start of - brackets - for testing for empty matches - flags can contain - match_condassert - this is an assertion condition - match_isgroup - this is the start of a bracketed group - -Returns: TRUE if matched -*/ - -static BOOL -match(register const uschar *eptr, register const uschar *ecode, - int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, - int flags) -{ -unsigned long int original_ims = ims; /* Save for resetting on ')' */ -eptrblock newptrb; - -/* At the start of a bracketed group, add the current subject pointer to the -stack of such pointers, to be re-instated at the end of the group when we hit -the closing ket. When match() is called in other circumstances, we don't add to -the stack. */ - -if ((flags & match_isgroup) != 0) - { - newptrb.prev = eptrb; - newptrb.saved_eptr = eptr; - eptrb = &newptrb; - } - -/* Now start processing the operations. */ - -for (;;) - { - int op = (int)*ecode; - int min, max, ctype; - register int i; - register int c; - BOOL minimize = FALSE; - - /* Opening capturing bracket. If there is space in the offset vector, save - the current subject position in the working slot at the top of the vector. We - mustn't change the current values of the data slot, because they may be set - from a previous iteration of this group, and be referred to by a reference - inside the group. - - If the bracket fails to match, we need to restore this value and also the - values of the final offsets, in case they were set by a previous iteration of - the same bracket. - - If there isn't enough space in the offset vector, treat this as if it were a - non-capturing bracket. Don't worry about setting the flag for the error case - here; that is handled in the code for KET. */ - - if (op > OP_BRA) - { - int number = op - OP_BRA; - int offset = number << 1; - -#ifdef DEBUG - printf("start bracket %d subject=", number); - pchars(eptr, 16, TRUE, md); - printf("\n"); -#endif - - if (offset < md->offset_max) - { - int save_offset1 = md->offset_vector[offset]; - int save_offset2 = md->offset_vector[offset+1]; - int save_offset3 = md->offset_vector[md->offset_end - number]; - - DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); - md->offset_vector[md->offset_end - number] = eptr - md->start_subject; - - do - { - if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) - return TRUE; - ecode += (ecode[1] << 8) + ecode[2]; - } - while (*ecode == OP_ALT); - - DPRINTF(("bracket %d failed\n", number)); - - md->offset_vector[offset] = save_offset1; - md->offset_vector[offset+1] = save_offset2; - md->offset_vector[md->offset_end - number] = save_offset3; - return FALSE; - } - - /* Insufficient room for saving captured contents */ - - else op = OP_BRA; - } - - /* Other types of node can be handled by a switch */ - - switch(op) - { - case OP_BRA: /* Non-capturing bracket: optimized */ - DPRINTF(("start bracket 0\n")); - do - { - if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) - return TRUE; - ecode += (ecode[1] << 8) + ecode[2]; - } - while (*ecode == OP_ALT); - DPRINTF(("bracket 0 failed\n")); - return FALSE; - - /* Conditional group: compilation checked that there are no more than - two branches. If the condition is false, skipping the first branch takes us - past the end if there is only one branch, but that's OK because that is - exactly what going to the ket would do. */ - - case OP_COND: - if (ecode[3] == OP_CREF) /* Condition is extraction test */ - { - int offset = ecode[4] << 1; /* Doubled reference number */ - return match(eptr, - ecode + ((offset < offset_top && md->offset_vector[offset] >= 0)? - 5 : 3 + (ecode[1] << 8) + ecode[2]), - offset_top, md, ims, eptrb, match_isgroup); - } - - /* The condition is an assertion. Call match() to evaluate it - setting - the final argument TRUE causes it to stop at the end of an assertion. */ - - else - { - if (match(eptr, ecode+3, offset_top, md, ims, NULL, - match_condassert | match_isgroup)) - { - ecode += 3 + (ecode[4] << 8) + ecode[5]; - while (*ecode == OP_ALT) ecode += (ecode[1] << 8) + ecode[2]; - } - else ecode += (ecode[1] << 8) + ecode[2]; - return match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup); - } - /* Control never reaches here */ - - /* Skip over conditional reference data if encountered (should not be) */ - - case OP_CREF: - ecode += 2; - break; - - /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched - an empty string - recursion will then try other alternatives, if any. */ - - case OP_END: - if (md->notempty && eptr == md->start_match) return FALSE; - md->end_match_ptr = eptr; /* Record where we ended */ - md->end_offset_top = offset_top; /* and how many extracts were taken */ - return TRUE; - - /* Change option settings */ - - case OP_OPT: - ims = ecode[1]; - ecode += 2; - DPRINTF(("ims set to %02lx\n", ims)); - break; - - /* Assertion brackets. Check the alternative branches in turn - the - matching won't pass the KET for an assertion. If any one branch matches, - the assertion is true. Lookbehind assertions have an OP_REVERSE item at the - start of each branch to move the current point backwards, so the code at - this level is identical to the lookahead case. */ - - case OP_ASSERT: - case OP_ASSERTBACK: - do - { - if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) break; - ecode += (ecode[1] << 8) + ecode[2]; - } - while (*ecode == OP_ALT); - if (*ecode == OP_KET) return FALSE; - - /* If checking an assertion for a condition, return TRUE. */ - - if ((flags & match_condassert) != 0) return TRUE; - - /* Continue from after the assertion, updating the offsets high water - mark, since extracts may have been taken during the assertion. */ - - do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); - ecode += 3; - offset_top = md->end_offset_top; - continue; - - /* Negative assertion: all branches must fail to match */ - - case OP_ASSERT_NOT: - case OP_ASSERTBACK_NOT: - do - { - if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) - return FALSE; - ecode += (ecode[1] << 8) + ecode[2]; - } - while (*ecode == OP_ALT); - - if ((flags & match_condassert) != 0) return TRUE; - - ecode += 3; - continue; - - /* Move the subject pointer back. This occurs only at the start of - each branch of a lookbehind assertion. If we are too close to the start to - move back, this match function fails. When working with UTF-8 we move - back a number of characters, not bytes. */ - - case OP_REVERSE: -#ifdef SUPPORT_UTF8 - c = (ecode[1] << 8) + ecode[2]; - for (i = 0; i < c; i++) - { - eptr--; - BACKCHAR(eptr) - } -#else - eptr -= (ecode[1] << 8) + ecode[2]; -#endif - - if (eptr < md->start_subject) return FALSE; - ecode += 3; - break; - - /* Recursion matches the current regex, nested. If there are any capturing - brackets started but not finished, we have to save their starting points - and reinstate them after the recursion. However, we don't know how many - such there are (offset_top records the completed total) so we just have - to save all the potential data. There may be up to 99 such values, which - is a bit large to put on the stack, but using malloc for small numbers - seems expensive. As a compromise, the stack is used when there are fewer - than 16 values to store; otherwise malloc is used. A problem is what to do - if the malloc fails ... there is no way of returning to the top level with - an error. Save the top 15 values on the stack, and accept that the rest - may be wrong. */ - - case OP_RECURSE: - { - BOOL rc; - int *save; - int stacksave[15]; - - c = md->offset_max; - - if (c < 16) save = stacksave; else - { - save = (int *)(pcre_malloc)((c+1) * sizeof(int)); - if (save == NULL) - { - save = stacksave; - c = 15; - } - } - - for (i = 1; i <= c; i++) - save[i] = md->offset_vector[md->offset_end - i]; - rc = match(eptr, md->start_pattern, offset_top, md, ims, eptrb, - match_isgroup); - for (i = 1; i <= c; i++) - md->offset_vector[md->offset_end - i] = save[i]; - if (save != stacksave) (pcre_free)(save); - if (!rc) return FALSE; - - /* In case the recursion has set more capturing values, save the final - number, then move along the subject till after the recursive match, - and advance one byte in the pattern code. */ - - offset_top = md->end_offset_top; - eptr = md->end_match_ptr; - ecode++; - } - break; - - /* "Once" brackets are like assertion brackets except that after a match, - the point in the subject string is not moved back. Thus there can never be - a move back into the brackets. Check the alternative branches in turn - the - matching won't pass the KET for this kind of subpattern. If any one branch - matches, we carry on as at the end of a normal bracket, leaving the subject - pointer. */ - - case OP_ONCE: - { - const uschar *prev = ecode; - const uschar *saved_eptr = eptr; - - do - { - if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) - break; - ecode += (ecode[1] << 8) + ecode[2]; - } - while (*ecode == OP_ALT); - - /* If hit the end of the group (which could be repeated), fail */ - - if (*ecode != OP_ONCE && *ecode != OP_ALT) return FALSE; - - /* Continue as from after the assertion, updating the offsets high water - mark, since extracts may have been taken. */ - - do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); - - offset_top = md->end_offset_top; - eptr = md->end_match_ptr; - - /* For a non-repeating ket, just continue at this level. This also - happens for a repeating ket if no characters were matched in the group. - This is the forcible breaking of infinite loops as implemented in Perl - 5.005. If there is an options reset, it will get obeyed in the normal - course of events. */ - - if (*ecode == OP_KET || eptr == saved_eptr) - { - ecode += 3; - break; - } - - /* The repeating kets try the rest of the pattern or restart from the - preceding bracket, in the appropriate order. We need to reset any options - that changed within the bracket before re-running it, so check the next - opcode. */ - - if (ecode[3] == OP_OPT) - { - ims = (ims & ~PCRE_IMS) | ecode[4]; - DPRINTF(("ims set to %02lx at group repeat\n", ims)); - } - - if (*ecode == OP_KETRMIN) - { - if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) || - match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) - return TRUE; - } - else /* OP_KETRMAX */ - { - if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || - match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE; - } - } - return FALSE; - - /* An alternation is the end of a branch; scan along to find the end of the - bracketed group and go to there. */ - - case OP_ALT: - do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); - break; - - /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating - that it may occur zero times. It may repeat infinitely, or not at all - - i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper - repeat limits are compiled as a number of copies, with the optional ones - preceded by BRAZERO or BRAMINZERO. */ - - case OP_BRAZERO: - { - const uschar *next = ecode+1; - if (match(eptr, next, offset_top, md, ims, eptrb, match_isgroup)) - return TRUE; - do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); - ecode = next + 3; - } - break; - - case OP_BRAMINZERO: - { - const uschar *next = ecode+1; - do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); - if (match(eptr, next+3, offset_top, md, ims, eptrb, match_isgroup)) - return TRUE; - ecode++; - } - break; - - /* End of a group, repeated or non-repeating. If we are at the end of - an assertion "group", stop matching and return TRUE, but record the - current high water mark for use by positive assertions. Do this also - for the "once" (not-backup up) groups. */ - - case OP_KET: - case OP_KETRMIN: - case OP_KETRMAX: - { - const uschar *prev = ecode - (ecode[1] << 8) - ecode[2]; - const uschar *saved_eptr = eptrb->saved_eptr; - - eptrb = eptrb->prev; /* Back up the stack of bracket start pointers */ - - if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || - *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || - *prev == OP_ONCE) - { - md->end_match_ptr = eptr; /* For ONCE */ - md->end_offset_top = offset_top; - return TRUE; - } - - /* In all other cases except a conditional group we have to check the - group number back at the start and if necessary complete handling an - extraction by setting the offsets and bumping the high water mark. */ - - if (*prev != OP_COND) - { - int number = *prev - OP_BRA; - int offset = number << 1; - -#ifdef DEBUG - printf("end bracket %d", number); - printf("\n"); -#endif - - if (number > 0) - { - if (offset >= md->offset_max) md->offset_overflow = TRUE; else - { - md->offset_vector[offset] = - md->offset_vector[md->offset_end - number]; - md->offset_vector[offset+1] = eptr - md->start_subject; - if (offset_top <= offset) offset_top = offset + 2; - } - } - } - - /* Reset the value of the ims flags, in case they got changed during - the group. */ - - ims = original_ims; - DPRINTF(("ims reset to %02lx\n", ims)); - - /* For a non-repeating ket, just continue at this level. This also - happens for a repeating ket if no characters were matched in the group. - This is the forcible breaking of infinite loops as implemented in Perl - 5.005. If there is an options reset, it will get obeyed in the normal - course of events. */ - - if (*ecode == OP_KET || eptr == saved_eptr) - { - ecode += 3; - break; - } - - /* The repeating kets try the rest of the pattern or restart from the - preceding bracket, in the appropriate order. */ - - if (*ecode == OP_KETRMIN) - { - if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) || - match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) - return TRUE; - } - else /* OP_KETRMAX */ - { - if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || - match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE; - } - } - return FALSE; - - /* Start of subject unless notbol, or after internal newline if multiline */ - - case OP_CIRC: - if (md->notbol && eptr == md->start_subject) return FALSE; - if ((ims & PCRE_MULTILINE) != 0) - { - if (eptr != md->start_subject && eptr[-1] != '\n') return FALSE; - ecode++; - break; - } - /* ... else fall through */ - - /* Start of subject assertion */ - - case OP_SOD: - if (eptr != md->start_subject) return FALSE; - ecode++; - break; - - /* Assert before internal newline if multiline, or before a terminating - newline unless endonly is set, else end of subject unless noteol is set. */ - - case OP_DOLL: - if ((ims & PCRE_MULTILINE) != 0) - { - if (eptr < md->end_subject) { if (*eptr != '\n') return FALSE; } - else { if (md->noteol) return FALSE; } - ecode++; - break; - } - else - { - if (md->noteol) return FALSE; - if (!md->endonly) - { - if (eptr < md->end_subject - 1 || - (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE; - - ecode++; - break; - } - } - /* ... else fall through */ - - /* End of subject assertion (\z) */ - - case OP_EOD: - if (eptr < md->end_subject) return FALSE; - ecode++; - break; - - /* End of subject or ending \n assertion (\Z) */ - - case OP_EODN: - if (eptr < md->end_subject - 1 || - (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE; - ecode++; - break; - - /* Word boundary assertions */ - - case OP_NOT_WORD_BOUNDARY: - case OP_WORD_BOUNDARY: - { - BOOL prev_is_word = (eptr != md->start_subject) && - ((md->ctypes[eptr[-1]] & ctype_word) != 0); - BOOL cur_is_word = (eptr < md->end_subject) && - ((md->ctypes[*eptr] & ctype_word) != 0); - if ((*ecode++ == OP_WORD_BOUNDARY)? - cur_is_word == prev_is_word : cur_is_word != prev_is_word) - return FALSE; - } - break; - - /* Match a single character type; inline for speed */ - - case OP_ANY: - if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == '\n') - return FALSE; - if (eptr++ >= md->end_subject) return FALSE; -#ifdef SUPPORT_UTF8 - if (md->utf8) - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; -#endif - ecode++; - break; - - case OP_NOT_DIGIT: - if (eptr >= md->end_subject || - (md->ctypes[*eptr++] & ctype_digit) != 0) - return FALSE; - ecode++; - break; - - case OP_DIGIT: - if (eptr >= md->end_subject || - (md->ctypes[*eptr++] & ctype_digit) == 0) - return FALSE; - ecode++; - break; - - case OP_NOT_WHITESPACE: - if (eptr >= md->end_subject || - (md->ctypes[*eptr++] & ctype_space) != 0) - return FALSE; - ecode++; - break; - - case OP_WHITESPACE: - if (eptr >= md->end_subject || - (md->ctypes[*eptr++] & ctype_space) == 0) - return FALSE; - ecode++; - break; - - case OP_NOT_WORDCHAR: - if (eptr >= md->end_subject || - (md->ctypes[*eptr++] & ctype_word) != 0) - return FALSE; - ecode++; - break; - - case OP_WORDCHAR: - if (eptr >= md->end_subject || - (md->ctypes[*eptr++] & ctype_word) == 0) - return FALSE; - ecode++; - break; - - /* Match a back reference, possibly repeatedly. Look past the end of the - item to see if there is repeat information following. The code is similar - to that for character classes, but repeated for efficiency. Then obey - similar code to character type repeats - written out again for speed. - However, if the referenced string is the empty string, always treat - it as matched, any number of times (otherwise there could be infinite - loops). */ - - case OP_REF: - { - int length; - int offset = ecode[1] << 1; /* Doubled reference number */ - ecode += 2; /* Advance past the item */ - - /* If the reference is unset, set the length to be longer than the amount - of subject left; this ensures that every attempt at a match fails. We - can't just fail here, because of the possibility of quantifiers with zero - minima. */ - - length = (offset >= offset_top || md->offset_vector[offset] < 0)? - md->end_subject - eptr + 1 : - md->offset_vector[offset+1] - md->offset_vector[offset]; - - /* Set up for repetition, or handle the non-repeated case */ - - switch (*ecode) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRPLUS: - case OP_CRMINPLUS: - case OP_CRQUERY: - case OP_CRMINQUERY: - c = *ecode++ - OP_CRSTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - minimize = (*ecode == OP_CRMINRANGE); - min = (ecode[1] << 8) + ecode[2]; - max = (ecode[3] << 8) + ecode[4]; - if (max == 0) max = INT_MAX; - ecode += 5; - break; - - default: /* No repeat follows */ - if (!match_ref(offset, eptr, length, md, ims)) return FALSE; - eptr += length; - continue; /* With the main loop */ - } - - /* If the length of the reference is zero, just continue with the - main loop. */ - - if (length == 0) continue; - - /* First, ensure the minimum number of matches are present. We get back - the length of the reference string explicitly rather than passing the - address of eptr, so that eptr can be a register variable. */ - - for (i = 1; i <= min; i++) - { - if (!match_ref(offset, eptr, length, md, ims)) return FALSE; - eptr += length; - } - - /* If min = max, continue at the same level without recursion. - They are not both allowed to be zero. */ - - if (min == max) continue; - - /* If minimizing, keep trying and advancing the pointer */ - - if (minimize) - { - for (i = min;; i++) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - if (i >= max || !match_ref(offset, eptr, length, md, ims)) - return FALSE; - eptr += length; - } - /* Control never gets here */ - } - - /* If maximizing, find the longest string and work backwards */ - - else - { - const uschar *pp = eptr; - for (i = min; i < max; i++) - { - if (!match_ref(offset, eptr, length, md, ims)) break; - eptr += length; - } - while (eptr >= pp) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - eptr -= length; - } - return FALSE; - } - } - /* Control never gets here */ - - - - /* Match a character class, possibly repeatedly. Look past the end of the - item to see if there is repeat information following. Then obey similar - code to character type repeats - written out again for speed. */ - - case OP_CLASS: - { - const uschar *data = ecode + 1; /* Save for matching */ - ecode += 33; /* Advance past the item */ - - switch (*ecode) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRPLUS: - case OP_CRMINPLUS: - case OP_CRQUERY: - case OP_CRMINQUERY: - c = *ecode++ - OP_CRSTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - minimize = (*ecode == OP_CRMINRANGE); - min = (ecode[1] << 8) + ecode[2]; - max = (ecode[3] << 8) + ecode[4]; - if (max == 0) max = INT_MAX; - ecode += 5; - break; - - default: /* No repeat follows */ - min = max = 1; - break; - } - - /* First, ensure the minimum number of matches are present. */ - - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject) return FALSE; - GETCHARINC(c, eptr) /* Get character; increment eptr */ - -#ifdef SUPPORT_UTF8 - /* We do not yet support class members > 255 */ - if (c > 255) return FALSE; -#endif - - if ((data[c/8] & (1 << (c&7))) != 0) continue; - return FALSE; - } - - /* If max == min we can continue with the main loop without the - need to recurse. */ - - if (min == max) continue; - - /* If minimizing, keep testing the rest of the expression and advancing - the pointer while it matches the class. */ - - if (minimize) - { - for (i = min;; i++) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - if (i >= max || eptr >= md->end_subject) return FALSE; - GETCHARINC(c, eptr) /* Get character; increment eptr */ - -#ifdef SUPPORT_UTF8 - /* We do not yet support class members > 255 */ - if (c > 255) return FALSE; -#endif - if ((data[c/8] & (1 << (c&7))) != 0) continue; - return FALSE; - } - /* Control never gets here */ - } - - /* If maximizing, find the longest possible run, then work backwards. */ - - else - { - const uschar *pp = eptr; - int len = 1; - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len) /* Get character, set length if UTF-8 */ - -#ifdef SUPPORT_UTF8 - /* We do not yet support class members > 255 */ - if (c > 255) break; -#endif - if ((data[c/8] & (1 << (c&7))) == 0) break; - eptr += len; - } - - while (eptr >= pp) - { - if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - -#ifdef SUPPORT_UTF8 - BACKCHAR(eptr) -#endif - } - return FALSE; - } - } - /* Control never gets here */ - - /* Match a run of characters */ - - case OP_CHARS: - { - register int length = ecode[1]; - ecode += 2; - -#ifdef DEBUG /* Sigh. Some compilers never learn. */ - if (eptr >= md->end_subject) - printf("matching subject <null> against pattern "); - else - { - printf("matching subject "); - pchars(eptr, length, TRUE, md); - printf(" against pattern "); - } - pchars(ecode, length, FALSE, md); - printf("\n"); -#endif - - if (length > md->end_subject - eptr) return FALSE; - if ((ims & PCRE_CASELESS) != 0) - { - while (length-- > 0) - if (md->lcc[*ecode++] != md->lcc[*eptr++]) - return FALSE; - } - else - { - while (length-- > 0) if (*ecode++ != *eptr++) return FALSE; - } - } - break; - - /* Match a single character repeatedly; different opcodes share code. */ - - case OP_EXACT: - min = max = (ecode[1] << 8) + ecode[2]; - ecode += 3; - goto REPEATCHAR; - - case OP_UPTO: - case OP_MINUPTO: - min = 0; - max = (ecode[1] << 8) + ecode[2]; - minimize = *ecode == OP_MINUPTO; - ecode += 3; - goto REPEATCHAR; - - case OP_STAR: - case OP_MINSTAR: - case OP_PLUS: - case OP_MINPLUS: - case OP_QUERY: - case OP_MINQUERY: - c = *ecode++ - OP_STAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - - /* Common code for all repeated single-character matches. We can give - up quickly if there are fewer than the minimum number of characters left in - the subject. */ - - REPEATCHAR: - if (min > md->end_subject - eptr) return FALSE; - c = *ecode++; - - /* The code is duplicated for the caseless and caseful cases, for speed, - since matching characters is likely to be quite common. First, ensure the - minimum number of matches are present. If min = max, continue at the same - level without recursing. Otherwise, if minimizing, keep trying the rest of - the expression and advancing one matching character if failing, up to the - maximum. Alternatively, if maximizing, find the maximum number of - characters and work backwards. */ - - DPRINTF(("matching %c{%d,%d} against subject %.*s\n", c, min, max, - max, eptr)); - - if ((ims & PCRE_CASELESS) != 0) - { - c = md->lcc[c]; - for (i = 1; i <= min; i++) - if (c != md->lcc[*eptr++]) return FALSE; - if (min == max) continue; - if (minimize) - { - for (i = min;; i++) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - if (i >= max || eptr >= md->end_subject || - c != md->lcc[*eptr++]) - return FALSE; - } - /* Control never gets here */ - } - else - { - const uschar *pp = eptr; - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || c != md->lcc[*eptr]) break; - eptr++; - } - while (eptr >= pp) - if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - return FALSE; - } - /* Control never gets here */ - } - - /* Caseful comparisons */ - - else - { - for (i = 1; i <= min; i++) if (c != *eptr++) return FALSE; - if (min == max) continue; - if (minimize) - { - for (i = min;; i++) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - if (i >= max || eptr >= md->end_subject || c != *eptr++) return FALSE; - } - /* Control never gets here */ - } - else - { - const uschar *pp = eptr; - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || c != *eptr) break; - eptr++; - } - while (eptr >= pp) - if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - return FALSE; - } - } - /* Control never gets here */ - - /* Match a negated single character */ - - case OP_NOT: - if (eptr >= md->end_subject) return FALSE; - ecode++; - if ((ims & PCRE_CASELESS) != 0) - { - if (md->lcc[*ecode++] == md->lcc[*eptr++]) return FALSE; - } - else - { - if (*ecode++ == *eptr++) return FALSE; - } - break; - - /* Match a negated single character repeatedly. This is almost a repeat of - the code for a repeated single character, but I haven't found a nice way of - commoning these up that doesn't require a test of the positive/negative - option for each character match. Maybe that wouldn't add very much to the - time taken, but character matching *is* what this is all about... */ - - case OP_NOTEXACT: - min = max = (ecode[1] << 8) + ecode[2]; - ecode += 3; - goto REPEATNOTCHAR; - - case OP_NOTUPTO: - case OP_NOTMINUPTO: - min = 0; - max = (ecode[1] << 8) + ecode[2]; - minimize = *ecode == OP_NOTMINUPTO; - ecode += 3; - goto REPEATNOTCHAR; - - case OP_NOTSTAR: - case OP_NOTMINSTAR: - case OP_NOTPLUS: - case OP_NOTMINPLUS: - case OP_NOTQUERY: - case OP_NOTMINQUERY: - c = *ecode++ - OP_NOTSTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - - /* Common code for all repeated single-character matches. We can give - up quickly if there are fewer than the minimum number of characters left in - the subject. */ - - REPEATNOTCHAR: - if (min > md->end_subject - eptr) return FALSE; - c = *ecode++; - - /* The code is duplicated for the caseless and caseful cases, for speed, - since matching characters is likely to be quite common. First, ensure the - minimum number of matches are present. If min = max, continue at the same - level without recursing. Otherwise, if minimizing, keep trying the rest of - the expression and advancing one matching character if failing, up to the - maximum. Alternatively, if maximizing, find the maximum number of - characters and work backwards. */ - - DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", c, min, max, - max, eptr)); - - if ((ims & PCRE_CASELESS) != 0) - { - c = md->lcc[c]; - for (i = 1; i <= min; i++) - if (c == md->lcc[*eptr++]) return FALSE; - if (min == max) continue; - if (minimize) - { - for (i = min;; i++) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - if (i >= max || eptr >= md->end_subject || - c == md->lcc[*eptr++]) - return FALSE; - } - /* Control never gets here */ - } - else - { - const uschar *pp = eptr; - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || c == md->lcc[*eptr]) break; - eptr++; - } - while (eptr >= pp) - if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - return FALSE; - } - /* Control never gets here */ - } - - /* Caseful comparisons */ - - else - { - for (i = 1; i <= min; i++) if (c == *eptr++) return FALSE; - if (min == max) continue; - if (minimize) - { - for (i = min;; i++) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - if (i >= max || eptr >= md->end_subject || c == *eptr++) return FALSE; - } - /* Control never gets here */ - } - else - { - const uschar *pp = eptr; - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || c == *eptr) break; - eptr++; - } - while (eptr >= pp) - if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; - return FALSE; - } - } - /* Control never gets here */ - - /* Match a single character type repeatedly; several different opcodes - share code. This is very similar to the code for single characters, but we - repeat it in the interests of efficiency. */ - - case OP_TYPEEXACT: - min = max = (ecode[1] << 8) + ecode[2]; - minimize = TRUE; - ecode += 3; - goto REPEATTYPE; - - case OP_TYPEUPTO: - case OP_TYPEMINUPTO: - min = 0; - max = (ecode[1] << 8) + ecode[2]; - minimize = *ecode == OP_TYPEMINUPTO; - ecode += 3; - goto REPEATTYPE; - - case OP_TYPESTAR: - case OP_TYPEMINSTAR: - case OP_TYPEPLUS: - case OP_TYPEMINPLUS: - case OP_TYPEQUERY: - case OP_TYPEMINQUERY: - c = *ecode++ - OP_TYPESTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - - /* Common code for all repeated single character type matches */ - - REPEATTYPE: - ctype = *ecode++; /* Code for the character type */ - - /* First, ensure the minimum number of matches are present. Use inline - code for maximizing the speed, and do the type test once at the start - (i.e. keep it out of the loop). Also we can test that there are at least - the minimum number of bytes before we start, except when doing '.' in - UTF8 mode. Leave the test in in all cases; in the special case we have - to test after each character. */ - - if (min > md->end_subject - eptr) return FALSE; - if (min > 0) switch(ctype) - { - case OP_ANY: -#ifdef SUPPORT_UTF8 - if (md->utf8) - { - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject || - (*eptr++ == '\n' && (ims & PCRE_DOTALL) == 0)) - return FALSE; - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - break; - } -#endif - /* Non-UTF8 can be faster */ - if ((ims & PCRE_DOTALL) == 0) - { for (i = 1; i <= min; i++) if (*eptr++ == '\n') return FALSE; } - else eptr += min; - break; - - case OP_NOT_DIGIT: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_digit) != 0) return FALSE; - break; - - case OP_DIGIT: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_digit) == 0) return FALSE; - break; - - case OP_NOT_WHITESPACE: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_space) != 0) return FALSE; - break; - - case OP_WHITESPACE: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_space) == 0) return FALSE; - break; - - case OP_NOT_WORDCHAR: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_word) != 0) - return FALSE; - break; - - case OP_WORDCHAR: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_word) == 0) - return FALSE; - break; - } - - /* If min = max, continue at the same level without recursing */ - - if (min == max) continue; - - /* If minimizing, we have to test the rest of the pattern before each - subsequent match. */ - - if (minimize) - { - for (i = min;; i++) - { - if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; - if (i >= max || eptr >= md->end_subject) return FALSE; - - c = *eptr++; - switch(ctype) - { - case OP_ANY: - if ((ims & PCRE_DOTALL) == 0 && c == '\n') return FALSE; -#ifdef SUPPORT_UTF8 - if (md->utf8) - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; -#endif - break; - - case OP_NOT_DIGIT: - if ((md->ctypes[c] & ctype_digit) != 0) return FALSE; - break; - - case OP_DIGIT: - if ((md->ctypes[c] & ctype_digit) == 0) return FALSE; - break; - - case OP_NOT_WHITESPACE: - if ((md->ctypes[c] & ctype_space) != 0) return FALSE; - break; - - case OP_WHITESPACE: - if ((md->ctypes[c] & ctype_space) == 0) return FALSE; - break; - - case OP_NOT_WORDCHAR: - if ((md->ctypes[c] & ctype_word) != 0) return FALSE; - break; - - case OP_WORDCHAR: - if ((md->ctypes[c] & ctype_word) == 0) return FALSE; - break; - } - } - /* Control never gets here */ - } - - /* If maximizing it is worth using inline code for speed, doing the type - test once at the start (i.e. keep it out of the loop). */ - - else - { - const uschar *pp = eptr; - switch(ctype) - { - case OP_ANY: - - /* Special code is required for UTF8, but when the maximum is unlimited - we don't need it. */ - -#ifdef SUPPORT_UTF8 - if (md->utf8 && max < INT_MAX) - { - if ((ims & PCRE_DOTALL) == 0) - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || *eptr++ == '\n') break; - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - } - else - { - for (i = min; i < max; i++) - { - eptr++; - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - } - break; - } -#endif - /* Non-UTF8 can be faster */ - if ((ims & PCRE_DOTALL) == 0) - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || *eptr == '\n') break; - eptr++; - } - } - else - { - c = max - min; - if (c > md->end_subject - eptr) c = md->end_subject - eptr; - eptr += c; - } - break; - - case OP_NOT_DIGIT: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) - break; - eptr++; - } - break; - - case OP_DIGIT: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) - break; - eptr++; - } - break; - - case OP_NOT_WHITESPACE: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) - break; - eptr++; - } - break; - - case OP_WHITESPACE: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) - break; - eptr++; - } - break; - - case OP_NOT_WORDCHAR: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) - break; - eptr++; - } - break; - - case OP_WORDCHAR: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) - break; - eptr++; - } - break; - } - - while (eptr >= pp) - { - if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) - return TRUE; -#ifdef SUPPORT_UTF8 - if (md->utf8) - while (eptr > pp && (*eptr & 0xc0) == 0x80) eptr--; -#endif - } - return FALSE; - } - /* Control never gets here */ - - /* There's been some horrible disaster. */ - - default: - DPRINTF(("Unknown opcode %d\n", *ecode)); - md->errorcode = PCRE_ERROR_UNKNOWN_NODE; - return FALSE; - } - - /* Do not stick any code in here without much thought; it is assumed - that "continue" in the code above comes out to here to repeat the main - loop. */ - - } /* End of main loop */ -/* Control never reaches here */ -} - - - - -/************************************************* -* Execute a Regular Expression * -*************************************************/ - -/* This function applies a compiled re to a subject string and picks out -portions of the string if it matches. Two elements in the vector are set for -each substring: the offsets to the start and end of the substring. - -Arguments: - external_re points to the compiled expression - external_extra points to "hints" from pcre_study() or is NULL - subject points to the subject string - length length of subject string (may contain binary zeros) - start_offset where to start in the subject string - options option bits - offsets points to a vector of ints to be filled in with offsets - offsetcount the number of elements in the vector - -Returns: > 0 => success; value is the number of elements filled in - = 0 => success, but offsets is not big enough - -1 => failed to match - < -1 => some kind of unexpected problem -*/ - -int -pcre_exec(const pcre *external_re, const pcre_extra *external_extra, - const char *subject, int length, int start_offset, int options, int *offsets, - int offsetcount) -{ -int resetcount, ocount; -int first_char = -1; -int req_char = -1; -int req_char2 = -1; -unsigned long int ims = 0; -match_data match_block; -const uschar *start_bits = NULL; -const uschar *start_match = (const uschar *)subject + start_offset; -const uschar *end_subject; -const uschar *req_char_ptr = start_match - 1; -const real_pcre *re = (const real_pcre *)external_re; -const real_pcre_extra *extra = (const real_pcre_extra *)external_extra; -BOOL using_temporary_offsets = FALSE; -BOOL anchored = ((re->options | options) & PCRE_ANCHORED) != 0; -BOOL startline = (re->options & PCRE_STARTLINE) != 0; - -if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; - -if (re == NULL || subject == NULL || - (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; -if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; - -match_block.start_pattern = re->code; -match_block.start_subject = (const uschar *)subject; -match_block.end_subject = match_block.start_subject + length; -end_subject = match_block.end_subject; - -match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; -match_block.utf8 = (re->options & PCRE_UTF8) != 0; - -match_block.notbol = (options & PCRE_NOTBOL) != 0; -match_block.noteol = (options & PCRE_NOTEOL) != 0; -match_block.notempty = (options & PCRE_NOTEMPTY) != 0; - -match_block.errorcode = PCRE_ERROR_NOMATCH; /* Default error */ - -match_block.lcc = re->tables + lcc_offset; -match_block.ctypes = re->tables + ctypes_offset; - -/* The ims options can vary during the matching as a result of the presence -of (?ims) items in the pattern. They are kept in a local variable so that -restoring at the exit of a group is easy. */ - -ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL); - -/* If the expression has got more back references than the offsets supplied can -hold, we get a temporary bit of working store to use during the matching. -Otherwise, we can use the vector supplied, rounding down its size to a multiple -of 3. */ - -ocount = offsetcount - (offsetcount % 3); - -if (re->top_backref > 0 && re->top_backref >= ocount/3) - { - ocount = re->top_backref * 3 + 3; - match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int)); - if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY; - using_temporary_offsets = TRUE; - DPRINTF(("Got memory to hold back references\n")); - } -else match_block.offset_vector = offsets; - -match_block.offset_end = ocount; -match_block.offset_max = (2*ocount)/3; -match_block.offset_overflow = FALSE; - -/* Compute the minimum number of offsets that we need to reset each time. Doing -this makes a huge difference to execution time when there aren't many brackets -in the pattern. */ - -resetcount = 2 + re->top_bracket * 2; -if (resetcount > offsetcount) resetcount = ocount; - -/* Reset the working variable associated with each extraction. These should -never be used unless previously set, but they get saved and restored, and so we -initialize them to avoid reading uninitialized locations. */ - -if (match_block.offset_vector != NULL) - { - register int *iptr = match_block.offset_vector + ocount; - register int *iend = iptr - resetcount/2 + 1; - while (--iptr >= iend) *iptr = -1; - } - -/* Set up the first character to match, if available. The first_char value is -never set for an anchored regular expression, but the anchoring may be forced -at run time, so we have to test for anchoring. The first char may be unset for -an unanchored pattern, of course. If there's no first char and the pattern was -studied, there may be a bitmap of possible first characters. */ - -if (!anchored) - { - if ((re->options & PCRE_FIRSTSET) != 0) - { - first_char = re->first_char; - if ((ims & PCRE_CASELESS) != 0) first_char = match_block.lcc[first_char]; - } - else - if (!startline && extra != NULL && - (extra->options & PCRE_STUDY_MAPPED) != 0) - start_bits = extra->start_bits; - } - -/* For anchored or unanchored matches, there may be a "last known required -character" set. If the PCRE_CASELESS is set, implying that the match starts -caselessly, or if there are any changes of this flag within the regex, set up -both cases of the character. Otherwise set the two values the same, which will -avoid duplicate testing (which takes significant time). This covers the vast -majority of cases. It will be suboptimal when the case flag changes in a regex -and the required character in fact is caseful. */ - -if ((re->options & PCRE_REQCHSET) != 0) - { - req_char = re->req_char; - req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0)? - (re->tables + fcc_offset)[req_char] : req_char; - } - -/* Loop for handling unanchored repeated matching attempts; for anchored regexs -the loop runs just once. */ - -do - { - int rc; - register int *iptr = match_block.offset_vector; - register int *iend = iptr + resetcount; - - /* Reset the maximum number of extractions we might see. */ - - while (iptr < iend) *iptr++ = -1; - - /* Advance to a unique first char if possible */ - - if (first_char >= 0) - { - if ((ims & PCRE_CASELESS) != 0) - while (start_match < end_subject && - match_block.lcc[*start_match] != first_char) - start_match++; - else - while (start_match < end_subject && *start_match != first_char) - start_match++; - } - - /* Or to just after \n for a multiline match if possible */ - - else if (startline) - { - if (start_match > match_block.start_subject + start_offset) - { - while (start_match < end_subject && start_match[-1] != '\n') - start_match++; - } - } - - /* Or to a non-unique first char after study */ - - else if (start_bits != NULL) - { - while (start_match < end_subject) - { - register int c = *start_match; - if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break; - } - } - -#ifdef DEBUG /* Sigh. Some compilers never learn. */ - printf(">>>> Match against: "); - pchars(start_match, end_subject - start_match, TRUE, &match_block); - printf("\n"); -#endif - - /* If req_char is set, we know that that character must appear in the subject - for the match to succeed. If the first character is set, req_char must be - later in the subject; otherwise the test starts at the match point. This - optimization can save a huge amount of backtracking in patterns with nested - unlimited repeats that aren't going to match. We don't know what the state of - case matching may be when this character is hit, so test for it in both its - cases if necessary. However, the different cased versions will not be set up - unless PCRE_CASELESS was given or the casing state changes within the regex. - Writing separate code makes it go faster, as does using an autoincrement and - backing off on a match. */ - - if (req_char >= 0) - { - register const uschar *p = start_match + ((first_char >= 0)? 1 : 0); - - /* We don't need to repeat the search if we haven't yet reached the - place we found it at last time. */ - - if (p > req_char_ptr) - { - /* Do a single test if no case difference is set up */ - - if (req_char == req_char2) - { - while (p < end_subject) - { - if (*p++ == req_char) { p--; break; } - } - } - - /* Otherwise test for either case */ - - else - { - while (p < end_subject) - { - register int pp = *p++; - if (pp == req_char || pp == req_char2) { p--; break; } - } - } - - /* If we can't find the required character, break the matching loop */ - - if (p >= end_subject) break; - - /* If we have found the required character, save the point where we - found it, so that we don't search again next time round the loop if - the start hasn't passed this character yet. */ - - req_char_ptr = p; - } - } - - /* When a match occurs, substrings will be set for all internal extractions; - we just need to set up the whole thing as substring 0 before returning. If - there were too many extractions, set the return code to zero. In the case - where we had to get some local store to hold offsets for backreferences, copy - those back references that we can. In this case there need not be overflow - if certain parts of the pattern were not used. */ - - match_block.start_match = start_match; - if (!match(start_match, re->code, 2, &match_block, ims, NULL, match_isgroup)) - continue; - - /* Copy the offset information from temporary store if necessary */ - - if (using_temporary_offsets) - { - if (offsetcount >= 4) - { - memcpy(offsets + 2, match_block.offset_vector + 2, - (offsetcount - 2) * sizeof(int)); - DPRINTF(("Copied offsets from temporary memory\n")); - } - if (match_block.end_offset_top > offsetcount) - match_block.offset_overflow = TRUE; - - DPRINTF(("Freeing temporary memory\n")); - (pcre_free)(match_block.offset_vector); - } - - rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2; - - if (match_block.offset_end < 2) rc = 0; else - { - offsets[0] = start_match - match_block.start_subject; - offsets[1] = match_block.end_match_ptr - match_block.start_subject; - } - - DPRINTF((">>>> returning %d\n", rc)); - return rc; - } - -/* This "while" is the end of the "do" above */ - -while (!anchored && - match_block.errorcode == PCRE_ERROR_NOMATCH && - start_match++ < end_subject); - -if (using_temporary_offsets) - { - DPRINTF(("Freeing temporary memory\n")); - (pcre_free)(match_block.offset_vector); - } - -DPRINTF((">>>> returning %d\n", match_block.errorcode)); - -return match_block.errorcode; -} - -/* End of pcre.c */ diff --git a/external/privoxy/pcre/pcre.def b/external/privoxy/pcre/pcre.def deleted file mode 100644 index 0e8cf3f..0000000 --- a/external/privoxy/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/external/privoxy/pcre/pcre.h b/external/privoxy/pcre/pcre.h deleted file mode 100644 index d27ba85..0000000 --- a/external/privoxy/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 <stdlib.h> - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options */ - -#define PCRE_CASELESS 0x0001 -#define PCRE_MULTILINE 0x0002 -#define PCRE_DOTALL 0x0004 -#define PCRE_EXTENDED 0x0008 -#define PCRE_ANCHORED 0x0010 -#define PCRE_DOLLAR_ENDONLY 0x0020 -#define PCRE_EXTRA 0x0040 -#define PCRE_NOTBOL 0x0080 -#define PCRE_NOTEOL 0x0100 -#define PCRE_UNGREEDY 0x0200 -#define PCRE_NOTEMPTY 0x0400 -#define PCRE_UTF8 0x0800 - -/* Exec-time and get-time error codes */ - -#define PCRE_ERROR_NOMATCH (-1) -#define PCRE_ERROR_NULL (-2) -#define PCRE_ERROR_BADOPTION (-3) -#define PCRE_ERROR_BADMAGIC (-4) -#define PCRE_ERROR_UNKNOWN_NODE (-5) -#define PCRE_ERROR_NOMEMORY (-6) -#define PCRE_ERROR_NOSUBSTRING (-7) - -/* Request types for pcre_fullinfo() */ - -#define PCRE_INFO_OPTIONS 0 -#define PCRE_INFO_SIZE 1 -#define PCRE_INFO_CAPTURECOUNT 2 -#define PCRE_INFO_BACKREFMAX 3 -#define PCRE_INFO_FIRSTCHAR 4 -#define PCRE_INFO_FIRSTTABLE 5 -#define PCRE_INFO_LASTLITERAL 6 - -/* Types */ - -typedef void pcre; -typedef void pcre_extra; - -/* Store get and free functions. These can be set to alternative malloc/free -functions if required. Some magic is required for Win32 DLL; it is null on -other OS. */ - -PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t); -PCRE_DL_IMPORT extern void (*pcre_free)(void *); - -#undef PCRE_DL_IMPORT - -/* Functions */ - -extern pcre *pcre_compile(const char *, int, const char **, int *, - const unsigned char *); -extern int pcre_copy_substring(const char *, int *, int, int, char *, int); -extern int pcre_exec(const pcre *, const pcre_extra *, const char *, - int, int, int, int *, int); -extern void pcre_free_substring(const char *); -extern void pcre_free_substring_list(const char **); -extern int pcre_get_substring(const char *, int *, int, int, const char **); -extern int pcre_get_substring_list(const char *, int *, int, const char ***); -extern int pcre_info(const pcre *, int *, int *); -extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); -extern unsigned const char *pcre_maketables(void); -extern pcre_extra *pcre_study(const pcre *, int, const char **); -extern const char *pcre_version(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcre.h */ diff --git a/external/privoxy/pcre/pcre.in b/external/privoxy/pcre/pcre.in deleted file mode 100644 index d698f40..0000000 --- a/external/privoxy/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 <stdlib.h> - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options */ - -#define PCRE_CASELESS 0x0001 -#define PCRE_MULTILINE 0x0002 -#define PCRE_DOTALL 0x0004 -#define PCRE_EXTENDED 0x0008 -#define PCRE_ANCHORED 0x0010 -#define PCRE_DOLLAR_ENDONLY 0x0020 -#define PCRE_EXTRA 0x0040 -#define PCRE_NOTBOL 0x0080 -#define PCRE_NOTEOL 0x0100 -#define PCRE_UNGREEDY 0x0200 -#define PCRE_NOTEMPTY 0x0400 -#define PCRE_UTF8 0x0800 - -/* Exec-time and get-time error codes */ - -#define PCRE_ERROR_NOMATCH (-1) -#define PCRE_ERROR_NULL (-2) -#define PCRE_ERROR_BADOPTION (-3) -#define PCRE_ERROR_BADMAGIC (-4) -#define PCRE_ERROR_UNKNOWN_NODE (-5) -#define PCRE_ERROR_NOMEMORY (-6) -#define PCRE_ERROR_NOSUBSTRING (-7) - -/* Request types for pcre_fullinfo() */ - -#define PCRE_INFO_OPTIONS 0 -#define PCRE_INFO_SIZE 1 -#define PCRE_INFO_CAPTURECOUNT 2 -#define PCRE_INFO_BACKREFMAX 3 -#define PCRE_INFO_FIRSTCHAR 4 -#define PCRE_INFO_FIRSTTABLE 5 -#define PCRE_INFO_LASTLITERAL 6 - -/* Types */ - -typedef void pcre; -typedef void pcre_extra; - -/* Store get and free functions. These can be set to alternative malloc/free -functions if required. Some magic is required for Win32 DLL; it is null on -other OS. */ - -PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t); -PCRE_DL_IMPORT extern void (*pcre_free)(void *); - -#undef PCRE_DL_IMPORT - -/* Functions */ - -extern pcre *pcre_compile(const char *, int, const char **, int *, - const unsigned char *); -extern int pcre_copy_substring(const char *, int *, int, int, char *, int); -extern int pcre_exec(const pcre *, const pcre_extra *, const char *, - int, int, int, int *, int); -extern void pcre_free_substring(const char *); -extern void pcre_free_substring_list(const char **); -extern int pcre_get_substring(const char *, int *, int, int, const char **); -extern int pcre_get_substring_list(const char *, int *, int, const char ***); -extern int pcre_info(const pcre *, int *, int *); -extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); -extern unsigned const char *pcre_maketables(void); -extern pcre_extra *pcre_study(const pcre *, int, const char **); -extern const char *pcre_version(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcre.h */ diff --git a/external/privoxy/pcre/pcregrep.c b/external/privoxy/pcre/pcregrep.c deleted file mode 100644 index e8c934e..0000000 --- a/external/privoxy/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 <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <errno.h> -#include "config.h" -#include "pcre.h" - -#define FALSE 0 -#define TRUE 1 - -typedef int BOOL; - - - -/************************************************* -* Global variables * -*************************************************/ - -static pcre *pattern; -static pcre_extra *hints; - -static BOOL count_only = FALSE; -static BOOL filenames_only = FALSE; -static BOOL invert = FALSE; -static BOOL number = FALSE; -static BOOL silent = FALSE; -static BOOL whole_lines = FALSE; - - - -#if ! HAVE_STRERROR -/************************************************* -* Provide strerror() for non-ANSI libraries * -*************************************************/ - -/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() -in their libraries, but can provide the same facility by this simple -alternative function. */ - -extern int sys_nerr; -extern char *sys_errlist[]; - -char * -strerror(int n) -{ -if (n < 0 || n >= sys_nerr) return "unknown error number"; -return sys_errlist[n]; -} -#endif /* HAVE_STRERROR */ - - - -/************************************************* -* Grep an individual file * -*************************************************/ - -static int -pcregrep(FILE *in, char *name) -{ -int rc = 1; -int linenumber = 0; -int count = 0; -int offsets[99]; -char buffer[BUFSIZ]; - -while (fgets(buffer, sizeof(buffer), in) != NULL) - { - BOOL match; - int length = (int)strlen(buffer); - if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0; - linenumber++; - - match = pcre_exec(pattern, hints, buffer, length, 0, 0, offsets, 99) >= 0; - if (match && whole_lines && offsets[1] != length) match = FALSE; - - if (match != invert) - { - if (count_only) count++; - - else if (filenames_only) - { - fprintf(stdout, "%s\n", (name == NULL)? "<stdin>" : name); - return 0; - } - - else if (silent) return 0; - - else - { - if (name != NULL) fprintf(stdout, "%s:", name); - if (number) fprintf(stdout, "%d:", linenumber); - fprintf(stdout, "%s\n", buffer); - } - - rc = 0; - } - } - -if (count_only) - { - if (name != NULL) fprintf(stdout, "%s:", name); - fprintf(stdout, "%d\n", count); - } - -return rc; -} - - - - -/************************************************* -* Usage function * -*************************************************/ - -static int -usage(int rc) -{ -fprintf(stderr, "Usage: pcregrep [-Vchilnsvx] pattern [file] ...\n"); -return rc; -} - - - - -/************************************************* -* Main program * -*************************************************/ - -int -main(int argc, char **argv) -{ -int i; -int rc = 1; -int options = 0; -int errptr; -const char *error; -BOOL filenames = TRUE; - -/* Process the options */ - -for (i = 1; i < argc; i++) - { - char *s; - if (argv[i][0] != '-') break; - s = argv[i] + 1; - while (*s != 0) - { - switch (*s++) - { - case 'c': count_only = TRUE; break; - case 'h': filenames = FALSE; break; - case 'i': options |= PCRE_CASELESS; break; - case 'l': filenames_only = TRUE; - case 'n': number = TRUE; break; - case 's': silent = TRUE; break; - case 'v': invert = TRUE; break; - case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break; - - case 'V': - fprintf(stderr, "PCRE version %s\n", pcre_version()); - break; - - default: - fprintf(stderr, "pcregrep: unknown option %c\n", s[-1]); - return usage(2); - } - } - } - -/* There must be at least a regexp argument */ - -if (i >= argc) return usage(0); - -/* Compile the regular expression. */ - -pattern = pcre_compile(argv[i++], options, &error, &errptr, NULL); -if (pattern == NULL) - { - fprintf(stderr, "pcregrep: error in regex at offset %d: %s\n", errptr, error); - return 2; - } - -/* Study the regular expression, as we will be running it may times */ - -hints = pcre_study(pattern, 0, &error); -if (error != NULL) - { - fprintf(stderr, "pcregrep: error while studing regex: %s\n", error); - return 2; - } - -/* If there are no further arguments, do the business on stdin and exit */ - -if (i >= argc) return pcregrep(stdin, NULL); - -/* Otherwise, work through the remaining arguments as files. If there is only -one, don't give its name on the output. */ - -if (i == argc - 1) filenames = FALSE; -if (filenames_only) filenames = TRUE; - -for (; i < argc; i++) - { - FILE *in = fopen(argv[i], "r"); - if (in == NULL) - { - fprintf(stderr, "%s: failed to open: %s\n", argv[i], strerror(errno)); - rc = 2; - } - else - { - int frc = pcregrep(in, filenames? argv[i] : NULL); - if (frc == 0 && rc == 1) rc = 0; - fclose(in); - } - } - -return rc; -} - -/* End */ diff --git a/external/privoxy/pcre/pcreposix.c b/external/privoxy/pcre/pcreposix.c deleted file mode 100644 index 519d2dd..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - - Copyright (c) 1997-2000 University of Cambridge - ------------------------------------------------------------------------------ -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. ------------------------------------------------------------------------------ -*/ - -#include "internal.h" -#include "pcreposix.h" -#include "stdlib.h" - - - -/* Corresponding tables of PCRE error messages and POSIX error codes. */ - -static const char *estring[] = { - ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, - ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20, - ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30, - ERR31 }; - -static int eint[] = { - REG_EESCAPE, /* "\ at end of pattern" */ - REG_EESCAPE, /* "\c at end of pattern" */ - REG_EESCAPE, /* "unrecognized character follows \" */ - REG_BADBR, /* "numbers out of order in {} quantifier" */ - REG_BADBR, /* "number too big in {} quantifier" */ - REG_EBRACK, /* "missing terminating ] for character class" */ - REG_ECTYPE, /* "invalid escape sequence in character class" */ - REG_ERANGE, /* "range out of order in character class" */ - REG_BADRPT, /* "nothing to repeat" */ - REG_BADRPT, /* "operand of unlimited repeat could match the empty string" */ - REG_ASSERT, /* "internal error: unexpected repeat" */ - REG_BADPAT, /* "unrecognized character after (?" */ - REG_ESIZE, /* "too many capturing parenthesized sub-patterns" */ - REG_EPAREN, /* "missing )" */ - REG_ESUBREG, /* "back reference to non-existent subpattern" */ - REG_INVARG, /* "erroffset passed as NULL" */ - REG_INVARG, /* "unknown option bit(s) set" */ - REG_EPAREN, /* "missing ) after comment" */ - REG_ESIZE, /* "too many sets of parentheses" */ - REG_ESIZE, /* "regular expression too large" */ - REG_ESPACE, /* "failed to get memory" */ - REG_EPAREN, /* "unmatched brackets" */ - REG_ASSERT, /* "internal error: code overflow" */ - REG_BADPAT, /* "unrecognized character after (?<" */ - REG_BADPAT, /* "lookbehind assertion is not fixed length" */ - REG_BADPAT, /* "malformed number after (?(" */ - REG_BADPAT, /* "conditional group containe more than two branches" */ - REG_BADPAT, /* "assertion expected after (?(" */ - REG_BADPAT, /* "(?p must be followed by )" */ - REG_ECTYPE, /* "unknown POSIX class name" */ - REG_BADPAT, /* "POSIX collating elements are not supported" */ - REG_INVARG, /* "this version of PCRE is not compiled with PCRE_UTF8 support" */ - REG_BADPAT, /* "characters with values > 255 are not yet supported in classes" */ - REG_BADPAT, /* "character value in \x{...} sequence is too large" */ - REG_BADPAT /* "invalid condition (?(0)" */ -}; - -/* Table of texts corresponding to POSIX error codes */ - -static const char *pstring[] = { - "", /* Dummy for value 0 */ - "internal error", /* REG_ASSERT */ - "invalid repeat counts in {}", /* BADBR */ - "pattern error", /* BADPAT */ - "? * + invalid", /* BADRPT */ - "unbalanced {}", /* EBRACE */ - "unbalanced []", /* EBRACK */ - "collation error - not relevant", /* ECOLLATE */ - "bad class", /* ECTYPE */ - "bad escape sequence", /* EESCAPE */ - "empty expression", /* EMPTY */ - "unbalanced ()", /* EPAREN */ - "bad range inside []", /* ERANGE */ - "expression too big", /* ESIZE */ - "failed to get memory", /* ESPACE */ - "bad back reference", /* ESUBREG */ - "bad argument", /* INVARG */ - "match failed" /* NOMATCH */ -}; - - - - -/************************************************* -* Translate PCRE text code to int * -*************************************************/ - -/* PCRE compile-time errors are given as strings defined as macros. We can just -look them up in a table to turn them into POSIX-style error codes. */ - -static int -pcre_posix_error_code(const char *s) -{ -size_t i; -for (i = 0; i < sizeof(estring)/sizeof(char *); i++) - if (strcmp(s, estring[i]) == 0) return eint[i]; -return REG_ASSERT; -} - - - -/************************************************* -* Translate error code to string * -*************************************************/ - -size_t -regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) -{ -const char *message, *addmessage; -size_t length, addlength; - -message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))? - "unknown error code" : pstring[errcode]; -length = strlen(message) + 1; - -addmessage = " at offset "; -addlength = (preg != NULL && (int)preg->re_erroffset != -1)? - strlen(addmessage) + 6 : 0; - -if (errbuf_size > 0) - { - if (addlength > 0 && errbuf_size >= length + addlength) - sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset); - else - { - strncpy(errbuf, message, errbuf_size - 1); - errbuf[errbuf_size-1] = 0; - } - } - -return length + addlength; -} - - - - -/************************************************* -* Free store held by a regex * -*************************************************/ - -void -regfree(regex_t *preg) -{ -(pcre_free)(preg->re_pcre); -} - - - - -/************************************************* -* Compile a regular expression * -*************************************************/ - -/* -Arguments: - preg points to a structure for recording the compiled expression - pattern the pattern to compile - cflags compilation flags - -Returns: 0 on success - various non-zero codes on failure -*/ - -int -regcomp(regex_t *preg, const char *pattern, int cflags) -{ -const char *errorptr; -int erroffset; -int options = 0; - -if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; -if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; - -preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL); -preg->re_erroffset = erroffset; - -if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr); - -preg->re_nsub = pcre_info(preg->re_pcre, NULL, NULL); -return 0; -} - - - - -/************************************************* -* Match a regular expression * -*************************************************/ - -/* Unfortunately, PCRE requires 3 ints of working space for each captured -substring, so we have to get and release working store instead of just using -the POSIX structures as was done in earlier releases when PCRE needed only 2 -ints. */ - -int -regexec(regex_t *preg, const char *string, size_t nmatch, - regmatch_t pmatch[], int eflags) -{ -int rc; -int options = 0; -int *ovector = NULL; - -if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL; -if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL; - -preg->re_erroffset = (size_t)(-1); /* Only has meaning after compile */ - -if (nmatch > 0) - { - ovector = (int *)malloc(sizeof(int) * nmatch * 3); - if (ovector == NULL) return REG_ESPACE; - } - -rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string), 0, options, - ovector, nmatch * 3); - -if (rc == 0) rc = nmatch; /* All captured slots were filled in */ - -if (rc >= 0) - { - size_t i; - for (i = 0; i < (size_t)rc; i++) - { - pmatch[i].rm_so = ovector[i*2]; - pmatch[i].rm_eo = ovector[i*2+1]; - } - if (ovector != NULL) free(ovector); - for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; - return 0; - } - -else - { - if (ovector != NULL) free(ovector); - switch(rc) - { - case PCRE_ERROR_NOMATCH: return REG_NOMATCH; - case PCRE_ERROR_NULL: return REG_INVARG; - case PCRE_ERROR_BADOPTION: return REG_INVARG; - case PCRE_ERROR_BADMAGIC: return REG_INVARG; - case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; - case PCRE_ERROR_NOMEMORY: return REG_ESPACE; - default: return REG_ASSERT; - } - } -} - -/* End of pcreposix.c */ diff --git a/external/privoxy/pcre/pcreposix.h b/external/privoxy/pcre/pcreposix.h deleted file mode 100644 index 7660acb..0000000 --- a/external/privoxy/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 <stdlib.h> - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options defined by POSIX. */ - -#define REG_ICASE 0x01 -#define REG_NEWLINE 0x02 -#define REG_NOTBOL 0x04 -#define REG_NOTEOL 0x08 - -/* These are not used by PCRE, but by defining them we make it easier -to slot PCRE into existing programs that make POSIX calls. */ - -#define REG_EXTENDED 0 -#define REG_NOSUB 0 - -/* Error values. Not all these are relevant or used by the wrapper. */ - -enum { - REG_ASSERT = 1, /* internal error ? */ - REG_BADBR, /* invalid repeat counts in {} */ - REG_BADPAT, /* pattern error */ - REG_BADRPT, /* ? * + invalid */ - REG_EBRACE, /* unbalanced {} */ - REG_EBRACK, /* unbalanced [] */ - REG_ECOLLATE, /* collation error - not relevant */ - REG_ECTYPE, /* bad class */ - REG_EESCAPE, /* bad escape sequence */ - REG_EMPTY, /* empty expression */ - REG_EPAREN, /* unbalanced () */ - REG_ERANGE, /* bad range inside [] */ - REG_ESIZE, /* expression too big */ - REG_ESPACE, /* failed to get memory */ - REG_ESUBREG, /* bad back reference */ - REG_INVARG, /* bad argument */ - REG_NOMATCH /* match failed */ -}; - - -/* The structure representing a compiled regular expression. */ - -typedef struct { - void *re_pcre; - size_t re_nsub; - size_t re_erroffset; -} regex_t; - -/* The structure in which a captured offset is returned. */ - -typedef int regoff_t; - -typedef struct { - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - -/* The functions */ - -extern int regcomp(regex_t *, const char *, int); -extern int regexec(regex_t *, const char *, size_t, regmatch_t *, int); -extern size_t regerror(int, const regex_t *, char *, size_t); -extern void regfree(regex_t *); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcreposix.h */ diff --git a/external/privoxy/pcre/pcretest.c b/external/privoxy/pcre/pcretest.c deleted file mode 100644 index ee5df5f..0000000 --- a/external/privoxy/pcre/pcretest.c +++ /dev/null @@ -1,1225 +0,0 @@ -/************************************************* -* PCRE testing program * -*************************************************/ - -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <time.h> -#include <locale.h> - -/* Use the internal info for displaying the results of pcre_study(). */ - -#include "internal.h" - -/* It is possible to compile this test program without including support for -testing the POSIX interface, though this is not available via the standard -Makefile. */ - -#if !defined NOPOSIX -#include "pcreposix.h" -#endif - -#ifndef CLOCKS_PER_SEC -#ifdef CLK_TCK -#define CLOCKS_PER_SEC CLK_TCK -#else -#define CLOCKS_PER_SEC 100 -#endif -#endif - -#define LOOPREPEAT 20000 - - -static FILE *outfile; -static int log_store = 0; -static size_t gotten_store; - - - -static int utf8_table1[] = { - 0x0000007f, 0x000007ff, 0x0000ffff, 0x001fffff, 0x03ffffff, 0x7fffffff}; - -static int utf8_table2[] = { - 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; - -static int utf8_table3[] = { - 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; - - -/************************************************* -* Convert character value to UTF-8 * -*************************************************/ - -/* This function takes an integer value in the range 0 - 0x7fffffff -and encodes it as a UTF-8 character in 0 to 6 bytes. - -Arguments: - cvalue the character value - buffer pointer to buffer for result - at least 6 bytes long - -Returns: number of characters placed in the buffer - -1 if input character is negative - 0 if input character is positive but too big (only when - int is longer than 32 bits) -*/ - -static int -ord2utf8(int cvalue, unsigned char *buffer) -{ -register int i, j; -for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) - if (cvalue <= utf8_table1[i]) break; -if (i >= sizeof(utf8_table1)/sizeof(int)) return 0; -if (cvalue < 0) return -1; -*buffer++ = utf8_table2[i] | (cvalue & utf8_table3[i]); -cvalue >>= 6 - i; -for (j = 0; j < i; j++) - { - *buffer++ = 0x80 | (cvalue & 0x3f); - cvalue >>= 6; - } -return i + 1; -} - - -/************************************************* -* Convert UTF-8 string to value * -*************************************************/ - -/* This function takes one or more bytes that represents a UTF-8 character, -and returns the value of the character. - -Argument: - buffer a pointer to the byte vector - vptr a pointer to an int to receive the value - -Returns: > 0 => the number of bytes consumed - -6 to 0 => malformed UTF-8 character at offset = (-return) -*/ - -int -utf82ord(unsigned char *buffer, int *vptr) -{ -int c = *buffer++; -int d = c; -int i, j, s; - -for (i = -1; i < 6; i++) /* i is number of additional bytes */ - { - if ((d & 0x80) == 0) break; - d <<= 1; - } - -if (i == -1) { *vptr = c; return 1; } /* ascii character */ -if (i == 0 || i == 6) return 0; /* invalid UTF-8 */ - -/* i now has a value in the range 1-5 */ - -d = c & utf8_table3[i]; -s = 6 - i; - -for (j = 0; j < i; j++) - { - c = *buffer++; - if ((c & 0xc0) != 0x80) return -(j+1); - d |= (c & 0x3f) << s; - s += 6; - } - -/* Check that encoding was the correct unique one */ - -for (j = 0; j < sizeof(utf8_table1)/sizeof(int); j++) - if (d <= utf8_table1[j]) break; -if (j != i) return -(i+1); - -/* Valid value */ - -*vptr = d; -return i+1; -} - - - - - - -/* Debugging function to print the internal form of the regex. This is the same -code as contained in pcre.c under the DEBUG macro. */ - -static const char *OP_names[] = { - "End", "\A", "\B", "\b", "\D", "\d", - "\S", "\s", "\W", "\w", "\Z", "\z", - "Opt", "^", "$", "Any", "chars", "not", - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", - "*", "*?", "+", "+?", "?", "??", "{", "{", - "class", "Ref", "Recurse", - "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", - "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref", - "Brazero", "Braminzero", "Bra" -}; - - -static void print_internals(pcre *re) -{ -unsigned char *code = ((real_pcre *)re)->code; - -fprintf(outfile, "------------------------------------------------------------------\n"); - -for(;;) - { - int c; - int charlength; - - fprintf(outfile, "%3d ", (int)(code - ((real_pcre *)re)->code)); - - if (*code >= OP_BRA) - { - fprintf(outfile, "%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA); - code += 2; - } - - else switch(*code) - { - case OP_END: - fprintf(outfile, " %s\n", OP_names[*code]); - fprintf(outfile, "------------------------------------------------------------------\n"); - return; - - case OP_OPT: - fprintf(outfile, " %.2x %s", code[1], OP_names[*code]); - code++; - break; - - case OP_COND: - fprintf(outfile, "%3d Cond", (code[1] << 8) + code[2]); - code += 2; - break; - - case OP_CREF: - fprintf(outfile, " %.2d %s", code[1], OP_names[*code]); - code++; - break; - - case OP_CHARS: - charlength = *(++code); - fprintf(outfile, "%3d ", charlength); - while (charlength-- > 0) - if (isprint(c = *(++code))) fprintf(outfile, "%c", c); - else fprintf(outfile, "\x%02x", c); - break; - - case OP_KETRMAX: - case OP_KETRMIN: - case OP_ALT: - case OP_KET: - case OP_ASSERT: - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - case OP_ONCE: - fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]); - code += 2; - break; - - case OP_REVERSE: - fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]); - code += 2; - break; - - case OP_STAR: - case OP_MINSTAR: - case OP_PLUS: - case OP_MINPLUS: - case OP_QUERY: - case OP_MINQUERY: - case OP_TYPESTAR: - case OP_TYPEMINSTAR: - case OP_TYPEPLUS: - case OP_TYPEMINPLUS: - case OP_TYPEQUERY: - case OP_TYPEMINQUERY: - if (*code >= OP_TYPESTAR) - fprintf(outfile, " %s", OP_names[code[1]]); - else if (isprint(c = code[1])) fprintf(outfile, " %c", c); - else fprintf(outfile, " \x%02x", c); - fprintf(outfile, "%s", OP_names[*code++]); - break; - - case OP_EXACT: - case OP_UPTO: - case OP_MINUPTO: - if (isprint(c = code[3])) fprintf(outfile, " %c{", c); - else fprintf(outfile, " \x%02x{", c); - if (*code != OP_EXACT) fprintf(outfile, ","); - fprintf(outfile, "%d}", (code[1] << 8) + code[2]); - if (*code == OP_MINUPTO) fprintf(outfile, "?"); - code += 3; - break; - - case OP_TYPEEXACT: - case OP_TYPEUPTO: - case OP_TYPEMINUPTO: - fprintf(outfile, " %s{", OP_names[code[3]]); - if (*code != OP_TYPEEXACT) fprintf(outfile, "0,"); - fprintf(outfile, "%d}", (code[1] << 8) + code[2]); - if (*code == OP_TYPEMINUPTO) fprintf(outfile, "?"); - code += 3; - break; - - case OP_NOT: - if (isprint(c = *(++code))) fprintf(outfile, " [^%c]", c); - else fprintf(outfile, " [^\x%02x]", c); - break; - - case OP_NOTSTAR: - case OP_NOTMINSTAR: - case OP_NOTPLUS: - case OP_NOTMINPLUS: - case OP_NOTQUERY: - case OP_NOTMINQUERY: - if (isprint(c = code[1])) fprintf(outfile, " [^%c]", c); - else fprintf(outfile, " [^\x%02x]", c); - fprintf(outfile, "%s", OP_names[*code++]); - break; - - case OP_NOTEXACT: - case OP_NOTUPTO: - case OP_NOTMINUPTO: - if (isprint(c = code[3])) fprintf(outfile, " [^%c]{", c); - else fprintf(outfile, " [^\x%02x]{", c); - if (*code != OP_NOTEXACT) fprintf(outfile, ","); - fprintf(outfile, "%d}", (code[1] << 8) + code[2]); - if (*code == OP_NOTMINUPTO) fprintf(outfile, "?"); - code += 3; - break; - - case OP_REF: - fprintf(outfile, " \%d", *(++code)); - code++; - goto CLASS_REF_REPEAT; - - case OP_CLASS: - { - int i, min, max; - code++; - fprintf(outfile, " ["); - - for (i = 0; i < 256; i++) - { - if ((code[i/8] & (1 << (i&7))) != 0) - { - int j; - for (j = i+1; j < 256; j++) - if ((code[j/8] & (1 << (j&7))) == 0) break; - if (i == '-' || i == ']') fprintf(outfile, "\"); - if (isprint(i)) fprintf(outfile, "%c", i); else fprintf(outfile, "\x%02x", i); - if (--j > i) - { - fprintf(outfile, "-"); - if (j == '-' || j == ']') fprintf(outfile, "\"); - if (isprint(j)) fprintf(outfile, "%c", j); else fprintf(outfile, "\x%02x", j); - } - i = j; - } - } - fprintf(outfile, "]"); - code += 32; - - CLASS_REF_REPEAT: - - switch(*code) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRPLUS: - case OP_CRMINPLUS: - case OP_CRQUERY: - case OP_CRMINQUERY: - fprintf(outfile, "%s", OP_names[*code]); - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - min = (code[1] << 8) + code[2]; - max = (code[3] << 8) + code[4]; - if (max == 0) fprintf(outfile, "{%d,}", min); - else fprintf(outfile, "{%d,%d}", min, max); - if (*code == OP_CRMINRANGE) fprintf(outfile, "?"); - code += 4; - break; - - default: - code--; - } - } - break; - - /* Anything else is just a one-node item */ - - default: - fprintf(outfile, " %s", OP_names[*code]); - break; - } - - code++; - fprintf(outfile, "\n"); - } -} - - - -/* Character string printing function. A "normal" and a UTF-8 version. */ - -static void pchars(unsigned char *p, int length, int utf8) -{ -int c; -while (length-- > 0) - { - if (utf8) - { - int rc = utf82ord(p, &c); - if (rc > 0) - { - length -= rc - 1; - p += rc; - if (c < 256 && isprint(c)) fprintf(outfile, "%c", c); - else fprintf(outfile, "\x{%02x}", c); - continue; - } - } - - /* Not UTF-8, or malformed UTF-8 */ - - if (isprint(c = *(p++))) fprintf(outfile, "%c", c); - else fprintf(outfile, "\x%02x", c); - } -} - - - -/* Alternative malloc function, to test functionality and show the size of the -compiled re. */ - -static void *new_malloc(size_t size) -{ -gotten_store = size; -if (log_store) - fprintf(outfile, "Memory allocation (code space): %d\n", - (int)((int)size - offsetof(real_pcre, code[0]))); -return malloc(size); -} - - - - -/* Get one piece of information from the pcre_fullinfo() function */ - -static void new_info(pcre *re, pcre_extra *study, int option, void *ptr) -{ -int rc; -if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0) - fprintf(outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option); -} - - - - -/* Read lines from named file or stdin and write to named file or stdout; lines -consist of a regular expression, in delimiters and optionally followed by -options, followed by a set of test data, terminated by an empty line. */ - -int main(int argc, char **argv) -{ -FILE *infile = stdin; -int options = 0; -int study_options = 0; -int op = 1; -int timeit = 0; -int showinfo = 0; -int showstore = 0; -int posix = 0; -int debug = 0; -int done = 0; -unsigned char buffer[30000]; -unsigned char dbuffer[1024]; - -/* Static so that new_malloc can use it. */ - -outfile = stdout; - -/* Scan options */ - -while (argc > 1 && argv[op][0] == '-') - { - if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0) - showstore = 1; - else if (strcmp(argv[op], "-t") == 0) timeit = 1; - else if (strcmp(argv[op], "-i") == 0) showinfo = 1; - else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1; - else if (strcmp(argv[op], "-p") == 0) posix = 1; - else - { - printf("*** Unknown option %s\n", argv[op]); - printf("Usage: pcretest [-d] [-i] [-p] [-s] [-t] [<input> [<output>]]\n"); - printf(" -d debug: show compiled code; implies -i\n" - " -i show information about compiled pattern\n" - " -p use POSIX interface\n" - " -s output store information\n" - " -t time compilation and execution\n"); - return 1; - } - op++; - argc--; - } - -/* Sort out the input and output files */ - -if (argc > 1) - { - infile = fopen(argv[op], "r"); - if (infile == NULL) - { - printf("** Failed to open %s\n", argv[op]); - return 1; - } - } - -if (argc > 2) - { - outfile = fopen(argv[op+1], "w"); - if (outfile == NULL) - { - printf("** Failed to open %s\n", argv[op+1]); - return 1; - } - } - -/* Set alternative malloc function */ - -pcre_malloc = new_malloc; - -/* Heading line, then prompt for first regex if stdin */ - -fprintf(outfile, "PCRE version %s\n\n", pcre_version()); - -/* Main loop */ - -while (!done) - { - pcre *re = NULL; - pcre_extra *extra = NULL; - -#if !defined NOPOSIX /* There are still compilers that require no indent */ - regex_t preg; - int do_posix = 0; -#endif - - const char *error; - unsigned char *p, *pp, *ppp; - unsigned const char *tables = NULL; - int do_study = 0; - int do_debug = debug; - int do_G = 0; - int do_g = 0; - int do_showinfo = showinfo; - int do_showrest = 0; - int utf8 = 0; - int erroroffset, len, delimiter; - - if (infile == stdin) printf(" re> "); - if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) break; - if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); - - p = buffer; - while (isspace(*p)) p++; - if (*p == 0) continue; - - /* Get the delimiter and seek the end of the pattern; if is isn't - complete, read more. */ - - delimiter = *p++; - - if (isalnum(delimiter) || delimiter == '\') - { - fprintf(outfile, "** Delimiter must not be alphameric or \\n"); - goto SKIP_DATA; - } - - pp = p; - - for(;;) - { - while (*pp != 0) - { - if (*pp == '\' && pp[1] != 0) pp++; - else if (*pp == delimiter) break; - pp++; - } - if (*pp != 0) break; - - len = sizeof(buffer) - (pp - buffer); - if (len < 256) - { - fprintf(outfile, "** Expression too long - missing delimiter?\n"); - goto SKIP_DATA; - } - - if (infile == stdin) printf(" > "); - if (fgets((char *)pp, len, infile) == NULL) - { - fprintf(outfile, "** Unexpected EOF\n"); - done = 1; - goto CONTINUE; - } - if (infile != stdin) fprintf(outfile, "%s", (char *)pp); - } - - /* If the first character after the delimiter is backslash, make - the pattern end with backslash. This is purely to provide a way - of testing for the error message when a pattern ends with backslash. */ - - if (pp[1] == '\') *pp++ = '\'; - - /* Terminate the pattern at the delimiter */ - - *pp++ = 0; - - /* Look for options after final delimiter */ - - options = 0; - study_options = 0; - log_store = showstore; /* default from command line */ - - while (*pp != 0) - { - switch (*pp++) - { - case 'g': do_g = 1; break; - case 'i': options |= PCRE_CASELESS; break; - case 'm': options |= PCRE_MULTILINE; break; - case 's': options |= PCRE_DOTALL; break; - case 'x': options |= PCRE_EXTENDED; break; - - case '+': do_showrest = 1; break; - case 'A': options |= PCRE_ANCHORED; break; - case 'D': do_debug = do_showinfo = 1; break; - case 'E': options |= PCRE_DOLLAR_ENDONLY; break; - case 'G': do_G = 1; break; - case 'I': do_showinfo = 1; break; - case 'M': log_store = 1; break; - -#if !defined NOPOSIX - case 'P': do_posix = 1; break; -#endif - - case 'S': do_study = 1; break; - case 'U': options |= PCRE_UNGREEDY; break; - case 'X': options |= PCRE_EXTRA; break; - case '8': options |= PCRE_UTF8; utf8 = 1; break; - - case 'L': - ppp = pp; - while (*ppp != '\n' && *ppp != ' ') ppp++; - *ppp = 0; - if (setlocale(LC_CTYPE, (const char *)pp) == NULL) - { - fprintf(outfile, "** Failed to set locale "%s"\n", pp); - goto SKIP_DATA; - } - tables = pcre_maketables(); - pp = ppp; - break; - - case '\n': case ' ': break; - default: - fprintf(outfile, "** Unknown option '%c'\n", pp[-1]); - goto SKIP_DATA; - } - } - - /* Handle compiling via the POSIX interface, which doesn't support the - timing, showing, or debugging options, nor the ability to pass over - local character tables. */ - -#if !defined NOPOSIX - if (posix || do_posix) - { - int rc; - int cflags = 0; - if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE; - if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE; - rc = regcomp(&preg, (char *)p, cflags); - - /* Compilation failed; go back for another re, skipping to blank line - if non-interactive. */ - - if (rc != 0) - { - (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer)); - fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer); - goto SKIP_DATA; - } - } - - /* Handle compiling via the native interface */ - - else -#endif /* !defined NOPOSIX */ - - { - if (timeit) - { - register int i; - clock_t time_taken; - clock_t start_time = clock(); - for (i = 0; i < LOOPREPEAT; i++) - { - re = pcre_compile((char *)p, options, &error, &erroroffset, tables); - if (re != NULL) free(re); - } - time_taken = clock() - start_time; - fprintf(outfile, "Compile time %.3f milliseconds\n", - ((double)time_taken * 1000.0) / - ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC)); - } - - re = pcre_compile((char *)p, options, &error, &erroroffset, tables); - - /* Compilation failed; go back for another re, skipping to blank line - if non-interactive. */ - - if (re == NULL) - { - fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset); - SKIP_DATA: - if (infile != stdin) - { - for (;;) - { - if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) - { - done = 1; - goto CONTINUE; - } - len = (int)strlen((char *)buffer); - while (len > 0 && isspace(buffer[len-1])) len--; - if (len == 0) break; - } - fprintf(outfile, "\n"); - } - goto CONTINUE; - } - - /* Compilation succeeded; print data if required. There are now two - info-returning functions. The old one has a limited interface and - returns only limited data. Check that it agrees with the newer one. */ - - if (do_showinfo) - { - int old_first_char, old_options, old_count; - int count, backrefmax, first_char, need_char; - size_t size; - - if (do_debug) print_internals(re); - - new_info(re, NULL, PCRE_INFO_OPTIONS, &options); - new_info(re, NULL, PCRE_INFO_SIZE, &size); - new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count); - new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax); - new_info(re, NULL, PCRE_INFO_FIRSTCHAR, &first_char); - new_info(re, NULL, PCRE_INFO_LASTLITERAL, &need_char); - - old_count = pcre_info(re, &old_options, &old_first_char); - if (count < 0) fprintf(outfile, - "Error %d from pcre_info()\n", count); - else - { - if (old_count != count) fprintf(outfile, - "Count disagreement: pcre_fullinfo=%d pcre_info=%d\n", count, - old_count); - - if (old_first_char != first_char) fprintf(outfile, - "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n", - first_char, old_first_char); - - if (old_options != options) fprintf(outfile, - "Options disagreement: pcre_fullinfo=%d pcre_info=%d\n", options, - old_options); - } - - if (size != gotten_store) fprintf(outfile, - "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n", - size, gotten_store); - - fprintf(outfile, "Capturing subpattern count = %d\n", count); - if (backrefmax > 0) - fprintf(outfile, "Max back reference = %d\n", backrefmax); - if (options == 0) fprintf(outfile, "No options\n"); - else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s\n", - ((options & PCRE_ANCHORED) != 0)? " anchored" : "", - ((options & PCRE_CASELESS) != 0)? " caseless" : "", - ((options & PCRE_EXTENDED) != 0)? " extended" : "", - ((options & PCRE_MULTILINE) != 0)? " multiline" : "", - ((options & PCRE_DOTALL) != 0)? " dotall" : "", - ((options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "", - ((options & PCRE_EXTRA) != 0)? " extra" : "", - ((options & PCRE_UNGREEDY) != 0)? " ungreedy" : "", - ((options & PCRE_UTF8) != 0)? " utf8" : ""); - - if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0) - fprintf(outfile, "Case state changes\n"); - - if (first_char == -1) - { - fprintf(outfile, "First char at start or follows \n\n"); - } - else if (first_char < 0) - { - fprintf(outfile, "No first char\n"); - } - else - { - if (isprint(first_char)) - fprintf(outfile, "First char = '%c'\n", first_char); - else - fprintf(outfile, "First char = %d\n", first_char); - } - - if (need_char < 0) - { - fprintf(outfile, "No need char\n"); - } - else - { - if (isprint(need_char)) - fprintf(outfile, "Need char = '%c'\n", need_char); - else - fprintf(outfile, "Need char = %d\n", need_char); - } - } - - /* If /S was present, study the regexp to generate additional info to - help with the matching. */ - - if (do_study) - { - if (timeit) - { - register int i; - clock_t time_taken; - clock_t start_time = clock(); - for (i = 0; i < LOOPREPEAT; i++) - extra = pcre_study(re, study_options, &error); - time_taken = clock() - start_time; - if (extra != NULL) free(extra); - fprintf(outfile, " Study time %.3f milliseconds\n", - ((double)time_taken * 1000.0)/ - ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC)); - } - - extra = pcre_study(re, study_options, &error); - if (error != NULL) - fprintf(outfile, "Failed to study: %s\n", error); - else if (extra == NULL) - fprintf(outfile, "Study returned NULL\n"); - - else if (do_showinfo) - { - uschar *start_bits = NULL; - new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits); - if (start_bits == NULL) - fprintf(outfile, "No starting character set\n"); - else - { - int i; - int c = 24; - fprintf(outfile, "Starting character set: "); - for (i = 0; i < 256; i++) - { - if ((start_bits[i/8] & (1<<(i%8))) != 0) - { - if (c > 75) - { - fprintf(outfile, "\n "); - c = 2; - } - if (isprint(i) && i != ' ') - { - fprintf(outfile, "%c ", i); - c += 2; - } - else - { - fprintf(outfile, "\x%02x ", i); - c += 5; - } - } - } - fprintf(outfile, "\n"); - } - } - } - } - - /* Read data lines and test them */ - - for (;;) - { - unsigned char *q; - unsigned char *bptr = dbuffer; - int count, c; - int copystrings = 0; - int getstrings = 0; - int getlist = 0; - int gmatched = 0; - int start_offset = 0; - int g_notempty = 0; - int offsets[45]; - int size_offsets = sizeof(offsets)/sizeof(int); - - options = 0; - - if (infile == stdin) printf("data> "); - if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) - { - done = 1; - goto CONTINUE; - } - if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); - - len = (int)strlen((char *)buffer); - while (len > 0 && isspace(buffer[len-1])) len--; - buffer[len] = 0; - if (len == 0) break; - - p = buffer; - while (isspace(*p)) p++; - - q = dbuffer; - while ((c = *p++) != 0) - { - int i = 0; - int n = 0; - if (c == '\') switch ((c = *p++)) - { - case 'a': c = 7; break; - case 'b': c = '\b'; break; - case 'e': c = 27; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\v'; break; - - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - c -= '0'; - while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9') - c = c * 8 + *p++ - '0'; - break; - - case 'x': - - /* Handle \x{..} specially - new Perl thing for utf8 */ - - if (*p == '{') - { - unsigned char *pt = p; - c = 0; - while (isxdigit(*(++pt))) - c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W'); - if (*pt == '}') - { - unsigned char buffer[8]; - int ii, utn; - utn = ord2utf8(c, buffer); - for (ii = 0; ii < utn - 1; ii++) *q++ = buffer[ii]; - c = buffer[ii]; /* Last byte */ - p = pt + 1; - break; - } - /* Not correct form; fall through */ - } - - /* Ordinary \x */ - - c = 0; - while (i++ < 2 && isxdigit(*p)) - { - c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W'); - p++; - } - break; - - case 0: /* Allows for an empty line */ - p--; - continue; - - case 'A': /* Option setting */ - options |= PCRE_ANCHORED; - continue; - - case 'B': - options |= PCRE_NOTBOL; - continue; - - case 'C': - while(isdigit(*p)) n = n * 10 + *p++ - '0'; - copystrings |= 1 << n; - continue; - - case 'G': - while(isdigit(*p)) n = n * 10 + *p++ - '0'; - getstrings |= 1 << n; - continue; - - case 'L': - getlist = 1; - continue; - - case 'N': - options |= PCRE_NOTEMPTY; - continue; - - case 'O': - while(isdigit(*p)) n = n * 10 + *p++ - '0'; - if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n; - continue; - - case 'Z': - options |= PCRE_NOTEOL; - continue; - } - *q++ = c; - } - *q = 0; - len = q - dbuffer; - - /* Handle matching via the POSIX interface, which does not - support timing. */ - -#if !defined NOPOSIX - if (posix || do_posix) - { - int rc; - int eflags = 0; - regmatch_t pmatch[sizeof(offsets)/sizeof(int)]; - if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL; - if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL; - - rc = regexec(&preg, (const char *)bptr, size_offsets, pmatch, eflags); - - if (rc != 0) - { - (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer)); - fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer); - } - else - { - size_t i; - for (i = 0; i < size_offsets; i++) - { - if (pmatch[i].rm_so >= 0) - { - fprintf(outfile, "%2d: ", (int)i); - pchars(dbuffer + pmatch[i].rm_so, - pmatch[i].rm_eo - pmatch[i].rm_so, utf8); - fprintf(outfile, "\n"); - if (i == 0 && do_showrest) - { - fprintf(outfile, " 0+ "); - pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, utf8); - fprintf(outfile, "\n"); - } - } - } - } - } - - /* Handle matching via the native interface - repeats for /g and /G */ - - else -#endif /* !defined NOPOSIX */ - - for (;; gmatched++) /* Loop for /g or /G */ - { - if (timeit) - { - register int i; - clock_t time_taken; - clock_t start_time = clock(); - for (i = 0; i < LOOPREPEAT; i++) - count = pcre_exec(re, extra, (char *)bptr, len, - start_offset, options | g_notempty, offsets, size_offsets); - time_taken = clock() - start_time; - fprintf(outfile, "Execute time %.3f milliseconds\n", - ((double)time_taken * 1000.0)/ - ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC)); - } - - count = pcre_exec(re, extra, (char *)bptr, len, - start_offset, options | g_notempty, offsets, size_offsets); - - if (count == 0) - { - fprintf(outfile, "Matched, but too many substrings\n"); - count = size_offsets/3; - } - - /* Matched */ - - if (count >= 0) - { - int i; - for (i = 0; i < count * 2; i += 2) - { - if (offsets[i] < 0) - fprintf(outfile, "%2d: <unset>\n", i/2); - else - { - fprintf(outfile, "%2d: ", i/2); - pchars(bptr + offsets[i], offsets[i+1] - offsets[i], utf8); - fprintf(outfile, "\n"); - if (i == 0) - { - if (do_showrest) - { - fprintf(outfile, " 0+ "); - pchars(bptr + offsets[i+1], len - offsets[i+1], utf8); - fprintf(outfile, "\n"); - } - } - } - } - - for (i = 0; i < 32; i++) - { - if ((copystrings & (1 << i)) != 0) - { - char copybuffer[16]; - int rc = pcre_copy_substring((char *)bptr, offsets, count, - i, copybuffer, sizeof(copybuffer)); - if (rc < 0) - fprintf(outfile, "copy substring %d failed %d\n", i, rc); - else - fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc); - } - } - - for (i = 0; i < 32; i++) - { - if ((getstrings & (1 << i)) != 0) - { - const char *substring; - int rc = pcre_get_substring((char *)bptr, offsets, count, - i, &substring); - if (rc < 0) - fprintf(outfile, "get substring %d failed %d\n", i, rc); - else - { - fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc); - /* free((void *)substring); */ - pcre_free_substring(substring); - } - } - } - - if (getlist) - { - const char **stringlist; - int rc = pcre_get_substring_list((char *)bptr, offsets, count, - &stringlist); - if (rc < 0) - fprintf(outfile, "get substring list failed %d\n", rc); - else - { - for (i = 0; i < count; i++) - fprintf(outfile, "%2dL %s\n", i, stringlist[i]); - if (stringlist[i] != NULL) - fprintf(outfile, "string list not terminated by NULL\n"); - /* free((void *)stringlist); */ - pcre_free_substring_list(stringlist); - } - } - } - - /* Failed to match. If this is a /g or /G loop and we previously set - g_notempty after a null match, this is not necessarily the end. - We want to advance the start offset, and continue. Fudge the offset - values to achieve this. We won't be at the end of the string - that - was checked before setting g_notempty. */ - - else - { - if (g_notempty != 0) - { - offsets[0] = start_offset; - offsets[1] = start_offset + 1; - } - else - { - if (gmatched == 0) /* Error if no previous matches */ - { - if (count == -1) fprintf(outfile, "No match\n"); - else fprintf(outfile, "Error %d\n", count); - } - break; /* Out of the /g loop */ - } - } - - /* If not /g or /G we are done */ - - if (!do_g && !do_G) break; - - /* If we have matched an empty string, first check to see if we are at - the end of the subject. If so, the /g loop is over. Otherwise, mimic - what Perl's /g options does. This turns out to be rather cunning. First - we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the - same point. If this fails (picked up above) we advance to the next - character. */ - - g_notempty = 0; - if (offsets[0] == offsets[1]) - { - if (offsets[0] == len) break; - g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED; - } - - /* For /g, update the start offset, leaving the rest alone */ - - if (do_g) start_offset = offsets[1]; - - /* For /G, update the pointer and length */ - - else - { - bptr += offsets[1]; - len -= offsets[1]; - } - } /* End of loop for /g and /G */ - } /* End of loop for data lines */ - - CONTINUE: - -#if !defined NOPOSIX - if (posix || do_posix) regfree(&preg); -#endif - - if (re != NULL) free(re); - if (extra != NULL) free(extra); - if (tables != NULL) - { - free((void *)tables); - setlocale(LC_CTYPE, "C"); - } - } - -fprintf(outfile, "\n"); -return 0; -} - -/* End */ diff --git a/external/privoxy/pcre/study.c b/external/privoxy/pcre/study.c deleted file mode 100644 index 676db94..0000000 --- a/external/privoxy/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 ph10@cam.ac.uk - - Copyright (c) 1997-2000 University of Cambridge - ------------------------------------------------------------------------------ -Permission is granted to anyone to use this software for any purpose on any -computer system, and to redistribute it freely, subject to the following -restrictions: - -1. This software is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -2. The origin of this software must not be misrepresented, either by - explicit claim or by omission. - -3. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -4. If PCRE is embedded in any software that is released under the GNU - General Purpose Licence (GPL), then the terms of that licence shall - supersede any condition above with which it is incompatible. ------------------------------------------------------------------------------ -*/ - - -/* Include the internals header, which itself includes Standard C headers plus -the external pcre header. */ - -#include "internal.h" - - - -/************************************************* -* Set a bit and maybe its alternate case * -*************************************************/ - -/* Given a character, set its bit in the table, and also the bit for the other -version of a letter if we are caseless. - -Arguments: - start_bits points to the bit map - c is the character - caseless the caseless flag - cd the block with char table pointers - -Returns: nothing -*/ - -static void -set_bit(uschar *start_bits, int c, BOOL caseless, compile_data *cd) -{ -start_bits[c/8] |= (1 << (c&7)); -if (caseless && (cd->ctypes[c] & ctype_letter) != 0) - start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7)); -} - - - -/************************************************* -* Create bitmap of starting chars * -*************************************************/ - -/* This function scans a compiled unanchored expression and attempts to build a -bitmap of the set of initial characters. If it can't, it returns FALSE. As time -goes by, we may be able to get more clever at doing this. - -Arguments: - code points to an expression - start_bits points to a 32-byte table, initialized to 0 - caseless the current state of the caseless flag - cd the block with char table pointers - -Returns: TRUE if table built, FALSE otherwise -*/ - -static BOOL -set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless, - compile_data *cd) -{ -register int c; - -/* This next statement and the later reference to dummy are here in order to -trick the optimizer of the IBM C compiler for OS/2 into generating correct -code. Apparently IBM isn't going to fix the problem, and we would rather not -disable optimization (in this module it actually makes a big difference, and -the pcre module can use all the optimization it can get). */ - -volatile int dummy; - -do - { - const uschar *tcode = code + 3; - BOOL try_next = TRUE; - - while (try_next) - { - try_next = FALSE; - - /* If a branch starts with a bracket or a positive lookahead assertion, - recurse to set bits from within them. That's all for this branch. */ - - if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT) - { - if (!set_start_bits(tcode, start_bits, caseless, cd)) - return FALSE; - } - - else switch(*tcode) - { - default: - return FALSE; - - /* Skip over lookbehind and negative lookahead assertions */ - - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - try_next = TRUE; - do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT); - tcode += 3; - break; - - /* Skip over an option setting, changing the caseless flag */ - - case OP_OPT: - caseless = (tcode[1] & PCRE_CASELESS) != 0; - tcode += 2; - try_next = TRUE; - break; - - /* BRAZERO does the bracket, but carries on. */ - - case OP_BRAZERO: - case OP_BRAMINZERO: - if (!set_start_bits(++tcode, start_bits, caseless, cd)) - return FALSE; - dummy = 1; - do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT); - tcode += 3; - try_next = TRUE; - break; - - /* Single-char * or ? sets the bit and tries the next item */ - - case OP_STAR: - case OP_MINSTAR: - case OP_QUERY: - case OP_MINQUERY: - set_bit(start_bits, tcode[1], caseless, cd); - tcode += 2; - try_next = TRUE; - break; - - /* Single-char upto sets the bit and tries the next */ - - case OP_UPTO: - case OP_MINUPTO: - set_bit(start_bits, tcode[3], caseless, cd); - tcode += 4; - try_next = TRUE; - break; - - /* At least one single char sets the bit and stops */ - - case OP_EXACT: /* Fall through */ - tcode++; - - case OP_CHARS: /* Fall through */ - tcode++; - - case OP_PLUS: - case OP_MINPLUS: - set_bit(start_bits, tcode[1], caseless, cd); - break; - - /* Single character type sets the bits and stops */ - - case OP_NOT_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_digit]; - break; - - case OP_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_digit]; - break; - - case OP_NOT_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_space]; - break; - - case OP_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_space]; - break; - - case OP_NOT_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_word]; - break; - - case OP_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_word]; - break; - - /* One or more character type fudges the pointer and restarts, knowing - it will hit a single character type and stop there. */ - - case OP_TYPEPLUS: - case OP_TYPEMINPLUS: - tcode++; - try_next = TRUE; - break; - - case OP_TYPEEXACT: - tcode += 3; - try_next = TRUE; - break; - - /* Zero or more repeats of character types set the bits and then - try again. */ - - case OP_TYPEUPTO: - case OP_TYPEMINUPTO: - tcode += 2; /* Fall through */ - - case OP_TYPESTAR: - case OP_TYPEMINSTAR: - case OP_TYPEQUERY: - case OP_TYPEMINQUERY: - switch(tcode[1]) - { - case OP_NOT_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_digit]; - break; - - case OP_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_digit]; - break; - - case OP_NOT_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_space]; - break; - - case OP_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_space]; - break; - - case OP_NOT_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_word]; - break; - - case OP_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_word]; - break; - } - - tcode += 2; - try_next = TRUE; - break; - - /* Character class: set the bits and either carry on or not, - according to the repeat count. */ - - case OP_CLASS: - { - tcode++; - for (c = 0; c < 32; c++) start_bits[c] |= tcode[c]; - tcode += 32; - switch (*tcode) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRQUERY: - case OP_CRMINQUERY: - tcode++; - try_next = TRUE; - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - if (((tcode[1] << 8) + tcode[2]) == 0) - { - tcode += 5; - try_next = TRUE; - } - break; - } - } - break; /* End of class handling */ - - } /* End of switch */ - } /* End of try_next loop */ - - code += (code[1] << 8) + code[2]; /* Advance to next branch */ - } -while (*code == OP_ALT); -return TRUE; -} - - - -/************************************************* -* Study a compiled expression * -*************************************************/ - -/* This function is handed a compiled expression that it must study to produce -information that will speed up the matching. It returns a pcre_extra block -which then gets handed back to pcre_exec(). - -Arguments: - re points to the compiled expression - options contains option bits - errorptr points to where to place error messages; - set NULL unless error - -Returns: pointer to a pcre_extra block, - NULL on error or if no optimization possible -*/ - -pcre_extra * -pcre_study(const pcre *external_re, int options, const char **errorptr) -{ -uschar start_bits[32]; -real_pcre_extra *extra; -const real_pcre *re = (const real_pcre *)external_re; -compile_data compile_block; - -*errorptr = NULL; - -if (re == NULL || re->magic_number != MAGIC_NUMBER) - { - *errorptr = "argument is not a compiled regular expression"; - return NULL; - } - -if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) - { - *errorptr = "unknown or incorrect option bit(s) set"; - return NULL; - } - -/* For an anchored pattern, or an unchored pattern that has a first char, or a -multiline pattern that matches only at "line starts", no further processing at -present. */ - -if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) - return NULL; - -/* Set the character tables in the block which is passed around */ - -compile_block.lcc = re->tables + lcc_offset; -compile_block.fcc = re->tables + fcc_offset; -compile_block.cbits = re->tables + cbits_offset; -compile_block.ctypes = re->tables + ctypes_offset; - -/* See if we can find a fixed set of initial characters for the pattern. */ - -memset(start_bits, 0, 32 * sizeof(uschar)); -if (!set_start_bits(re->code, start_bits, (re->options & PCRE_CASELESS) != 0, - &compile_block)) return NULL; - -/* Get an "extra" block and put the information therein. */ - -extra = (real_pcre_extra *)(pcre_malloc)(sizeof(real_pcre_extra)); - -if (extra == NULL) - { - *errorptr = "failed to get memory"; - return NULL; - } - -extra->options = PCRE_STUDY_MAPPED; -memcpy(extra->start_bits, start_bits, sizeof(start_bits)); - -return (pcre_extra *)extra; -} - -/* End of study.c */ diff --git a/external/privoxy/pcre/vc_dftables.dsp b/external/privoxy/pcre/vc_dftables.dsp deleted file mode 100755 index 60404f8..0000000 --- a/external/privoxy/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=..\vc_config_pthreads.h - -!IF "$(CFG)" == "vc_dftables - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Copying vc_config_pthreads.h -WkspDir=. -InputPath=..\vc_config_pthreads.h - -"$(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 vc_config_pthreads.h -WkspDir=. -InputPath=..\vc_config_pthreads.h - -"$(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=..\vc_config_winthreads.h - -!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 vc_config_winthreads.h -WkspDir=. -InputPath=..\vc_config_winthreads.h - -"$(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 vc_config_winthreads.h -WkspDir=. -InputPath=..\vc_config_winthreads.h - -"$(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/external/privoxy/pcrs.c b/external/privoxy/pcrs.c deleted file mode 100644 index 1946ca7..0000000 --- a/external/privoxy/pcrs.c +++ /dev/null @@ -1,1317 +0,0 @@ -const char pcrs_rcs[] = "$Id: pcrs.c,v 1.29 2007/09/22 16:17:19 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/pcrs.c,v $ - * - * Purpose : pcrs is a supplement to the pcre library by Philip Hazel - * ph10@cam.ac.uk and adds Perl-style substitution. That - * is, it mimics Perl's 's' operator. See pcrs(3) for details. - * - * WARNING: This file contains additional functions and bug - * fixes that aren't part of the latest official pcrs package - * (which apparently is no longer maintained). - * - * Copyright : Written and Copyright (C) 2000, 2001 by Andreas S. Oesterhelt - * andreas@oesterhelt.org - * - * Copyright (C) 2006, 2007 Fabian Keil fk@fabiankeil.de - * - * 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. - * - * 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. - * - * 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 - * 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.29 2007/09/22 16:17:19 fabiankeil - * Move our includes below system includes to prevent macro conflicts. - * - * Revision 1.28 2007/08/18 14:37:27 fabiankeil - * Ditch hex_to_byte() in favour of xtoi(). - * - * Revision 1.27 2007/08/05 13:47:04 fabiankeil - * #1763173 from Stefan Huehner: s@const static@static const@. - * - * Revision 1.26 2007/07/01 13:29:54 fabiankeil - * Add limited hex notation support for the PCRS - * substitution text ('\x7e' = '~'). Closes #1627140. - * - * Revision 1.25 2007/04/30 15:02:18 fabiankeil - * Introduce dynamic pcrs jobs that can resolve variables. - * - * Revision 1.24 2007/01/05 15:46:12 fabiankeil - * Don't use strlen() to calculate the length of - * the pcrs substitutes. They don't have to be valid C - * strings and getting their length wrong can result in - * user-controlled memory corruption. - * - * Thanks to Felix Gröbert for reporting the problem - * and providing the fix [#1627140]. - * - * Revision 1.23 2006/12/29 17:53:05 fabiankeil - * Fixed gcc43 conversion warnings. - * - * Revision 1.22 2006/12/24 17:34:20 fabiankeil - * Add pcrs_strerror() message for PCRE_ERROR_MATCHLIMIT - * and give a hint why an error code might be unknown. - * - * Catch NULL subjects early in pcrs_execute(). - * - * Revision 1.21 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.19.2.4 2005/05/07 21:50:55 david__schmidt - * A few memory leaks plugged (mostly on error paths) - * - * Revision 1.19.2.3 2003/12/04 12:32:45 oes - * Append a trailing nullbyte to result to facilitate string processing - * - * Revision 1.19.2.2 2002/10/08 16:22:28 oes - * Bugfix: Need to check validity of backreferences explicitly, - * because when max_matches are reached and matches is expanded, - * realloc() does not zero the memory. Fixes Bug # 606227 - * - * Revision 1.19.2.1 2002/08/10 11:23:40 oes - * Include prce.h via project.h, where the appropriate - * source will have been selected - * - * Revision 1.19 2002/03/08 14:47:48 oes - * Cosmetics - * - * Revision 1.18 2002/03/08 14:17:14 oes - * Fixing -Wconversion warnings - * - * Revision 1.17 2002/03/08 13:45:48 oes - * Hiding internal functions - * - * Revision 1.16 2001/11/30 21:32:14 jongfoster - * Fixing signed/unsigned comparison (Andreas please check this!) - * One tab->space - * - * Revision 1.15 2001/09/20 16:11:06 steudten - * - * Add casting for some string functions. - * - * Revision 1.14 2001/09/09 21:41:57 oes - * Fixing yet another silly bug - * - * Revision 1.13 2001/09/06 14:05:59 oes - * Fixed silly bug - * - * Revision 1.12 2001/08/18 11:35:00 oes - * - Introduced pcrs_strerror() - * - made some NULL arguments non-fatal - * - added support for \n \r \e \b \t \f \a \0 in substitute - * - made quoting adhere to standard rules - * - added warning for bad backrefs - * - added pcrs_execute_list() - * - fixed comments - * - bugfix & cosmetics - * - * Revision 1.11 2001/08/15 15:32:03 oes - * - Added support for Perl's special variables $+, $' and $` - * - Improved the substitute parser - * - Replaced the hard limit for the maximum number of matches - * by dynamic reallocation - * - * Revision 1.10 2001/08/05 13:13:11 jongfoster - * Making parameters "const" where possible. - * - * Revision 1.9 2001/07/18 17:27:00 oes - * Changed interface; Cosmetics - * - * Revision 1.8 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * - * Revision 1.7 2001/06/29 13:33:04 oes - * - Cleaned up, renamed and reordered functions, - * improved comments - * - Removed my_strsep - * - Replaced globalflag with a general flags int - * that holds PCRS_GLOBAL, PCRS_SUCCESS, and PCRS_TRIVIAL - * - Introduced trivial option that will prevent pcrs - * from honouring backreferences in the substitute, - * which is useful for large substitutes that are - * red in from somewhere and saves the pain of escaping - * the backrefs - * - Introduced convenience function pcrs_free_joblist() - * - Split pcrs_make_job() into pcrs_compile(), which still - * takes a complete s/// comand as argument and parses it, - * and a new function pcrs_make_job, which takes the - * three separate components. This should make for a - * much friendlier frontend. - * - Removed create_pcrs_job() which was useless - * - Fixed a bug in pcrs_execute - * - Success flag is now handled by pcrs instead of user - * - * 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) - * - * Revision 1.4 2001/05/25 14:12:40 oes - * Fixed bug: Empty substitutes now detected - * - * Revision 1.3 2001/05/25 11:03:55 oes - * Added sanity check for NULL jobs to pcrs_exec_substitution - * - * Revision 1.2 2001/05/22 18:46:04 oes - * - * 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 (!). - * - * Revision 1.1.1.1 2001/05/15 13:59:02 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include <string.h> -#include <ctype.h> -#include <assert.h> - -/* - * Include project.h just so that the right pcre.h gets - * included from there - */ -#include "project.h" - -/* For snprintf only */ -#include "miscutil.h" -/* For xtoi */ -#include "encode.h" - -#include "pcrs.h" - -const char pcrs_h_rcs[] = PCRS_H_VERSION; - -/* - * Internal prototypes - */ - -static int pcrs_parse_perl_options(const char *optstring, int *flags); -static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, - int capturecount, int *errptr); -static int is_hex_sequence(const char *sequence); - -/********************************************************************* - * - * 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"; - -#ifdef PCRE_ERROR_MATCHLIMIT - /* - * Only reported by PCRE versions newer than our own. - */ - case PCRE_ERROR_MATCHLIMIT: return "(pcre:) Match limit reached"; -#endif /* def PCRE_ERROR_MATCHLIMIT */ - - /* 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"; - case PCRS_WARN_TRUNCATION: - return "(pcrs:) At least one variable was too big and has been truncated before compilation"; - - /* - * XXX: With the exception of PCRE_ERROR_MATCHLIMIT we - * only catch PCRE errors that can happen with our internal - * version. If Privoxy is linked against a newer - * PCRE version all bets are off ... - */ - default: return "Unknown error. Privoxy out of sync with PCRE?"; - } - } - /* error >= 0: No error */ - return "(pcrs:) Everything's just fine. Thanks for asking."; - -} - - -/********************************************************************* - * - * Function : pcrs_parse_perl_options - * - * Description : This function parses a string containing the options to - * Perl's s/// operator. It returns an integer that is the - * pcre equivalent of the symbolic optstring. - * Since pcre doesn't know about Perl's 'g' (global) or pcrs', - * 'T' (trivial) options but pcrs needs them, the corresponding - * flags are set if 'g'or 'T' is encountered. - * Note: The 'T' and 'U' options do not conform to Perl. - * - * Parameters : - * 1 : optstring = string with options in perl syntax - * 2 : flags = see description - * - * Returns : option integer suitable for pcre - * - *********************************************************************/ -static int pcrs_parse_perl_options(const char *optstring, int *flags) -{ - size_t i; - int rc = 0; - *flags = 0; - - if (NULL == optstring) return 0; - - for (i = 0; i < strlen(optstring); i++) - { - switch(optstring[i]) - { - case 'e': break; /* ToDo ;-) */ - case 'g': *flags |= PCRS_GLOBAL; break; - case 'i': rc |= PCRE_CASELESS; break; - case 'm': rc |= PCRE_MULTILINE; break; - case 'o': break; - case 's': rc |= PCRE_DOTALL; break; - case 'x': rc |= PCRE_EXTENDED; break; - case 'U': rc |= PCRE_UNGREEDY; break; - case 'T': *flags |= PCRS_TRIVIAL; break; - default: break; - } - } - return rc; - -} - - -/********************************************************************* - * - * Function : pcrs_compile_replacement - * - * Description : This function takes a Perl-style replacement (2nd argument - * to the s/// operator and returns a compiled pcrs_substitute, - * or NULL if memory allocation for the substitute structure - * fails. - * - * 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 - * conditions can be returned. - * - * Returns : pcrs_substitute data structure, or NULL if an - * error is encountered. In that case, *errptr has - * the reason. - * - *********************************************************************/ -static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, int capturecount, int *errptr) -{ - int i, k, l, quoted; - size_t length; - char *text; - pcrs_substitute *r; - - i = k = l = quoted = 0; - - /* - * Sanity check - */ - if (NULL == replacement) - { - replacement = ""; - } - - /* - * Get memory or fail - */ - if (NULL == (r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute)))) - { - *errptr = PCRS_ERR_NOMEM; - 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 = (int)length; - } - - /* - * Else, parse, cut out and record all backreferences - */ - else - { - while (i < (int)length) - { - /* Quoting */ - if (replacement[i] == '\') - { - if (quoted) - { - 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 if (is_hex_sequence(&replacement[i])) - { - /* - * Replace a hex sequence with a single - * character with the sequence's ascii value. - * e.g.: '\x7e' => '~' - */ - const int ascii_value = xtoi(&replacement[i+2]); - - assert(ascii_value > 0); - assert(ascii_value < 256); - text[k++] = (char)ascii_value; - i += 4; - } - else - { - quoted = 1; - i++; - } - } - continue; - } - - /* Backreferences */ - if (replacement[i] == '$' && !quoted && i < (int)(length - 1)) - { - char *symbol, symbols[] = "'`+&"; - r->block_length[l] = (size_t)(k - r->block_offset[l]); - - /* Numerical backreferences */ - if (isdigit((int)replacement[i + 1])) - { - 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; - } - } - - /* Symbolic backreferences: */ - else if (NULL != (symbol = strchr(symbols, replacement[i + 1]))) - { - - if (symbol - symbols == 2) /* $+ */ - { - r->backref[l] = capturecount; - } - else if (symbol - symbols == 3) /* $& */ - { - r->backref[l] = 0; - } - else /* $' or $` */ - { - r->backref[l] = PCRS_MAX_SUBMATCHES + 1 - (symbol - symbols); - } - 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 - { - *errptr = PCRS_WARN_BADREF; - } - continue; - } - -plainchar: - /* Plain chars are copied */ - text[k++] = replacement[i++]; - quoted = 0; - } - } /* -END- if (!trivialflag) */ - - /* - * Finish & return - */ - r->text = text; - r->backrefs = l; - r->length = (size_t)k; - r->block_length[l] = (size_t)(k - r->block_offset[l]); - - return r; - -} - - -/********************************************************************* - * - * Function : pcrs_free_job - * - * Description : Frees the memory used by a pcrs_job struct and its - * dependant structures. - * - * Parameters : - * 1 : job = pointer to the pcrs_job structure to be freed - * - * Returns : a pointer to the next job, if there was any, or - * NULL otherwise. - * - *********************************************************************/ -pcrs_job *pcrs_free_job(pcrs_job *job) -{ - pcrs_job *next; - - if (job == NULL) - { - return NULL; - } - else - { - next = job->next; - if (job->pattern != NULL) free(job->pattern); - if (job->hints != NULL) free(job->hints); - if (job->substitute != NULL) - { - if (job->substitute->text != NULL) free(job->substitute->text); - free(job->substitute); - } - free(job); - } - return next; - -} - - -/********************************************************************* - * - * Function : pcrs_free_joblist - * - * Description : Iterates through a chained list of pcrs_job's and - * frees them using pcrs_free_job. - * - * Parameters : - * 1 : joblist = pointer to the first pcrs_job structure to - * be freed - * - * Returns : N/A - * - *********************************************************************/ -void pcrs_free_joblist(pcrs_job *joblist) -{ - while ( NULL != (joblist = pcrs_free_job(joblist)) ) {}; - - return; - -} - - -/********************************************************************* - * - * Function : pcrs_compile_command - * - * 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. - * - * Parameters : - * 1 : command = string with perl-style s/// command - * 2 : errptr = pointer to an integer in which error - * conditions can be returned. - * - * Returns : a corresponding pcrs_job data structure, or NULL - * if an error was encountered. In that case, *errptr - * has the reason. - * - *********************************************************************/ -pcrs_job *pcrs_compile_command(const char *command, int *errptr) -{ - int i, k, l, quoted = FALSE; - size_t limit; - char delimiter; - char *tokens[4]; - pcrs_job *newjob; - - i = k = l = 0; - - /* - * Tokenize the perl command - */ - limit = strlen(command); - if (limit < 4) - { - *errptr = PCRS_ERR_CMDSYNTAX; - return NULL; - } - else - { - delimiter = command[1]; - } - - tokens[l] = (char *) malloc(limit + 1); - - for (i = 0; i <= (int)limit; i++) - { - - if (command[i] == delimiter && !quoted) - { - if (l == 3) - { - l = -1; - break; - } - tokens[0][k++] = '\0'; - tokens[++l] = tokens[0] + k; - continue; - } - - else if (command[i] == '\' && !quoted) - { - quoted = TRUE; - if (command[i+1] == delimiter) continue; - } - else - { - quoted = FALSE; - } - tokens[0][k++] = command[i]; - } - - /* - * Syntax error ? - */ - if (l != 3) - { - *errptr = PCRS_ERR_CMDSYNTAX; - free(tokens[0]); - return NULL; - } - - newjob = pcrs_compile(tokens[1], tokens[2], tokens[3], errptr); - free(tokens[0]); - return newjob; - -} - - -/********************************************************************* - * - * Function : pcrs_compile - * - * Description : Takes the three arguments to a perl s/// command - * and compiles a pcrs_job structure from them. - * - * Parameters : - * 1 : pattern = string with perl-style pattern - * 2 : substitute = string with perl-style substitute - * 3 : options = string with perl-style options - * 4 : errptr = pointer to an integer in which error - * conditions can be returned. - * - * Returns : a corresponding pcrs_job data structure, or NULL - * if an error was encountered. In that case, *errptr - * has the reason. - * - *********************************************************************/ -pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const 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 = ""; - - - /* - * Get and init memory - */ - if (NULL == (newjob = (pcrs_job *)malloc(sizeof(pcrs_job)))) - { - *errptr = PCRS_ERR_NOMEM; - return NULL; - } - memset(newjob, '\0', sizeof(pcrs_job)); - - - /* - * Evaluate the options - */ - newjob->options = pcrs_parse_perl_options(options, &flags); - newjob->flags = flags; - - - /* - * Compile the pattern - */ - newjob->pattern = pcre_compile(pattern, newjob->options, &error, errptr, NULL); - if (newjob->pattern == NULL) - { - pcrs_free_job(newjob); - return NULL; - } - - - /* - * Generate hints. This has little overhead, since the - * hints will be NULL for a boring pattern anyway. - */ - newjob->hints = pcre_study(newjob->pattern, 0, &error); - if (error != NULL) - { - *errptr = PCRS_ERR_STUDY; - pcrs_free_job(newjob); - return NULL; - } - - - /* - * 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))) - { - pcrs_free_job(newjob); - return NULL; - } - - return newjob; - -} - - -/********************************************************************* - * - * 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. - * - * Note: For convenient string handling, a null byte is - * appended to the result. It does not count towards the - * result_length, though. - * - * - * Parameters : - * 1 : joblist = the chained list of pcrs_jobs to be executed - * 2 : subject = the subject string - * 3 : subject_length = the subject's length - * 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 failure, the (negative) pcre error code describing the - * failure, 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 = NULL; - 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. - * - * Note: For convenient string handling, a null byte is - * appended to the result. It does not count towards the - * result_length, though. - * - * Parameters : - * 1 : job = the pcrs_job to be executed - * 2 : subject = the subject (== original) string - * 3 : subject_length = the subject's length - * 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 failure, the (negative) pcre error code describing the - * failure, which may be translated to text using pcrs_strerror(). - * - *********************************************************************/ -int pcrs_execute(pcrs_job *job, const char *subject, size_t subject_length, char **result, size_t *result_length) -{ - int offsets[3 * PCRS_MAX_SUBMATCHES], - offset, - i, k, - matches_found, - submatches, - max_matches = PCRS_MAX_MATCH_INIT; - size_t newsize; - pcrs_match *matches, *dummy; - char *result_offset; - - offset = i = k = 0; - - /* - * Sanity check & memory allocation - */ - if (job == NULL || job->pattern == NULL || job->substitute == NULL || NULL == subject) - { - *result = NULL; - return(PCRS_ERR_BADJOB); - } - - if (NULL == (matches = (pcrs_match *)malloc((size_t)max_matches * sizeof(pcrs_match)))) - { - *result = NULL; - return(PCRS_ERR_NOMEM); - } - memset(matches, '\0', (size_t)max_matches * sizeof(pcrs_match)); - - - /* - * Find the pattern and calculate the space - * requirements for the result - */ - newsize = subject_length; - - while ((submatches = pcre_exec(job->pattern, job->hints, subject, (int)subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0) - { - job->flags |= PCRS_SUCCESS; - matches[i].submatches = submatches; - - for (k = 0; k < submatches; k++) - { - matches[i].submatch_offset[k] = offsets[2 * k]; - - /* Note: Non-found optional submatches have length -1-(-1)==0 */ - matches[i].submatch_length[k] = (size_t)(offsets[2 * k + 1] - offsets[2 * k]); - - /* reserve mem for each submatch as often as it is ref'd */ - newsize += matches[i].submatch_length[k] * (size_t)job->substitute->backref_count[k]; - } - /* plus replacement text size minus match text size */ - newsize += job->substitute->length - matches[i].submatch_length[0]; - - /* chunk before match */ - matches[i].submatch_offset[PCRS_MAX_SUBMATCHES] = 0; - matches[i].submatch_length[PCRS_MAX_SUBMATCHES] = (size_t)offsets[0]; - newsize += (size_t)offsets[0] * (size_t)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 - (size_t)offsets[1] - 1; - newsize += (subject_length - (size_t)offsets[1]) * (size_t)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, (size_t)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; - - /* Don't loop on empty matches */ - if (offsets[1] == offset) - if ((size_t)offset < subject_length) - offset++; - else - break; - /* Go find the next one */ - else - offset = offsets[1]; - } - /* Pass pcre error through if (bad) failiure */ - if (submatches < PCRE_ERROR_NOMATCH) - { - free(matches); - return submatches; - } - matches_found = i; - - - /* - * Get memory for the result (must be freed by caller!) - * and append terminating null byte. - */ - if ((*result = (char *)malloc(newsize + 1)) == NULL) - { - free(matches); - return PCRS_ERR_NOMEM; - } - else - { - (*result)[newsize] = '\0'; - } - - - /* - * Replace - */ - offset = 0; - result_offset = *result; - - 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)); - result_offset += matches[i].submatch_offset[0] - offset; - - /* For every segment of the substitute.. */ - 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.. */ - if (k != job->substitute->backrefs - /* ..in legal range.. */ - && job->substitute->backref[k] < PCRS_MAX_SUBMATCHES + 2 - /* ..and referencing a real submatch.. */ - && job->substitute->backref[k] < matches[i].submatches - /* ..that is nonempty.. */ - && matches[i].submatch_length[job->substitute->backref[k]] > 0) - { - /* ..copy the submatch that is ref'd. */ - memcpy( - result_offset, - subject + matches[i].submatch_offset[job->substitute->backref[k]], - matches[i].submatch_length[job->substitute->backref[k]] - ); - result_offset += matches[i].submatch_length[job->substitute->backref[k]]; - } - } - offset = matches[i].submatch_offset[0] + (int)matches[i].submatch_length[0]; - } - - /* Copy the rest. */ - memcpy(result_offset, subject + offset, subject_length - (size_t)offset); - - *result_length = newsize; - free(matches); - return matches_found; - -} - - -#define is_hex_digit(x) ((x) && strchr("0123456789ABCDEF", toupper(x))) - -/********************************************************************* - * - * Function : is_hex_sequence - * - * Description : Checks the first four characters of a string - * and decides if they are a valid hex sequence - * (like '\x40'). - * - * Parameters : - * 1 : sequence = The string to check - * - * Returns : Non-zero if it's valid sequence, or - * Zero if it isn't. - * - *********************************************************************/ -static int is_hex_sequence(const char *sequence) -{ - return (sequence[0] == '\' && - sequence[1] == 'x' && - is_hex_digit(sequence[2]) && - is_hex_digit(sequence[3])); -} - - -/* - * Functions below this line are only part of the pcrs version - * included in Privoxy. If you use any of them you should not - * try to dynamically link against external pcrs versions. - */ - -/********************************************************************* - * - * Function : pcrs_job_is_dynamic - * - * Description : Checks if a job has the "D" (dynamic) option set. - * - * Parameters : - * 1 : job = The job to check - * - * Returns : TRUE if the job is indeed dynamic, otherwise - * FALSE - * - *********************************************************************/ -int pcrs_job_is_dynamic (char *job) -{ - const char delimiter = job[1]; - const size_t length = strlen(job); - char *option; - - if (length < 5) - { - /* - * The shortest valid (but useless) - * dynamic pattern is "s@@@D" - */ - return FALSE; - } - - /* - * Everything between the last character - * and the last delimiter is an option ... - */ - for (option = job + length; *option != delimiter; option--) - { - if (*option == 'D') - { - /* - * ... and if said option is 'D' the job is dynamic. - */ - return TRUE; - } - } - return FALSE; - -} - - -/********************************************************************* - * - * Function : pcrs_get_delimiter - * - * Description : Tries to find a character that is safe to - * be used as a pcrs delimiter for a certain string. - * - * Parameters : - * 1 : string = The string to search in - * - * Returns : A safe delimiter if one was found, otherwise '\0'. - * - *********************************************************************/ -char pcrs_get_delimiter(const char *string) -{ - /* - * Some characters that are unlikely to - * be part of pcrs replacement strings. - */ - char delimiters[] = "><§#+*~%^°-:;µ!@"; - char *d = delimiters; - - /* Take the first delimiter that isn't part of the string */ - while (*d && NULL != strchr(string, *d)) - { - d++; - } - return *d; - -} - - -/********************************************************************* - * - * Function : pcrs_execute_single_command - * - * Description : Apply single pcrs command 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 : subject = the subject (== original) string - * 2 : pcrs_command = the pcrs command as string (s@foo@bar@) - * 3 : hits = int* for returning the number of modifications - * - * Returns : NULL in case of errors, otherwise the - * result of the pcrs command. - * - *********************************************************************/ -char *pcrs_execute_single_command(const char *subject, const char *pcrs_command, int *hits) -{ - size_t size; - char *result = NULL; - pcrs_job *job; - - assert(subject); - assert(pcrs_command); - - *hits = 0; - size = strlen(subject); - - job = pcrs_compile_command(pcrs_command, hits); - if (NULL != job) - { - *hits = pcrs_execute(job, subject, size, &result, &size); - if (*hits < 0) - { - freez(result); - } - pcrs_free_job(job); - } - return result; - -} - - -static const char warning[] = "... [too long, truncated]"; -/********************************************************************* - * - * Function : pcrs_compile_dynamic_command - * - * Description : Takes a dynamic pcrs command, fills in the - * values of the variables and compiles it. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : pcrs_command = The dynamic pcrs command to compile - * 3 : v = NULL terminated array of variables and their values. - * 4 : error = pcrs error code - * - * Returns : NULL in case of hard errors, otherwise the - * compiled pcrs job. - * - *********************************************************************/ -pcrs_job *pcrs_compile_dynamic_command(char *pcrs_command, const struct pcrs_variable v[], int *error) -{ - char buf[PCRS_BUFFER_SIZE]; - const char *original_pcrs_command = pcrs_command; - char *pcrs_command_tmp = NULL; - pcrs_job *job = NULL; - int truncation = 0; - char d; - int ret; - - while ((NULL != v->name) && (NULL != pcrs_command)) - { - assert(NULL != v->value); - - if (NULL == strstr(pcrs_command, v->name)) - { - /* - * Skip the substitution if the variable - * name isn't part of the pattern. - */ - v++; - continue; - } - - /* Use pcrs to replace the variable with its value. */ - d = pcrs_get_delimiter(v->value); - if ('\0' == d) - { - /* No proper delimiter found */ - *error = PCRS_ERR_CMDSYNTAX; - return NULL; - } - - /* - * Variable names are supposed to contain alpha - * numerical characters plus '_' only. - */ - assert(NULL == strchr(v->name, d)); - - ret = snprintf(buf, sizeof(buf), "s%c\$%s%c%s%cgT", d, v->name, d, v->value, d); - assert(ret >= 0); - if (ret >= sizeof(buf)) - { - /* - * Value didn't completely fit into buffer, - * overwrite the end of the substitution text - * with a truncation message and close the pattern - * properly. - */ - const size_t trailer_size = sizeof(warning) + 3; /* 3 for d + "gT" */ - char *trailer_start = buf + sizeof(buf) - trailer_size; - - ret = snprintf(trailer_start, trailer_size, "%s%cgT", warning, d); - assert(ret == trailer_size - 1); - assert(sizeof(buf) == strlen(buf) + 1); - truncation = 1; - } - - pcrs_command_tmp = pcrs_execute_single_command(pcrs_command, buf, error); - if (NULL == pcrs_command_tmp) - { - return NULL; - } - - if (pcrs_command != original_pcrs_command) - { - freez(pcrs_command); - } - pcrs_command = pcrs_command_tmp; - - v++; - } - - job = pcrs_compile_command(pcrs_command, error); - if (pcrs_command != original_pcrs_command) - { - freez(pcrs_command); - } - - if (truncation) - { - *error = PCRS_WARN_TRUNCATION; - } - - return job; - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/pcrs.h b/external/privoxy/pcrs.h deleted file mode 100644 index b8939c0..0000000 --- a/external/privoxy/pcrs.h +++ /dev/null @@ -1,221 +0,0 @@ -#ifndef PCRS_H_INCLUDED -#define PCRS_H_INCLUDED - -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/pcrs.h,v $ - * - * Purpose : Header file for pcrs.c - * - * Copyright : see pcrs.c - * - * Revisions : - * $Log: pcrs.h,v $ - * Revision 1.16 2007/04/30 15:02:19 fabiankeil - * Introduce dynamic pcrs jobs that can resolve variables. - * - * Revision 1.15 2007/01/05 15:46:12 fabiankeil - * Don't use strlen() to calculate the length of - * the pcrs substitutes. They don't have to be valid C - * strings and getting their length wrong can result in - * user-controlled memory corruption. - * - * Thanks to Felix Gröbert for reporting the problem - * and providing the fix [#1627140]. - * - * Revision 1.14 2006/12/24 17:27:37 fabiankeil - * Increase pcrs error code offset to prevent overlaps - * with pcre versions newer than our own. - * - * Revision 1.13 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.11 2002/03/08 14:18:23 oes - * Fixing -Wconversion warnings - * - * 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. - * - * Revision 1.6 2001/07/29 18:52:06 jongfoster - * Renaming _PCRS_H, and adding "extern C {}" - * - * Revision 1.5 2001/07/18 17:27:00 oes - * Changed interface; Cosmetics - * - * 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 - * - * Revision 1.3 2001/06/09 10:58:57 jongfoster - * Removing a single unused #define which referenced BUFSIZ - * - * Revision 1.2 2001/05/25 11:03:55 oes - * Added sanity check for NULL jobs to pcrs_exec_substitution - * - * Revision 1.1.1.1 2001/05/15 13:59:02 oes - * Initial import of version 2.9.3 source tree - * - * Revision 1.4 2001/05/11 01:57:02 rodney - * Added new file header standard w/RCS control tags. - * - * revision 1.3 2001/05/08 02:38:13 rodney - * Changed C++ "//" style comment to C style comments. - * - * revision 1.2 2001/04/30 02:39:24 rodney - * Made this pcrs.h file conditionally included. - * - * revision 1.1 2001/04/16 21:10:38 rodney - * Initial checkin - * - *********************************************************************/ - -#define PCRS_H_VERSION "$Id: pcrs.h,v 1.16 2007/04/30 15:02:19 fabiankeil Exp $" - - -#ifndef _PCRE_H -#include <pcre.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Constants: - */ - -#define FALSE 0 -#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 */ - -/* - * PCRS error codes - * - * They are supposed to be handled together with PCRE error - * codes and have to start with an offset to prevent overlaps. - * - * PCRE 6.7 uses error codes from -1 to -21, PCRS error codes - * below -100 should be safe for a while. - */ -#define PCRS_ERR_NOMEM -100 /* Failed to acquire memory. */ -#define PCRS_ERR_CMDSYNTAX -101 /* Syntax of s///-command */ -#define PCRS_ERR_STUDY -102 /* pcre error while studying the pattern */ -#define PCRS_ERR_BADJOB -103 /* NULL job pointer, pattern or substitute */ -#define PCRS_WARN_BADREF -104 /* Backreference out of range */ -#define PCRS_WARN_TRUNCATION -105 /* At least one pcrs variable was too big, - * only the first part was used. */ - -/* 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 */ - - -/* - * Data types: - */ - -/* A compiled substitute */ - -typedef struct { - char *text; /* The plaintext part of the substitute, with all backreferences stripped */ - size_t length; /* The substitute may not be a valid C string so we can't rely on strlen(). */ - 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 */ -} 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 */ -} pcrs_match; - - -/* A PCRS job */ - -typedef struct PCRS_JOB { - pcre *pattern; /* The compiled pcre pattern */ - pcre_extra *hints; /* The pcre hints for the pattern */ - int options; /* The pcre options (numeric) */ - int flags; /* The pcrs and user flags (see "Flags" above) */ - pcrs_substitute *substitute; /* The compiled pcrs substitute */ - struct PCRS_JOB *next; /* Pointer for chaining jobs to joblists */ -} pcrs_job; - - -/* - * Prototypes: - */ - -/* Main usage */ -extern pcrs_job *pcrs_compile_command(const char *command, int *errptr); -extern pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr); -extern int pcrs_execute(pcrs_job *job, const 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); - -/* 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); - -extern int pcrs_job_is_dynamic(char *job); -extern char pcrs_get_delimiter(const char *string); -extern char *pcrs_execute_single_command(const char *subject, const char *pcrs_command, int *hits); -/* - * Variable/value pair for dynamic pcrs commands. - */ -struct pcrs_variable -{ - const char *name; - char *value; - int static_value; -}; - -extern pcrs_job *pcrs_compile_dynamic_command(char *pcrs_command, const struct pcrs_variable v[], int *error); - -/* Only relevant for maximum pcrs variable size */ -#ifndef PCRS_BUFFER_SIZE -#define PCRS_BUFFER_SIZE 4000 -#endif /* ndef PCRS_BUFFER_SIZE */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef PCRS_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/privoxy-generic.init b/external/privoxy/privoxy-generic.init deleted file mode 100755 index 53b4127..0000000 --- a/external/privoxy/privoxy-generic.init +++ /dev/null @@ -1,182 +0,0 @@ -#!/bin/sh -# -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/privoxy-generic.init,v $ -# -# Purpose : This shell script takes care of starting and stopping -# privoxy. -# -# Copyright : Written by and Copyright (C) 2001,2002 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. -# -# Developer's NOTE: This script should be tested against a true /bin/sh, which -# has notable differences from bash. By design, this script does not try to do -# too much, so as to be as cross-platform as possible. -# -# -# Revisions : -# $Log: privoxy-generic.init,v $ -# Revision 1.8 2007/06/09 12:35:54 fabiankeil -# Add /usr/xpg4/bin to the PATH to make sure the POSIX -# version of id is used on Solaris. Closes BR#1733788. -# Thanks to Brent Chivers for report and fix. -# -# Revision 1.7 2006/10/14 14:12:22 fabiankeil -# Print warnings if the user tries to run Privoxy as root -# or if the script is run without root privileges; -# only use "--user" if run with root privileges and -# don't depend on $USER being set to root. Fixes BR 779781. -# -# Apparently $USER isn't set on all systems, -# but it also didn't work if the user only -# increased her privileges with su or sudo, -# but still had her real uid in $USER. -# -# Thanks to Florian Effenberger for reporting. -# -# Revision 1.6 2006/07/18 14:48:47 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.5.2.1 2002/10/17 17:04:22 hal9 -# Add from main trunk. Will be needed for make install. -# -# Revision 1.5 2002/10/17 17:01:29 hal9 -# Set paths to match the defaults for a root install. Force remove PIDFILE on -# stop. -# -# Revision 1.4 2002/09/11 01:15:02 hal9 -# Fix typo in variable. Now tested on Solaris and Linux, with defaults. -# -# Revision 1.3 2002/09/11 01:09:14 hal9 -# Better handling of pidfile, and process owner. -# -# Revision 1.2 2002/09/08 20:27:58 hal9 -# -Rewrote script config section. -# -Added comments to script. -# -Tried to add logic to use a --user privoxy, if available. -# -Minor script changes due to 'echo -n' does not work on a true -# /bin/sh system. -# -# Revision 1.1 2002/09/06 00:20:26 hal9 -# Creating a generic init script, meant to be used on platforms where don't have -# a custom init script. -# -# Revision 1.0 2002/09/05 17:14:32 hal9 -# -####################################################################### - -# Is this needed by Solaris? -#ident "@(#)privoxy 1.0 02/09/05" - -# NOTE: This script may require editing to ensure proper location of -# config file, and the privoxy executable. Care should be taken to ensure -# logfile is writable by $P_USER (logfile is defined in config), and that -# there is suitable write access for $P_PIDFILE. - -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/xpg4/bin:/usr/bin:/sbin:/bin -P_NAME=Privoxy -# Path to executable. -P_DAEMON=privoxy -# Full path to location of Privoxy config file. -P_CONF_FILE=/usr/local/etc/privoxy/config -# Full path to PID file location. Location must be writable by -# whoever runs this script and by Privoxy itself. -P_PIDFILE=/var/run/privoxy.pid -# If uncommented, this script will try to run as USER=privoxy, which -# may require special handling of config, *.action, trust, logfile, -# jarfile, and pidfile. -P_USER=privoxy - -# If a privoxy user is specified, lets try that. /bin/sh does not seem to -# know about $UID. -if [ 0 = `id -u` ]; then - if [ -n "$P_USER" ]; then - id $P_USER 2>/dev/null >/dev/null - if [ $? -eq 0 ]; then - P_USER_SETTINGS="--user $P_USER" - else - echo "User $P_USER doesn't exist, exiting." - exit 1 - fi - else - # The user has sufficient rights, but $P_USER isn't set - echo "Running Privoxy as root is not recommended!" - P_USER_SETTINGS="" - fi -else - # The user has insufficient rights to run Privoxy as $P_USER - # and may not be able to write or delete the PID file. - echo "You aren't root, expect trouble!" - P_USER_SETTINGS="" -fi - -if [ ! -f $P_CONF_FILE ]; then - echo "Can't find $P_CONF_FILE, exiting." - exit 1 -fi - -case "$1" in - - start) - if [ -f $P_PIDFILE ]; then - if kill -0 `cat $P_PIDFILE`; then - echo "Error: $P_NAME is already running, exiting." - exit 1 - else - rm -f $P_PIDFILE - fi - fi - - $P_DAEMON --pidfile $P_PIDFILE $P_USER_SETTINGS $P_CONF_FILE 2>/dev/null - - if [ $? -eq 0 ]; then - echo "Starting $P_NAME, OK." - else - echo "Starting $P_NAME, Failed." - rm -f $P_PIDFILE - fi - ;; - - restart) - $0 stop - $0 start - ;; - - stop) - test ! -f $P_PIDFILE && echo "No $P_PIDFILE file found, exiting." && exit 1 - kill `cat $P_PIDFILE` && rm -f $P_PIDFILE && \ - echo "Stopping $P_NAME, OK." || echo "Stopping $P_NAME, failed." - ;; - - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 - ;; - -esac - -exit 0 diff --git a/external/privoxy/privoxy-rh.spec b/external/privoxy/privoxy-rh.spec deleted file mode 100644 index 40c82b4..0000000 --- a/external/privoxy/privoxy-rh.spec +++ /dev/null @@ -1,1196 +0,0 @@ -# $Id: privoxy-rh.spec,v 1.63 2009/03/21 10:46:15 fabiankeil Exp $ -# -# Written by and Copyright (C) 2001-2006 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} -%define privoxy_uid 73 -%define privoxy_gid 73 - -Name: privoxy -# ATTENTION -# Version and release should be updated accordingly on configure.in and -# configure. Otherwise, the package can be build with the wrong value -Version: 3.0.12 -Release: 1 -Summary: Privoxy - privacy enhancing proxy -License: GPL -Source0: http://dl.sf.net/ijbswa/%%7Bname%7D-%%7Bversion%7D-stable-src.tar.gz -BuildRoot: %{_tmppath}/%{name}-%{version}-root -Group: System Environment/Daemons -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 libtool autoconf -Conflicts: junkbuster-raw junkbuster-blank junkbuster - -%description -Privoxy is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page data, 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 Internet Junkbuster. - -%prep -#%setup -q -c -%setup -q -n "%{name}-%{version}-stable" - -%build - -# We check to see if versions match -VERSION_MAJOR=3 -VERSION_MINOR=0 -VERSION_POINT=12 - -# find CVS files and remove it. -find -name CVS | xargs rm -rf - -CONFIG_VERSION=`cat configure.in | sed -n -e 's/^VERSION_MAJOR=([0-9]*)/\1./p' -e 's/^VERSION_MINOR=([0-9]*)/\1./p' -e 's/^VERSION_POINT=([0-9]*)/\1/p' | awk '{printf $1}'` -if [ "%{version}" != "${CONFIG_VERSION}" ]; then - echo "The version declared on the specfile does not match the version" - echo "declared on configure.in. This should not happen. The build will" - echo "be interrupted now, so you can fix it." - exit 1 -fi -autoheader -autoconf -%configure --disable-dynamic-pcre -make -# Docs are in CVS and tarball now. -#%%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 %{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} - -# Using sed to "convert" from DOS format to UNIX -# This is important behaviour, and should not be removed without some -# other assurance that these files don't get packed in the the -# wrong format -for i in `ls *.action` -do - cat $i | sed -e 's/[[:cntrl:]]*$//' > %{buildroot}%{privoxyconf}/$i -done -cat default.filter | sed -e 's/[[:cntrl:]]*$//' > %{buildroot}%{privoxyconf}/default.filter -cat user.filter | sed -e 's/[[:cntrl:]]*$//' > %{buildroot}%{privoxyconf}/user.filter -cat trust | sed -e 's/[[:cntrl:]]*$//' > %{buildroot}%{privoxyconf}/trust -( -cd templates -for i in `ls` -do - cat $i | sed -e 's/[[:cntrl:]]*$//' > %{buildroot}%{privoxyconf}/templates/$i -done -) - -cp -f %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 -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/^forward.*/forward /etc/%{name}/forward/g' | \ -# sed 's/^aclfile.*/aclfile /etc/%{name}/aclfile/g' > \ - sed 's@^logdir.*@logdir %{_localstatedir}/log/%{name}@g' | \ - sed 's@#user-manual http://www.privoxy.org/user-manual/@user-manual %{_docdir}/%{name}-%{version}/user-manual/@g' | \ - sed -e 's/[[:cntrl:]]*$//' > \ - %{buildroot}%{privoxyconf}/config -perl -pe 's/{-no-cookies}/{-no-cookies}\n.redhat.com/' default.action >\ - %{buildroot}%{privoxyconf}/default.action - - -## 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 - -# Same for username -usermod -u %{privoxy_uid} -g %{privoxy_gid} -l %{name} -d %{_sysconfdir}/%{name} -s "" %{oldname} > /dev/null 2>&1 || : -usermod -u %{privoxy_uid} -g %{privoxy_gid} -l %{name} -d %{_sysconfdir}/%{name} -s "" %{veryoldname} > /dev/null 2>&1 || : -userdel %{oldname} > /dev/null 2>&1 ||: -userdel %{veryoldname} > /dev/null 2>&1 ||: - -# Change the group name. Remove anything left behind. -groupmod -g %{privoxy_gid} -n %{name} %{oldname} > /dev/null 2>&1 ||: -groupmod -g %{privoxy_gid} -n %{name} %{veryoldname} > /dev/null 2>&1 ||: -groupdel %{oldname} > /dev/null 2>&1 ||: -groupdel %{veryoldname} > /dev/null 2>&1 ||: - -# Doublecheck to see if the group exist, and that it has the correct gid -/bin/grep -E '^%{name}:' %{_sysconfdir}/group > /dev/null 2>&1 -if [ $? -eq 1 ]; then - # Looks like it does not exist. Create it - groupadd -g %{privoxy_gid} %{name} > /dev/null 2>&1 -else - /bin/grep -E '^%{name}:[^:]*:%{privoxy_gid}:' %{_sysconfdir}/group > /dev/null 2>&1 - if [ $? -eq 1 ]; then - # The group exists, but does not have the correct gid - groupmod -g %{privoxy_gid} %{name} > /dev/null 2>&1 - fi -fi - -# 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 - %{_sbindir}/useradd -u %{privoxy_uid} -g %{privoxy_gid} -d %{_sysconfdir}/%{name} -r -s "" %{name} > /dev/null 2>&1 -fi - -# Double check that the group has the correct uid -P_UID=`id -u %{name} 2>/dev/null` -if [ $P_UID -ne %{privoxy_uid} ]; then - %{_sbindir}/usermod -u %{privoxy_uid} %{name} -fi - -# The same for the gid -P_GID=`id -g %{name} 2>/dev/null` -if [ $P_GID -ne %{privoxy_gid} ]; then - %{_sbindir}/usermod -g %{privoxy_gid} %{name} -fi - -%post -# for upgrade from 2.0.x -[ -f %{_localstatedir}/log/%{oldname}/logfile ] && { - mv -f %{_localstatedir}/log/%{oldname}/logfile %{_localstatedir}/log/%{name}/logfile ||: ; - chown -R %{name}:%{name} %{_localstatedir}/log/%{name} 2>/dev/null ||: ; -} -[ -f %{_localstatedir}/log/%{name}/%{name} ] && { - mv -f %{_localstatedir}/log/%{name}/%{name} %{_localstatedir}/log/%{name}/logfile ||: ; - chown -R %{name}:%{name} %{_sysconfdir}/%{name} 2>/dev/null ||: ; -} -/sbin/chkconfig --add privoxy -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 ||: - /sbin/chkconfig --del privoxy -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 && %{_sbindir}/userdel privoxy || /bin/true - /bin/grep -E '^%{name}:' %{_sysconfdir}/group > /dev/null && %{_sbindir}/groupdel %{name} || /bin/true -fi - -%clean -[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} - -%files -%defattr(0644,root,root,0755) -%doc README AUTHORS ChangeLog LICENSE -#%doc doc/text/developer-manual.txt doc/text/user-manual.txt doc/text/faq.txt -%doc doc/webserver/developer-manual -%doc doc/webserver/user-manual -%doc doc/webserver/faq -%doc doc/webserver/p_doc.css doc/webserver/privoxy-index.html -%doc doc/webserver/images -%doc doc/webserver/man-page - -# ATTENTION FOR defattr change here ! -%defattr(0644,%{name},%{name},0755) - -%dir %{privoxyconf} -%dir %{privoxyconf}/templates -%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(noreplace) %{privoxyconf}/config -%config(noreplace) %{privoxyconf}/user.action -%config %{privoxyconf}/match-all.action -%config %{privoxyconf}/default.action -%config %{privoxyconf}/default.filter -%config %{privoxyconf}/regression-tests.action -%config(noreplace) %{privoxyconf}/user.filter -%config(noreplace) %{privoxyconf}/trust - -# Please keep these alphabetized so its easier to find one that -# is not included. -%config %{privoxyconf}/templates/blocked -%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-file-read-only -%config %{privoxyconf}/templates/cgi-error-modified -%config %{privoxyconf}/templates/cgi-error-parse -%config %{privoxyconf}/templates/cgi-style.css -%config %{privoxyconf}/templates/connect-failed -%config %{privoxyconf}/templates/default -%config %{privoxyconf}/templates/forwarding-failed -%config %{privoxyconf}/templates/edit-actions-add-url-form -%config %{privoxyconf}/templates/edit-actions-for-url -%config %{privoxyconf}/templates/edit-actions-for-url-filter -%config %{privoxyconf}/templates/edit-actions-list -%config %{privoxyconf}/templates/edit-actions-list-button -%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/mod-local-help -%config %{privoxyconf}/templates/mod-support-and-service -%config %{privoxyconf}/templates/mod-title -%config %{privoxyconf}/templates/mod-unstable-warning -%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/url-info-osd.xml - -# Attention, new defattr change here ! -%defattr(0644,root,root,0755) - -%config(noreplace) %{_sysconfdir}/logrotate.d/%{name} -%config(noreplace) %attr(0755,root,root) %{_sysconfdir}/rc.d/init.d/%{name} - -%{_mandir}/man1/%{name}.* - -%changelog -* Sat Jun 18 2008 Hal Burgiss hal@foobox.net -- Remove reference to txt docs. - -* Sat Oct 18 2006 Hal Burgiss hal@foobox.net -- Bump version to 3.0.6 - -* Sat Sep 23 2006 Jochen Schlick <j.schlick_at_decagon_de> 3.0.5-1 -- let user-manual point to local documentation - -* Thu Sep 21 2006 Hal Burgiss hal@foobox.net -- Fix user.filter install section and clean up CVS cruft in tarball. - -* Wed Sep 20 2006 Hal Burgiss hal@foobox.net -- Bump version to 3.0.5 - -* Fri Sep 08 2006 Hal Burgiss hal@foobox.net -- Bump version to 3.0.4 - -* Sat Sep 02 2006 Hal Burgiss hal@foobox.net -- Include new file, user.filter. Do not overwrite "trust" file - (does anyone use this?). - -* Wed Mar 26 2003 Andreas Oesterhelt andreas@oesterhelt.org -- Bump version for 3.0.2. - -* Wed Mar 19 2003 Hal Burgiss hal@foobox.net -- Bump version for 3.0.1. - -* Tue Aug 25 2002 Hal Burgiss hal@foobox.net -- Bump version for 3.0.0 :) - -* Tue Aug 06 2002 Hal Burgiss hal@foobox.net -- Reset version for 2.9.20. - -* Tue Jul 30 2002 Hal Burgiss hal@foobox.net -- Reset version for 2.9.18. - -* Sat Jul 27 2002 Hal Burgiss hal@foobox.net -- Reset version and release for 2.9.16. - -* Fri Jul 12 2002 Karsten Hopp karsten@redhat.de -- don't use ghost files for rcX.d/*, using chkconfig is the - correct way to do this job (#68619) - -* Fri Jul 05 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.15-8 -- Changing delete order for groups and users (users should be first) - -* Wed Jul 03 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.15-7 -- Changing sed expression that removed CR from the end of the lines. This - new one removes any control caracter, and should work with older versions - of sed - -* Tue Jul 02 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.15-6 -- Fixing defattr values. File and directory modes where swapped - -* Tue Jul 02 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.15-5 -- Bumping Release number (which should be changed every time the specfile - is) - -* Tue Jul 02 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-4 -- Fix typo in templates creation. - -* Wed Jun 26 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.15-4 -- Fixing issues created by specfile sync between branches - - Correcting the release number (WARNING) - - Reintroducing text file conversion (dos -> unix) - - Reconverting hardcoded directories to macros - - Refixing ownership of privoxy files (now using multiple defattr - definitions) - -* Thu Jun 20 2002 Karsten Hopp karsten@redhat.de -- fix several .spec file issues to shut up rpmlint - - non-standard-dir-perm /var/log/privoxy 0744 - - invalid-vendor Privoxy.Org (This is ok for binaries compiled by privoxy - members, but not for packages from Red Hat) - - non-standard-group Networking/Utilities - - logrotate and init scripts should be noreplace - -* Mon May 27 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Index.html is now privoxy-index.html for doc usage. - -* Sat May 25 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Add html man page so index.html does not 404. - -* Fri May 24 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Add another template and alphabetize these for easier tracking. -- Add doc/images directory. - -* Wed May 15 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Add templates/edit-actions-list-button - -* Fri May 03 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.15-1 -- Version bump -- Adding noreplace for %%{privoxyconf}/config -- Included a method to verify if the versions declared on the specfile and - configure.in match. Interrupt the build if they don't. - -* Fri Apr 26 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.14-3 -- Changing Vendor to Privoxy.Org - -* Tue Apr 23 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.14-2 -- Adjust for new *actions files. - -* Mon Apr 22 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.14-2 -- Removed the redhat hack that prevented the user and group from - being dealocated. That was a misundestanding of my part regarding - redhat policy. - -* Mon Apr 22 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.14-2 -- Using macros to define uid and gid values -- Bumping release - -* Mon Apr 22 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.14-1 -- Changes to fixate the uid and gid values as (both) 73. This is a - value we hope to standarize for all distributions. RedHat already - uses it, and Conectiva should start as soon as I find where the heck - I left my cluebat :-) -- Only remove the user and group on uninstall if this is not redhat, once - redhat likes to have the values allocated even if the package is not - installed - -* Tue Apr 16 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-6 -- Add --disable-dynamic-pcre to configure. - -* Wed Apr 10 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.13-5 -- Relisting template files on the %%files section - -* Tue Apr 09 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-4 -- Removed 'make dok'. Docs are all maintained in CVS (and tarball) now. - -* Mon Apr 08 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-4 -- Add templates/cgi-style.css, faq.txt, p_web.css, LICENSE -- Remove templates/blocked-compact. -- Add more docbook stuff to Builderquires. - -* Thu Mar 28 2002 Sarantis Paskalis sarantis@cnl.di.uoa.gr -+ privoxy-2.9.13-3 -- Include correct documentation file. - -* Tue Mar 26 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-3 -- Fix typo in Description. - -* Tue Mar 26 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.13-3 -- Added commentary asking to update the release value on the configure - script - -* Tue Mar 25 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-3 -- Added the missing edit-actions-for-url-filter to templates. - -* Mon Mar 25 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-2.9.13-2 -- Fixing Release number - -* Sun Mar 24 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-2 -- Added faq to docs. - -* Sun Mar 24 2002 Rodrigo Barbosa rodrigob@suespammers.org -+ privoxy-2.9.13-2 -- Fixed the init files entries. Now we use %%ghost -- improved username (and groupname) handling on the %%pre section. By improved - I mean: we do it by brute force now. Much easier to maintain. Yeah, you - got it right. No more Mr. Nice Guy. -- Removed the userdel call on %%post. No need, once it's complety handled on - the %%pre section - -* Sun Mar 24 2002 Hal Burgiss hal@foobox.net -+ junkbusterng-2.9.13-1 - Added autoheader. Added autoconf to buildrequires. - -* Sun Mar 24 2002 Hal Burgiss hal@foobox.net -+ junkbusterng-2.9.13-1 -- Fixed build problems re: name conflicts with man page and logrotate. -- Commented out rc?d/* configs for time being, which are causing a build -- failure. /etc/junkbuster is now /etc/privoxy. Stefan did other name -- changes. Fixed typo ';' should be ':' causing 'rpm -e' to fail. - -* Fri Mar 22 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ junkbusterng-2.9.13-1 -- References to the expression ijb where changed where possible -- New package name: junkbusterng (all in lower case, acording to - the LSB recomendation) -- Version changed to: 2.9.13 -- Release: 1 -- Added: junkbuster to obsoletes and conflicts (Not sure this is - right. If it obsoletes, why conflict ? Have to check it later) -- Summary changed: Stefan, please check and aprove it -- Changes description to use the new name -- Sed string was NOT changed. Have to wait to the manpage to - change first -- Keeping the user junkbuster for now. It will require some aditional - changes on the script (scheduled for the next specfile release) -- Added post entry to move the old logfile to the new log directory -- Removing "chkconfig --add" entry (not good to have it automaticaly - added to the startup list). -- Added preun section to stop the service with the old name, as well - as remove it from the startup list -- Removed the chkconfig --del entry from the conditional block on - the preun scriptlet (now handled on the %files section) - -* Thu Mar 21 2002 Hal Burgiss hal@foobox.net -- added ijb_docs.css to docs. - -* Mon Mar 11 2002 Hal Burgiss hal@foobox.net -+ junkbuster-2.9.11-8 -- Take out --enable-no-gifs, breaks some browsers. - -* Sun Mar 10 2002 Hal Burgiss hal@foobox.net -+ junkbuster-2.9.11-8 -- Add --enable-no-gifs to configure. - -* Fri Mar 08 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ junkbuster-2.9.11-7 -- Added BuildRequires to libtool. - -* Tue Mar 06 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ junkbuster-2.9.11-6 -- Changed the routined that handle the junkbust and junkbuster users on - %%pre and %%post to work in a smoother manner -- %%files now uses hardcoded usernames, to avoid problems with package - name changes in the future - -* Tue Mar 05 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ junkbuster-2.9.11-5 -- Added "make redhat-dok" to the build process -- Added docbook-utils to BuildRequires - -* Tue Mar 05 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ junkbuster-2.9.11-4 -- Changing man section in the manpage from 1 to 8 -- We now require packages, not files, to avoid issues with apt - -* Mon Mar 04 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ junkbuster-2.9.11-3 -- Fixing permissions of the init script - -* Mon Mar 04 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ junkbuster-2.9.11-2 -- General specfile fixup, using the best recomended practices, including: - - Adding -q to %%setup - - Using macros whereever possible - - Not using wildchars on %%files section - - Doubling the percentage char on changelog and comments, to - avoid rpm expanding them - -* Sun Mar 03 2002 Hal Burgiss hal@foobox.net -- /bin/false for shell causes init script to fail. Reverting. - -* Wed Jan 09 2002 Hal Burgiss hal@foobox.net -- Removed UID 73. Included user-manual and developer-manual in docs. - Include other actions files. Default shell is now /bin/false. - Userdel user=junkbust. ChangeLog was not zipped. Removed - RPM_OPT_FLAGS kludge. - -* Fri Dec 28 2001 Thomas Steudten thomas@steudten.ch -- add paranoia check for 'rm -rf %%{buildroot}' -- add gzip to 'BuildRequires' - -* Sat Dec 1 2001 Hal Burgiss hal@foobox.net -- actionsfile is now ijb.action. - -* Tue Nov 6 2001 Thomas Steudten thomas@steudten.ch -- Compress manpage -- Add more documents for installation -- Add version string to name and source - -* Wed Oct 24 2001 Hal Burigss hal@foobox.net -- Back to user 'junkbuster' and fix configure macro. - -* Wed Oct 10 2001 Hal Burigss hal@foobox.net -- More changes for user 'junkbust'. Init script had 'junkbuster'. - -* Sun Sep 23 2001 Hal Burgiss hal@foobox.net -- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files. -- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise. - -* Thu Sep 13 2001 Hal Burgiss hal@foobox.net -- Added $RPM_OPT_FLAGS support, renaming of old logfile, and -- made sure no default shell exists for user junkbust. - -* Sun Jun 3 2001 Stefan Waldherr stefan@waldherr.org -- rework of RPM - -* Mon Sep 25 2000 Stefan Waldherr stefan@waldherr.org -- CLF Logging patch by davep@cyw.uklinux.net -- Hal DeVore haldevore@earthling.net fix akamaitech in blocklist - -* Sun Sep 17 2000 Stefan Waldherr stefan@waldherr.org -- Steve Kemp skx@tardis.ed.ac.uk's javascript popup patch. -- Markus Breitenbach breitenb@rbg.informatik.tu-darmstadt.de supplied - numerous fixes and enhancements for Steve's patch. -- adamlock@netscape.com (Adam Lock) in the windows version: - - Taskbar activity spinner always spins even when logging is - turned off (which is the default) - people who don't - like the spinner can turn it off from a menu option. - - Taskbar popup menu has a options submenu - people can now - open the settings files for cookies, blockers etc. - without opening the JB window. - - Logging functionality works again - - Buffer overflow is fixed - new code uses a bigger buffer - and snprintf so it shouldn't overflow anymore. -- Fixed userid swa, group learning problem while installing. - root must build RPM. -- Added patch by Benjamin Low ben@snrc.uow.edu.au that prevents JB to - core dump when there is no log file. -- Tweaked SuSE startup with the help of mohataj@gmx.net and Doc.B@gmx.de. -- Fixed man page to include imagefile and popupfile. -- Sanity check for the statistics function added. -- "Patrick D'Cruze" pdcruze@orac.iinet.net.au: It seems Microsoft - are transitioning Hotmail from FreeBSD/Apache to Windows 2000/IIS. - With IIS/5, it appears to omit the trailing \r\n from http header - only messages. eg, when I visit http://www.hotmail.com, IIS/5 - responds with a HTTP 302 redirect header. However, this header - message is missing the trailing \r\n. IIS/5 then closes the - connection. Junkbuster, unfortunately, discards the header becomes - it thinks it is incomplete - and it is. MS have transmitted an - incomplete header! -- Added bug reports and patch submission forms in the docs. - -* Mon Mar 20 2000 Stefan Waldherr stefan@waldherr.org - Andrew anw@tirana.freewire.co.uk extended the JB: - Display of statistics of the total number of requests and the number - of requests filtered by junkbuster, also the percentage of requests - filtered. Suppression of the listing of files on the proxy-args page. - All stuff optional and configurable. - -* Sun Sep 12 1999 Stefan Waldherr stefan@waldherr.org - Jan Willamowius (jan@janhh.shnet.org) fixed a bug in the - code which prevented the JB from handling URLs of the form - user:password@www.foo.com. Fixed. - -* Mon Aug 2 1999 Stefan Waldherr stefan@waldherr.org - Blank images are no longer cached, thanks to a hint from Markus - Breitenbach breitenb@rbg.informatik.tu-darmstadt.de. The user - agent is NO longer set by the Junkbuster. Sadly, many sites depend - on the correct browser version nowadays. Incorporated many - suggestions from Jan "Yenya" Kasprzak kas@fi.muni.cz for the - spec file. Fixed logging problem and since runlevel 2 does not - use networking, I replaced /etc/rc.d/rc2.d/S84junkbuster with - /etc/rc.d/rc2.d/K09junkbuster thanks to Shaw Walker - walker@netgate.net. You should now be able to build this RPM as - a non-root user (mathias@weidner.sem.lipsia.de). - -* Sun Jan 31 1999 Stefan Waldherr stefan@waldherr.org - %%{_localstatedir}/log/junkbuster set to nobody. Added /etc/junkbuster/imagelist - to allow more sophisticated matching of blocked images. Logrotate - logfile. Added files for auto-updating the blocklist et al. - -* Wed Dec 16 1998 Stefan Waldherr stefan@waldherr.org - Configure blank version via config file. No separate blank - version anymore. Added Roland's roland@spinnaker.rhein.de - patch to show a logo instead of a blank area. Added a suggestion - from Alex alex@cocoa.demon.co.uk: %%{_localstatedir}/lock/subsys/junkbuster. - More regexps in the blocklist. Prepared the forwardfile for - squid. Extended image regexp with help from gabriel - somlo@CS.ColoState.EDU. - -* Thu Nov 19 1998 Stefan Waldherr stefan@waldherr.org - All RPMs now identify themselves in the show-proxy-args page. - Released Windoze version. Run junkbuster as nobody instead of - root. - -* Fri Oct 30 1998 Stefan Waldherr stefan@waldherr.org - Newest version. First release (hence the little version number - mixture -- 2.0.2-0 instead of 2.0-7). This version tightens - security over 2.0.1; some multi-user sites will need to change - the listen-address in the configuration file. The blank version of - the Internet Junkbuster has a more sophisticated way of replacing - images. All RPMs identify themselves in the show-proxy-args page. - -* Thu Sep 23 1998 Stefan Waldherr stefan@waldherr.org - Modified the blocking feature, so that only GIFs and JPEGs are - blocked and replaced but not HTML pages. Thanks to - "Gerd Flender" plgerd@informatik.uni-siegen.de for this nice - idea. Added numerous stuff to the blocklist. Keep patches in - seperate files and no longer in diffs (easier to maintain). - -* Tue Jun 16 1998 Stefan Waldherr swa@cs.cmu.edu - Moved config files to /etc/junkbuster directory, moved man page, - added BuildRoot directive (Thanks to Alexey Nogin ayn2@cornell.edu) - Made new version junkbuster-raw (which is only a stripped version of - the junkuster rpm, i.e. without my blocklist, etc.) - -* Tue Jun 16 1998 (2.0-1) - Uhm, not that much. Just a new junkbuster version that - fixes a couple of bugs ... and of course a bigger - blocklist with the unique Now-less-ads-than-ever(SM) - feature. - Oh, one thing: I changed the default user agent to Linux -- no - need anymore to support Apple. - -* Tue Jun 16 1998 (2.0-0) - Now-less-ads-than-ever (SM) - compiled with gcc instead of cc - compiled with -O3, thus it should be a little faster - show-proxy-args now works - /etc/junkbuster.init wasn't necessary - -* Tue Jun 16 1998 (1.4) - some more config files were put into /etc - The junkbuster-blank rpm returns a 1x1 pixel image, that gets - displayed by Netscape instead of the blocked image. - Read http://www.waldherr.org/junkbuster/ for - further info. - -* Tue Jun 16 1998 (1.3) - The program has been moved to /usr/sbin (from /usr/local/bin) - Init- and stopscripts (/etc/rc.d/rc*) have been added so - that the junkbuster starts automatically during bootup. - The /etc/blocklist file is much more sophisticated. Theoretically - one should e.g. browse all major US and German newspapers without - seeing one annoying ad. - junkbuster.init was modified. It now starts junkbuster with an - additional "-r @" flag. - -# $Log: privoxy-rh.spec,v $ -# Revision 1.63 2009/03/21 10:46:15 fabiankeil -# Bump version to 3.0.12. -# -# Revision 1.62 2009/02/15 17:17:23 fabiankeil -# - Bump version to 3.0.11. -# - List match-all.action as %config file. -# -# Revision 1.61 2009/01/13 16:47:34 fabiankeil -# The standard.action file is gone. -# -# Revision 1.60 2008/08/30 12:46:49 fabiankeil -# The jarfile directive is gone. Update accordingly. -# -# Revision 1.59 2008/08/13 16:57:46 fabiankeil -# Change version to 3.0.10. -# -# Revision 1.58 2008/06/19 01:52:17 hal9 -# Remove txt docs from spec file. -# -# Revision 1.57 2008/05/30 15:06:42 fabiankeil -# - Add %config directive for url-info-osd.xml. -# As usual, this hasn't been tested. -# - Fix comment typo. -# -# Revision 1.56 2008/03/16 14:17:25 fabiankeil -# Add %config lines for regression-tests.action and forwarding-failed. -# This might or might not help with #1915185, reported by Bernardo Bacic. -# -# Revision 1.55 2008/03/02 17:36:43 fabiankeil -# Set version to 3.0.9. -# -# Revision 1.54 2008/01/20 14:30:59 fabiankeil -# Set version to 3.0.8. -# -# Revision 1.53 2006/11/28 11:34:35 hal9 -# Fix the prep section per Support request so it actually builds. -# -# Revision 1.52 2006/11/18 17:36:53 hal9 -# Ooops, bumping version to 3.0.6 -# -# Revision 1.51 2006/11/18 14:37:12 fabiankeil -# Bump version to 3.0.6. -# -# Revision 1.50 2006/09/24 01:19:03 hal9 -# Add changes for user-manual directive by nfopd submitted via SF. -# -# Revision 1.49 2006/09/22 01:02:08 hal9 -# Fix user.filter installation and CVS files cruft per support request. -# -# Revision 1.48 2006/09/20 23:51:26 hal9 -# Bump versions to 3.0.5 -# -# Revision 1.47 2006/09/09 00:35:10 hal9 -# Bumped versions to 3.0.4. Both files should be checked further. -# -# Revision 1.46 2006/09/02 22:22:59 hal9 -# Include user.filter, and do not overwrite trust file on updates. -# -# Revision 1.45 2006/07/18 14:48:47 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.33.2.22 2004/01/30 17:09:29 oes -# Bumped version for 3.0.3 -# -# Revision 1.33.2.21 2003/03/26 00:25:00 oes -# Bump version for 3.0.2 -# -# Revision 1.33.2.20 2003/03/20 03:27:11 hal9 -# Bump version for 3.0.1 pending release. -# -# Revision 1.33.2.19 2002/08/25 23:36:03 hal9 -# Bump version for 3.0.0. -# -# Revision 1.33.2.18 2002/08/10 11:28:50 oes -# Bumped version -# -# Revision 1.33.2.17 2002/08/07 01:08:49 hal9 -# Bumped version to 2.9.18. -# -# Revision 1.33.2.16 2002/08/05 08:42:13 kick_ -# same permissions, same runlevels as all the other initscripts -# -# Revision 1.33.2.15 2002/07/30 21:51:19 hal9 -# Bump version to 2.9.17. -# -# Revision 1.33.2.14 2002/07/27 21:58:16 kick_ -# bump version -# -# Revision 1.33.2.13 2002/07/27 21:39:41 kick_ -# condrestart raised an error during an fresh install when privoxy wasn't already running -# -# Revision 1.33.2.12 2002/07/27 15:47:10 hal9 -# Reset version and release for 2.9.16. -# -# Revision 1.33.2.11 2002/07/25 09:47:57 kick_ -# this caused some errors during a fresh installation. It's unnecessary to call an extra program (/bin/true) to set the error code to 0 -# -# Revision 1.33.2.10 2002/07/12 09:14:26 kick_ -# don't use ghost files for rcX.d/*, chkconfig is available to do this job. Enable translation of error messge -# -# Revision 1.33.2.9 2002/07/05 17:16:19 morcego -# - Changing delete order for groups and users (users should be first) -# -# Revision 1.33.2.8 2002/07/03 20:46:24 morcego -# - Changing sed expression that removed CR from the end of the lines. This -# new one removes any control caracter, and should work with older versions -# of sed -# -# Revision 1.33.2.7 2002/07/02 18:16:48 morcego -# - Fixing defattr values. File and directory modes where swapped -# -# Revision 1.33.2.6 2002/07/02 17:38:10 morcego -# Bumping Release number -# -# Revision 1.33.2.5 2002/07/02 11:43:20 hal9 -# Fix typo in templates creation. -# -# Revision 1.33.2.4 2002/06/26 17:32:45 morcego -# Integrating fixed from the main branch. -# -# Revision 1.33.2.3 2002/06/24 12:13:34 kick_ -# shut up rpmlint. btw: The vendor tag should be set in you .rpmmacros file, not in the spec file! -# -# Revision 1.33.2.2 2002/05/28 02:39:38 hal9 -# Replace index.html with privoxy-index.html for docs. -# -# Revision 1.33.2.1 2002/05/26 17:20:23 hal9 -# Add images to doc dirs. -# -# Revision 1.33 2002/05/25 02:08:23 hal9 -# Add doc/images directory. -# Redhat: alphabetized list of templates (and I think added one in the process) -# -# Revision 1.32 2002/05/16 01:37:29 hal9 -# Add new template file so CGI stuff works :) -# -# Revision 1.31 2002/05/03 17:14:35 morcego -# *.spec: Version bump to 2.9.15 -# -rh.spec: noreplace for %%{privoxyconf}/config -# Will interrupt the build if versions from configure.in and -# specfile do not match -# -# Revision 1.30 2002/04/26 15:51:05 morcego -# Changing Vendor value to Privoxy.Org -# -# Revision 1.29 2002/04/24 03:13:51 hal9 -# New actions files changes. -# -# Revision 1.28 2002/04/22 18:51:33 morcego -# user and group now get removed on rh too. -# -# Revision 1.27 2002/04/22 16:32:31 morcego -# configure.in, *.spec: Bumping release to 2 (2.9.14-2) -# -rh.spec: uid and gid are now macros -# -suse.spec: Changing the header Copyright to License (Copyright is -# deprecable) -# -# Revision 1.26 2002/04/22 16:24:36 morcego -# - Changes to fixate the uid and gid values as (both) 73. This is a -# value we hope to standarize for all distributions. RedHat already -# uses it, and Conectiva should start as soon as I find where the heck -# I left my cluebat :-) -# - Only remove the user and group on uninstall if this is not redhat, once -# redhat likes to have the values allocated even if the package is not -# installed -# -# Revision 1.25 2002/04/17 01:59:12 hal9 -# Add --disable-dynamic-pcre. -# -# Revision 1.24 2002/04/11 10:09:20 oes -# Version 2.9.14 -# -# Revision 1.23 2002/04/10 18:14:45 morcego -# - (privoxy-rh.spec only) Relisting template files on the %%files section -# - (configure.in, privoxy-rh.spec) Bumped package release to 5 -# -# Revision 1.22 2002/04/09 22:06:12 hal9 -# Remove 'make dok'. -# -# Revision 1.21 2002/04/09 02:52:26 hal9 -# - Add templates/cgi-style.css, faq.txt, p_web.css, LICENSE -# - Remove templates/blocked-compact. -# - Add more docbook stuff to Buildrequires. -# -# Revision 1.20 2002/04/08 20:27:45 swa -# fixed JB spelling -# -# Revision 1.19 2002/03/27 22:44:59 sarantis -# Include correct documentation file. -# -# Revision 1.18 2002/03/27 22:10:14 sarantis -# bumped Hal's last commit 1 day to the future to make rpm build again. -# -# Revision 1.17 2002/03/27 00:48:23 hal9 -# Fix up descrition. -# -# Revision 1.16 2002/03/26 22:29:55 swa -# we have a new homepage! -# -# Revision 1.15 2002/03/26 17:39:54 morcego -# Adding comment on the specfile to remember the packager to update -# the release number on the configure script -# -# Revision 1.14 2002/03/26 14:25:15 hal9 -# Added edit-actions-for-url-filter to templates in %%config -# -# Revision 1.13 2002/03/25 13:31:04 morcego -# Bumping Release tag. -# -# Revision 1.12 2002/03/25 03:11:40 hal9 -# Do it right way this time :/ -# -# Revision 1.11 2002/03/25 03:09:51 hal9 -# Added faq to docs. -# -# Revision 1.10 2002/03/24 22:16:14 morcego -# Just removing some old commentaries. -# -# Revision 1.9 2002/03/24 22:03:22 morcego -# Should be working now. See %changelog for details -# -# Revision 1.8 2002/03/24 21:13:01 morcego -# Tis broken. -# -# Revision 1.7 2002/03/24 21:07:18 hal9 -# Add autoheader, etc. -# -# Revision 1.6 2002/03/24 19:56:40 hal9 -# /etc/junkbuster is now /etc/privoxy. Fixed ';' typo. -# -# Revision 1.4 2002/03/24 13:32:42 swa -# name change related issues -# -# Revision 1.3 2002/03/24 12:56:21 swa -# name change related issues. -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.1 2002/03/22 20:53:03 morcego -# - Ongoing process to change name to JunkbusterNG -# - configure/configure.in: no change needed -# - GNUmakefile.in: -# - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz -# - PROGRAM = jbng@EXEEXT@ -# - rh-spec now references as junkbusterng-rh.spec -# - redhat-upload: references changed to junkbusterng-* (package names) -# - tarball-dist: references changed to JunkbusterNG-distribution-* -# - tarball-src: now JunkbusterNG-* -# - install: initscript now junkbusterng.init and junkbusterng (when -# installed) -# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec -# - junkbusterng.spec: -# - References to the expression ijb where changed where possible -# - New package name: junkbusterng (all in lower case, acording to -# the LSB recomendation) -# - Version changed to: 2.9.13 -# - Release: 1 -# - Added: junkbuster to obsoletes and conflicts (Not sure this is -# right. If it obsoletes, why conflict ? Have to check it later) -# - Summary changed: Stefan, please check and aprove it -# - Changes description to use the new name -# - Sed string was NOT changed. Have to wait to the manpage to -# change first -# - Keeping the user junkbuster for now. It will require some aditional -# changes on the script (scheduled for the next specfile release) -# - Added post entry to move the old logfile to the new log directory -# - Removing "chkconfig --add" entry (not good to have it automaticaly -# added to the startup list). -# - Added preun section to stop the service with the old name, as well -# as remove it from the startup list -# - Removed the chkconfig --del entry from the conditional block on -# the preun scriptlet (now handled on the %files section) -# - junkbuster.init: renamed to junkbusterng.init -# - junkbusterng.init: -# - Changed JB_BIN to jbng -# - Created JB_OBIN with the old value of JB_BIN (junkbuster), to -# be used where necessary (config dir) -# -# Aditional notes: -# - The config directory is /etc/junkbuster yet. Have to change it on the -# specfile, after it is changes on the code -# - The only files that got renamed on the cvs tree were the rh specfile and -# the init file. Some file references got changes on the makefile and on the -# rh-spec (as listed above) -# -# Revision 1.43 2002/03/21 16:04:10 hal9 -# added ijb_docs.css to %doc -# -# Revision 1.42 2002/03/12 13:41:18 sarantis -# remove hard-coded "ijbswa" string in build phase -# -# Revision 1.41 2002/03/11 22:58:32 hal9 -# Remove --enable-no-gifs -# -# Revision 1.39 2002/03/08 18:57:29 swa -# remove user junkbuster after de-installation. -# -# Revision 1.38 2002/03/08 13:45:27 morcego -# Adding libtool to Buildrequires -# -# Revision 1.37 2002/03/07 19:23:49 swa -# i hate to scroll. suse: wrong configdir. -# -# Revision 1.36 2002/03/07 05:06:54 morcego -# Fixed %pre scriptlet. And, as a bonus, you can even understand it now. :-) -# -# Revision 1.34 2002/03/07 00:11:57 morcego -# Few changes on the %pre and %post sections of the rh specfile to handle -# usernames more cleanly -# -# Revision 1.33 2002/03/05 13:13:57 morcego -# - Added "make redhat-dok" to the build phase -# - Added docbook-utils to BuildRequires -# -# Revision 1.32 2002/03/05 12:34:24 morcego -# - Changing section internaly on the manpage from 1 to 8 -# - We now require packages, not files, to avoid issues with apt -# -# Revision 1.31 2002/03/04 18:06:09 morcego -# SPECFILE: fixing permissing of the init script (broken by the last change) -# -# Revision 1.30 2002/03/04 16:18:03 morcego -# General cleanup of the rh specfile. -# -# %changelog -# * Mon Mar 04 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -# + junkbuster-2.9.11-2 -# - General specfile fixup, using the best recomended practices, including: -# - Adding -q to %%setup -# - Using macros whereever possible -# - Not using wildchars on %%files section -# - Doubling the percentage char on changelog and comments, to -# avoid rpm expanding them -# -# Revision 1.29 2002/03/03 19:21:22 hal9 -# Init script fails if shell is /bin/false. -# -# Revision 1.28 2002/01/09 18:34:03 hal9 -# nit. -# -# Revision 1.27 2002/01/09 18:32:02 hal9 -# Removed RPM_OPT_FLAGS kludge. -# -# Revision 1.26 2002/01/09 18:21:10 hal9 -# A few minor updates. -# -# Revision 1.25 2001/12/28 01:45:36 steudten -# Add paranoia check and BuildReq: gzip -# -# Revision 1.24 2001/12/01 21:43:14 hal9 -# Allowed for new ijb.action file. -# -# Revision 1.23 2001/11/06 12:09:03 steudten -# Compress doc files. Install README and AUTHORS at last as document. -# -# Revision 1.22 2001/11/05 21:37:34 steudten -# Fix to include the actual version for name. -# Let the 'real' packager be included - sorry stefan. -# -# Revision 1.21 2001/10/31 19:27:27 swa -# consistent description. new name for suse since -# we had troubles with rpms of identical names -# on the webserver. -# -# Revision 1.20 2001/10/24 15:45:49 hal9 -# To keep Thomas happy (aka correcting my mistakes) -# -# Revision 1.19 2001/10/15 03:23:59 hal9 -# Nits. -# -# Revision 1.17 2001/10/10 18:59:28 hal9 -# Minor change for init script. -# -# Revision 1.16 2001/09/24 20:56:23 hal9 -# Minor changes. -# -# Revision 1.13 2001/09/10 17:44:43 swa -# integrate three pieces of documentation. needs work. -# will not build cleanly under redhat. -# -# Revision 1.12 2001/09/10 16:25:04 swa -# copy all templates. version updated. -# -# Revision 1.11 2001/07/03 11:00:25 sarantis -# replaced permissionsfile with actionsfile -# -# Revision 1.10 2001/07/03 09:34:44 sarantis -# bumped up version number. -# -# Revision 1.9 2001/06/12 18:15:29 swa -# the %% in front of configure (see tag below) confused -# the rpm build process on 7.1. -# -# Revision 1.8 2001/06/12 17:15:56 swa -# fixes, because a clean build on rh6.1 was impossible. -# GZIP confuses make, %% configure confuses rpm, etc. -# -# Revision 1.7 2001/06/11 12:17:26 sarantis -# fix typo in %%post -# -# Revision 1.6 2001/06/11 11:28:25 sarantis -# Further optimizations and adaptations in the spec file. -# -# Revision 1.5 2001/06/09 09:14:11 swa -# shamelessly adapted RPM stuff from the newest rpm that -# RedHat provided for the JB. -# -# Revision 1.4 2001/06/08 20:54:18 swa -# type with status file. remove forward et. al from file list. -# -# Revision 1.3 2001/06/07 17:28:10 swa -# cosmetics -# -# Revision 1.2 2001/06/04 18:31:58 swa -# files are now prefixed with either `confdir' or `logdir'. -# `make redhat-dist' replaces both entries confdir and logdir -# with redhat values -# -# Revision 1.1 2001/06/04 10:44:57 swa -# `make redhatr-dist' now works. Except for the paths -# in the config file. -# -# -# diff --git a/external/privoxy/privoxy-suse.spec b/external/privoxy/privoxy-suse.spec deleted file mode 100644 index fc39938..0000000 --- a/external/privoxy/privoxy-suse.spec +++ /dev/null @@ -1,556 +0,0 @@ -# $Id: privoxy-suse.spec,v 1.33 2009/03/21 10:46:15 fabiankeil Exp $ -# -# Written by and Copyright (C) 2001-2006 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 privoxyconf %{_sysconfdir}/privoxy -%define privoxy_uid 73 -%define privoxy_gid 73 - - -Summary: Privoxy - privacy enhancing proxy -Vendor: Privoxy.Org -Name: privoxy-suse -Distribution: defineme -Version: 3.0.12 -Release: 1 -# Needs makefile change: Source: http://prdownloads.sourceforge.net/ijbswa/privoxy-%%7Bversion%7D-%%7Bstatus%... -Source: http://prdownloads.sourceforge.net/ijbswa/privoxy-%%7Bversion%7D.tar.gz -# not sure if this works -BuildRoot: %{_tmppath}/%{name}-%{version}-root -Packager: http://www.privoxy.org/ -License: GPL -Group: Networking/Utilities -URL: http://www.privoxy.org/ -Autoreqprov: on -BuildRequires: perl gzip libtool autoconf -Conflicts: junkbuster-raw junkbuster-blank junkbuster-suse junkbuster privoxy - -# -# ----------------------------------------------------------------------------- -# -%description -Privoxy is a web proxy with advanced filtering capabilities for -protecting privacy, modifying web page data, 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 Internet Junkbuster. - -Authors: --------- - http://www.privoxy.org/ - -SuSE series: n - -# -# ----------------------------------------------------------------------------- -# -%prep -%setup -c - -# -# ----------------------------------------------------------------------------- -# -%build -autoheader -autoconf -./configure --disable-dynamic-pcre -make - - -## 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}%{privoxyconf}/templates \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/init.d -gzip README AUTHORS ChangeLog privoxy.1 LICENSE || /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%{privoxyconf}/ -cp -f default.filter $RPM_BUILD_ROOT%{privoxyconf}/default.filter -cp -f trust $RPM_BUILD_ROOT%{privoxyconf}/trust -cp -f templates/* $RPM_BUILD_ROOT%{privoxyconf}/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/^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%{privoxyconf}/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 -u %{privoxy_uid} -g %{privoxy_gid} -l privoxy -d %{_sysconfdir}/privoxy -s "" junkbust > /dev/null 2>&1 - else -# -r does not work on suse. - /usr/sbin/groupadd -g %{privoxy_gid} privoxy - /usr/sbin/useradd -u %{privoxy_uid} -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 LICENSE.gz -%doc doc/webserver/developer-manual -%doc doc/webserver/user-manual -%doc doc/webserver/faq -%doc doc/webserver/p_doc.css -%doc doc/webserver/privoxy-index.html -%doc doc/webserver/images -%doc doc/webserver/man-page - -%dir %{privoxyconf} -%config %{privoxyconf}/* -%attr(0740,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 -* Wed Sep 20 2006 Hal Burgiss hal@foobox.net -- Bump version for 3.0.5. - -* Fri Sep 08 2006 Hal Burgiss hal@foobox.net -- Bump version for 3.0.4. - -* Wed Mar 26 2003 Andreas Oesterhelt andreas@oesterhelt.org -- Bump version for 3.0.2. - -* Wed Mar 19 2003 Hal Burgiss hal@foobox.net -- Bump version for 3.0.1. - -* Tue Aug 25 2002 Hal Burgiss hal@foobox.net -- Bump version for 3.0.0 :) - -* Tue Aug 06 2002 Hal Burgiss hal@foobox.net -- Reset version for 2.9.18. - -* Wed Jul 30 2002 Hal Burgiss hal@foobox.net -- Reset version for 2.9.17. - -* Sat Jul 27 2002 Hal Burgiss hal@foobox.net -- Reset version and release for 2.9.16. - -* Mon May 27 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Index.html is now privoxy-index.html for doc usage. - -* Mon May 27 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Index.html is now privoxy-index.html for doc usage. - -* Sat May 25 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Add html man page so index.html does not 404. - -* Fri May 24 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.15-1 -- Add doc/images directory. - -* Fri May 03 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-suse-2.9.15-1 -- Version bump - -* Fri Apr 26 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-suse-2.9.14-3 -- Changing Vendor to Privoxy.Org - -* Mon Apr 22 2002 Rodrigo Barbosa rodrigob@tisbrasil.com.br -+ privoxy-suse-2.9.14-2 -- Bumping release to reflect the new value on configure.in -- Taking the oportunity to change the header Copyright to License. The - Copyright headers is deprecated, and after all, GPL is a license, not a - Copyright - -* Mon Apr 08 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-4 -- Add LICENSE.gz, p_web.css, and index.html. Add autoconf -- to Buildrequires. - -* Wed Mar 27 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-3 -- Doc css has changed names. - -* Tue Mar 25 2002 Hal Burgiss hal@foobox.net -+ privoxy-2.9.13-3 -- Minor fix to description. - -* Sun Mar 24 2002 Hal Burgiss hal@foobox.net -- added faq to docs. - -* Thu Mar 21 2002 Hal Burgiss hal@foobox.net -- added ijb_docs.css to docs. - -* Mon Mar 11 2002 Hal Burgiss hal@foobox.net -- Remove --enable-no-gifs from configure. - -* Sun Mar 03 2002 Hal Burgiss hal@foobox.net -- /bin/false for shell causes init script to fail. Reverting. - -* Wed Jan 09 2002 Hal Burgiss hal@foobox.net -- Removed UID 73. Included user-manual and developer-manual in docs. - Include other actions files. Default shell is now /bin/false. - Userdel user=junkbust. ChangeLog was not zipped. Removed - RPM_OPT_FLAGS kludge. - -* Fri Dec 28 2001 Thomas Steudten thomas@steudten.ch -- add paranoia check for 'rm -rf $RPM_BUILD_ROOT' -- add gzip to 'BuildRequires' - -* Sat Dec 1 2001 Hal Burgiss hal@foobox.net -- actionsfile is now ijb.action. - -* Tue Nov 6 2001 Thomas Steudten thomas@steudten.ch -- Compress manpage -- Add more documents for installation -- Add version string to name and source - -* Wed Oct 24 2001 Hal Burigss hal@foobox.net -- Back to user 'junkbuster' and fix configure macro. - -* Wed Oct 10 2001 Hal Burigss hal@foobox.net -- More changes for user 'junkbust'. Init script had 'junkbuster'. - -* Sun Sep 23 2001 Hal Burgiss hal@foobox.net -- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files. -- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise. - -* Thu Sep 13 2001 Hal Burgiss hal@foobox.net -- Added $RPM_OPT_FLAGS support, renaming of old logfile, and -- made sure no default shell exists for user junkbust. - -* Sun Jun 3 2001 Stefan Waldherr stefan@waldherr.org -- rework of RPM -* Wed Feb 14 2001 - uli@suse.de -- fixed init script -* Wed Dec 06 2000 - bjacke@suse.de -- renamed package to junkbuster -- fixed copyright tag -* Thu Nov 30 2000 - uli@suse.de -- moved init script to /etc/init.d -* Wed Feb 16 2000 - kukuk@suse.de -- Move /usr/man -> /usr/share/man -- Mark /etc/ijb as "config(noreplace)" -* Mon Sep 20 1999 - uli@suse.de -- fixed init script -* Mon Sep 13 1999 - bs@suse.de -- ran old prepare_spec on spec file to switch to new prepare_spec. -* Thu Apr 01 1999 - daniel@suse.de -- do not start ijb as root (security) -* Tue Mar 30 1999 - daniel@suse.de -- donŽt use saclfile.ini -* Tue Mar 30 1999 - daniel@suse.de -- small fix to whitelist-configuration, - version is and was 2.0.2 WITHOUT Stefan Waldherr's patches - (http://www.waldherr.org/junkbuster/) -* Mon Mar 01 1999 - daniel@suse.de -- new package: version 2.0 - -# $Log: privoxy-suse.spec,v $ -# Revision 1.33 2009/03/21 10:46:15 fabiankeil -# Bump version to 3.0.12. -# -# Revision 1.32 2009/02/15 17:18:14 fabiankeil -# - Bump version to 3.0.11. -# -# Revision 1.31 2008/08/30 12:46:49 fabiankeil -# The jarfile directive is gone. Update accordingly. -# -# Revision 1.30 2008/08/13 16:57:46 fabiankeil -# Change version to 3.0.10. -# -# Revision 1.29 2008/03/02 17:36:43 fabiankeil -# Set version to 3.0.9. -# -# Revision 1.28 2008/01/20 14:30:59 fabiankeil -# Set version to 3.0.8. -# -# Revision 1.27 2006/11/18 14:37:12 fabiankeil -# Bump version to 3.0.6. -# -# Revision 1.26 2006/09/20 23:51:26 hal9 -# Bump versions to 3.0.5 -# -# Revision 1.25 2006/09/09 00:35:10 hal9 -# Bumped versions to 3.0.4. Both files should be checked further. -# -# Revision 1.24 2006/07/18 14:48:47 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.20.2.10 2004/01/30 17:09:29 oes -# Bumped version for 3.0.3 -# -# Revision 1.20.2.9 2003/03/26 00:24:58 oes -# Bump version for 3.0.2 -# -# Revision 1.20.2.8 2003/03/20 03:27:11 hal9 -# Bump version for 3.0.1 pending release. -# -# Revision 1.20.2.7 2002/08/25 23:36:03 hal9 -# Bump version for 3.0.0. -# -# Revision 1.20.2.6 2002/08/10 11:28:50 oes -# Bumped version -# -# Revision 1.20.2.5 2002/08/07 01:08:49 hal9 -# Bumped version to 2.9.18. -# -# Revision 1.20.2.4 2002/07/30 21:51:19 hal9 -# Bump version to 2.9.17. -# -# Revision 1.20.2.3 2002/07/27 15:47:10 hal9 -# Reset version and release for 2.9.16. -# -# Revision 1.20.2.2 2002/05/28 02:39:38 hal9 -# Replace index.html with privoxy-index.html for docs. -# -# Revision 1.20.2.1 2002/05/26 17:20:23 hal9 -# Add images to doc dirs. -# -# Revision 1.20 2002/05/25 02:08:23 hal9 -# Add doc/images directory. -# Redhat: alphabetized list of templates (and I think added one in the process) -# -# Revision 1.19 2002/05/03 17:14:36 morcego -# *.spec: Version bump to 2.9.15 -# -rh.spec: noreplace for %%{privoxyconf}/config -# Will interrupt the build if versions from configure.in and -# specfile do not match -# -# Revision 1.18 2002/04/27 20:26:59 swa -# uid, gui 73 incorporated -# -# Revision 1.17 2002/04/26 15:51:05 morcego -# Changing Vendor value to Privoxy.Org -# -# Revision 1.16 2002/04/22 16:32:31 morcego -# configure.in, *.spec: Bumping release to 2 (2.9.14-2) -# -rh.spec: uid and gid are now macros -# -suse.spec: Changing the header Copyright to License (Copyright is -# deprecable) -# -# Revision 1.15 2002/04/16 18:49:07 oes -# Build with static built-in pcre -# -# Revision 1.14 2002/04/11 17:57:40 oes -# Fixed(?) Conflicts: Provides: Obsoletes: -# -# Revision 1.13 2002/04/11 10:09:20 oes -# Version 2.9.14 -# -# Revision 1.12 2002/04/09 13:29:43 swa -# build suse and gen-dist with html docs. do not generate docs while building rpm -# -# Revision 1.11 2002/04/09 03:12:37 hal9 -# Add LICENSE, p_web.css and index.html. Add autoconf to buildrequires. -# -# Revision 1.10 2002/04/08 20:24:13 swa -# fixed JB spelling -# -# Revision 1.9 2002/03/30 09:01:52 swa -# new release -# -# Revision 1.8 2002/03/27 23:46:41 hal9 -# ijb_docs.css to p_doc.css -# -# Revision 1.7 2002/03/27 00:49:39 hal9 -# Minor fix to description. -# -# 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/external/privoxy/privoxy.1 b/external/privoxy/privoxy.1 deleted file mode 100644 index dca772a..0000000 --- a/external/privoxy/privoxy.1 +++ /dev/null @@ -1,216 +0,0 @@ -." This manpage has been automatically generated by docbook2man -." from a DocBook document. This tool can be found at: -." http://shell.ipoline.com/~elmert/comp/docbook2X/ -." Please send any bug reports, improvements, comments, patches, -." etc. to Steve Cheng steve@ggi-project.org. -.TH "PRIVOXY" "1" "21 March 2009" "Privoxy 3.0.12" "" -.SH NAME -privoxy - Privacy Enhancing Proxy -.SH SYNOPSIS - -\fBprivoxy\fR [\fB--help\fR ] [\fB--version\fR ] [\fB--no-daemon\fR ] [\fB--pidfile \fIpidfile\fB\fR ] [\fB--user \fIuser[.group]\fB\fR ] [\fB--chroot\fR ] [\fB--pre-chroot-nslookup \fIhostname\fB\fR ] [\fB\fIconfigfile\fB\fR ] - -.SH "OPTIONS" -.PP -\fBPrivoxy\fR may be invoked with the following command line -options: -.TP -\fB--help\fR -Print brief usage info and exit. -.TP -\fB--version\fR -Print version info and exit. -.TP -\fB--no-daemon\fR -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 \fIpidfile\fB\fR -On startup, write the process ID to \fIpidfile\fR. -Delete the \fIpidfile\fR on exit. -Failure to create or delete the \fIpidfile\fR -is non-fatal. If no \fB--pidfile\fR option is given, no PID file will be used. -.TP -\fB--user \fIuser[.group]\fB\fR -After (optionally) writing the PID file, assume the user ID of -\fIuser\fR and the GID of -\fIgroup\fR, or, if the optional -\fIgroup\fR was not given, the default group of -\fIuser\fR. Exit if the privileges are not -sufficient to do so. -.TP -\fB--chroot\fR -Before changing to the user ID given in the --user option, chroot to -that user's home directory, i.e. make the kernel pretend to the -\fBPrivoxy\fR process that the directory tree starts -there. If set up carefully, this can limit the impact of possible -vulnerabilities in \fBPrivoxy\fR to the files contained in -that hierarchy. -.TP -\fB--pre-chroot-nslookup \fIhostname\fB\fR -Initialize the resolver library using \fIhostname\fR -before chroot'ing. On some systems this reduces the number of files -that must be copied into the chroot tree. -.PP -If the \fIconfigfile\fR is not specified on the command line, -\fBPrivoxy\fR will look for a file named -\fIconfig\fR in the current directory. If no -\fIconfigfile\fR is found, \fBPrivoxy\fR will -fail to start. -.SH "DESCRIPTION" -.PP -Privoxy is a non-caching web proxy with advanced filtering capabilities -for enhancing privacy, modifying web page data and HTTP headers, controlling -access, and removing ads and other obnoxious Internet junk. Privoxy has a -flexible configuration and can be customized to suit individual needs and tastes. -It has application for both stand-alone systems and multi-user networks. -.PP -Privoxy is Free Software and licensed under the GPL2. -.SH "INSTALLATION AND USAGE" -.PP -Browsers can either be individually configured to use -\fBPrivoxy\fR as a HTTP proxy (recommended), -or \fBPrivoxy\fR can be combined with a packet -filter to build an intercepting proxy -(see \fIconfig\fR). The default setting is for -localhost, on port 8118 (configurable in the main config file). To set the -HTTP proxy in Firefox, go through: \fBTools\fR; -\fBOptions\fR; \fBGeneral\fR; -\fBConnection Settings\fR; -\fBManual Proxy Configuration\fR. -.PP -For Internet Explorer, go through: \fBTools\fR; -\fBInternet Properties\fR; \fBConnections\fR; -\fBLAN Settings\fR. -.PP -The Secure (SSL) Proxy should also be set to the same values, otherwise -https: URLs will not be proxied. Note: \fBPrivoxy\fR can only -proxy HTTP and HTTPS traffic. Do not try it with FTP or other protocols. -HTTPS presents some limitations, and not all features will work with HTTPS -connections. -.PP -For other browsers, check the documentation. -.SH "CONFIGURATION" -.PP -\fBPrivoxy\fR can be configured with the various configuration -files. The default configuration files are: \fIconfig\fR, -\fIdefault.filter\fR, \fIdefault.action\fR and -\fIdefault.action\fR. \fIuser.action\fR should -be used for locally defined exceptions to the default rules in -\fImatch-all.action\fR and \fIdefault.action\fR, -and \fIuser.filter\fR for locally defined filters. These are -well commented. On Unix and Unix-like systems, these are located in -\fI/etc/privoxy/\fR by default. -.PP -\fBPrivoxy\fR uses the concept of \fBactions\fR -in order to manipulate the data stream between the browser and remote sites. -There are various actions available with specific functions for such things -as blocking web sites, managing cookies, etc. These actions can be invoked -individually or combined, and used against individual URLs, or groups of URLs -that can be defined using wildcards and regular expressions. The result is -that the user has greatly enhanced control and freedom. -.PP -The actions list (ad blocks, etc) can also be configured with your -web browser at http://config.privoxy.org/ -(assuming the configuration allows it). -\fBPrivoxy's\fR configuration parameters can also be viewed at -the same page. In addition, \fBPrivoxy\fR can be toggled on/off. -This is an internal page, and does not require Internet access. -.PP -See the \fIUser Manual\fR for a detailed -explanation of installation, general usage, all configuration options, new -features and notes on upgrading. -.SH "FILES" - -.nf - - \fI/usr/sbin/privoxy\fR - \fI/etc/privoxy/config\fR - \fI/etc/privoxy/match-all.action\fR - \fI/etc/privoxy/default.action\fR - \fI/etc/privoxy/user.action\fR - \fI/etc/privoxy/default.filter\fR - \fI/etc/privoxy/user.filter\fR - \fI/etc/privoxy/trust\fR - \fI/etc/privoxy/templates/*\fR - \fI/var/log/privoxy/logfile\fR -.fi -.PP -Various other files should be included, but may vary depending on platform -and build configuration. Additional documentation should be included in the local -documentation directory. -.SH "SIGNALS" -.PP -\fBPrivoxy\fR terminates on the \fBSIGINT\fR, -\fBSIGTERM\fR and \fBSIGABRT\fR signals. Log -rotation scripts may cause a re-opening of the logfile by sending a -\fBSIGHUP\fR to \fBPrivoxy\fR. Note that unlike -other daemons, \fBPrivoxy\fR does not need to be made aware of -config file changes by \fBSIGHUP\fR -- it will detect them -automatically. -.SH "NOTES" -.PP -Please see the \fIUser Manual\fR on how to contact the -developers, for feature requests, reporting problems, and other questions. -.SH "SEE ALSO" -.PP -Other references and sites of interest to \fBPrivoxy\fR -users: -.PP - -http://www.privoxy.org/, -the \fBPrivoxy\fR Home page. - -http://www.privoxy.org/faq/, -the \fBPrivoxy\fR FAQ. - -http://www.privoxy.org/developer-manual/, -the \fBPrivoxy\fR developer manual. - -https://sourceforge.net/projects/ijbswa/, -the Project Page for \fBPrivoxy\fR on -SourceForge. - -http://config.privoxy.org/, -the web-based user interface. \fBPrivoxy\fR must be -running for this to work. Shortcut: http://p.p/ - -https://sourceforge.net/tracker/?group_id=11118&atid=460288, to submit ``misses'' and other -configuration related suggestions to the developers. -.SH "DEVELOPMENT TEAM" - -.nf - Fabian Keil, lead developer - David Schmidt, developer - - Hal Burgiss - Mark Miller - Gerry Murphy - Lee Rian - Roland Rosenfeld - J[:o]rg Strohmayer -.fi -.SH "COPYRIGHT AND LICENSE" -.SS "COPYRIGHT" -.PP -Copyright (C) 2001-2009 by Privoxy Developers ijbswa-developers@lists.sourceforge.net -.PP -Some source code is based on code Copyright (C) 1997 by Anonymous Coders -and Junkbusters, Inc. and licensed under the \fIGNU General Public -License\fR. -.SS "LICENSE" -.PP -\fBPrivoxy\fR is free software; you can -redistribute it and/or modify it under the terms of the -\fIGNU General Public License\fR, version 2, -as published by the Free Software Foundation. -.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 \fIGNU General Public License\fR for details. -.PP -You should have received a copy of the \fIGNU GPL\fR -along with this program; if not, write to the Free Software -Foundation, Inc. 51 Franklin Street, Fifth Floor -Boston, MA 02110-1301 -USA diff --git a/external/privoxy/privoxy.init b/external/privoxy/privoxy.init deleted file mode 100644 index 3b3caf9..0000000 --- a/external/privoxy/privoxy.init +++ /dev/null @@ -1,276 +0,0 @@ -#!/bin/sh -# -# This is file /etc/rc.d/init.d/privoxy and was put here -# by the privoxy rpm -# -# chkconfig: 2345 84 09 -# -# description: Web proxy with advanced filtering capabilities \ -# such as filtering web page content, managing \ -# cookies and removing ads -# - -# ******************************************************************** -# -# 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.11 2006/07/18 14:48:47 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.8.2.3 2002/12/10 20:52:16 kick_ -# better service description. This text will be shown when the user configures the services -# -# Revision 1.8.2.2 2002/08/05 08:42:13 kick_ -# same permissions, same runlevels as all the other initscripts -# -# Revision 1.8.2.1 2002/07/12 09:14:26 kick_ -# don't use ghost files for rcX.d/*, chkconfig is available to do this job. Enable translation of error messge -# -# Revision 1.8 2002/04/09 02:51:31 hal9 -# Changed $JB to $PRIVOXY. -# -# Revision 1.7 2002/04/08 14:54:51 morcego -# Moved the chkconfig comments to the begining of the file, couse Linuxconf -# was getting confused with it where it was. -# -# Revision 1.6 2002/03/26 22:29:55 swa -# we have a new homepage! -# -# 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. -# -# -# ********************************************************************/ - - -# Source function library. -. /etc/rc.d/init.d/functions - -. /etc/sysconfig/network - -# Check that networking is up. -[ ${NETWORKING} = "no" ] && exit 0 - -PRIVOXY_PRG="privoxy" -PRIVOXY_BIN="/usr/sbin/$PRIVOXY_PRG" -PRIVOXY_CONF="/etc/$PRIVOXY_PRG/config" -PRIVOXY_USER="privoxy" -PRIVOXY_PID=/var/run/$PRIVOXY_PRG.pid -PRIVOXY_LOCK=/var/lock/subsys/$PRIVOXY_PRG -PRIVOXY="$PRIVOXY_BIN --user $PRIVOXY_USER.$PRIVOXY_USER --pidfile $PRIVOXY_PID $PRIVOXY_CONF" - -# some checks for us -! [ -x $PRIVOXY_BIN ] && echo $"Can't find $PRIVOXY_BIN, exit." && exit 0 -! [ -f $PRIVOXY_CONF ] && echo $"Can't find $PRIVOXY_CONF, exit." && exit 0 - -# See how we were called. - -start () { - # start daemon - echo -n $"Starting $PRIVOXY_PRG: " - if [ -f $PRIVOXY_PID ]; then - killproc $PRIVOXY_PRG && rm -f $PRIVOXY_LOCK $PRIVOXY_PID - RETVAL=$? - [ $RETVAL != 0 ] && return $RETVAL - fi - daemon $PRIVOXY - RETVAL=$? - echo - [ $RETVAL = 0 ] && touch $PRIVOXY_LOCK - return $RETVAL -} - -stop () { - # stop daemon - echo -n $"Stopping $PRIVOXY_PRG: " - killproc $PRIVOXY_PRG && rm -f $PRIVOXY_LOCK $PRIVOXY_PID - RETVAL=$? - echo - return $RETVAL -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - reload) - if [ -f $PRIVOXY_PID ] ; then - kill -HUP `cat $PRIVOXY_PID` - RETVAL=$? - fi - ;; - restart) - stop - start - RETVAL=$? - ;; - condrestart) - # restart only if already running - if [ -f $PRIVOXY_PID ] ; then - stop - start - RETVAL=$? - fi - ;; - status) - status $PRIVOXY_PRG - RETVAL=$? - ;; - top) - if [ -f $PRIVOXY_PID ]; then - a="" - for i in `pidof $PRIVOXY_PRG` ; do - a="$a -p $i" - done - top $a - fi - ;; - *) - echo $"Usage: $PRIVOXY_PRG {start|stop|reload|restart|condrestart|status|top}" - exit 1 -esac - -exit $RETVAL diff --git a/external/privoxy/privoxy.init.suse b/external/privoxy/privoxy.init.suse deleted file mode 100644 index fee872a..0000000 --- a/external/privoxy/privoxy.init.suse +++ /dev/null @@ -1,127 +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.4 2006/07/18 14:48:47 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.3.2.1 2003/03/17 14:04:16 oes -# No longer use obsolete rc.config -# -# Revision 1.3 2002/03/26 22:29:55 swa -# we have a new homepage! -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.7 2002/03/11 11:44:46 oes -# Working in suggestions by Thorsten Kukuk kukuk@suse.de -# -# Revision 1.6 2002/03/09 14:56:34 swa -# wrong user.group -# -# Revision 1.5 2002/03/08 21:39:59 oes -# setgid to nogroup -# -# Revision 1.4 2002/03/05 19:54:37 oes -# Preliminary version of SuSE 8.0-certified init script ,-) -# -# Revision 1.3 2002/03/05 05:28:05 oes -# Added pidfile creation -# -# Revision 1.2 2001/09/10 16:25:46 swa -# jb did not start. none of the arguments worked. fixed. -# -# Revision 1.1 2001/06/08 20:53:36 swa -# use buildroot, export init to separate file (better manageability) -# -# -# -# ********************************************************************/ -### BEGIN INIT INFO -# Provides: privoxy -# Required-Start: $network $syslog $remote_fs -# Required-Stop: -# Default-Start: 3 5 -# Default-Stop: 0 1 2 6 -# Description: Starts Privoxy -### END INIT INFO - -. /etc/rc.status -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/external/privoxy/privoxy.logrotate b/external/privoxy/privoxy.logrotate deleted file mode 100644 index bbfe652..0000000 --- a/external/privoxy/privoxy.logrotate +++ /dev/null @@ -1,107 +0,0 @@ -# -# Logrotate file for Privoxy RPM -# -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/privoxy.logrotate,v $ -# -# Purpose : Rotates all potential Privoxy logfiles -# -# -# 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.logrotate,v $ -# Revision 1.6 2006/07/18 14:48:47 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.4.2.1 2002/06/25 17:33:07 kick_ -# Avoid error messages if privoxy hasn't run at all and there is no logfile yet by adding missingok to the logrotate script -# -# Revision 1.4 2002/03/26 22:29:55 swa -# we have a new homepage! -# -# 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 -# -# 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 -# with redhat values -# -# Revision 1.2 2001/05/24 07:52:24 swa -# added header. removed ^M. -# -# Revision 1.3 2001/05/24 07:41:33 swa -# added header -# -# -# -# ********************************************************************/ - -/var/log/privoxy/logfile { - missingok - compress - size 1M - postrotate - /sbin/service privoxy reload 2> /dev/null || true - endscript -} - -/var/log/privoxy/jarfile { - missingok - compress - size 1M - postrotate - /sbin/service privoxy reload 2> /dev/null || true - endscript -} diff --git a/external/privoxy/project.h b/external/privoxy/project.h deleted file mode 100644 index 300d9d6..0000000 --- a/external/privoxy/project.h +++ /dev/null @@ -1,1885 +0,0 @@ -#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED -/** Version string. */ -#define PROJECT_H_VERSION "$Id: project.h,v 1.129 2009/03/08 14:12:51 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/project.h,v $ - * - * Purpose : Defines data structures which are widely used in the - * project. Does not define any variables or functions - * (though it does declare some macros). - * - * Copyright : Written by and Copyright (C) 2001-2009 the - * 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: project.h,v $ - * Revision 1.129 2009/03/08 14:12:51 fabiankeil - * All the CSP_FLAG_FOO bit masks should be unsigned ints. - * - * Revision 1.128 2009/03/07 13:09:17 fabiankeil - * Change csp->expected_content and_csp->expected_content_length from - * size_t to unsigned long long to reduce the likelihood of integer - * overflows that would let us close the connection prematurely. - * Bug found while investigating #2669131, reported by cyberpatrol. - * - * Revision 1.127 2008/12/20 14:53:55 fabiankeil - * Add config option socket-timeout to control the time - * Privoxy waits for data to arrive on a socket. Useful - * in case of stale ssh tunnels or when fuzz-testing. - * - * Revision 1.126 2008/12/14 17:02:54 fabiankeil - * Fix a cparser warning. - * - * Revision 1.125 2008/11/20 08:22:28 fabiankeil - * Remove an obsolete comment. - * - * Revision 1.124 2008/11/16 12:43:49 fabiankeil - * Turn keep-alive support into a runtime feature - * that is disabled by setting keep-alive-timeout - * to a negative value. - * - * Revision 1.123 2008/11/10 16:55:59 fabiankeil - * Fix a gcc44 warning (in filters.c). - * - * Revision 1.122 2008/10/16 07:11:34 fabiankeil - * Fix a bunch of gcc44 conversion warnings. - * - * Revision 1.121 2008/10/09 18:21:41 fabiankeil - * Flush work-in-progress changes to keep outgoing connections - * alive where possible. Incomplete and mostly #ifdef'd out. - * - * Revision 1.120 2008/09/21 13:36:52 fabiankeil - * If change-x-forwarded-for{add} is used and the client - * sends multiple X-Forwarded-For headers, append the client's - * IP address to each one of them. "Traditionally" we would - * lose all but the last one. - * - * Revision 1.119 2008/09/20 10:04:33 fabiankeil - * Remove hide-forwarded-for-headers action which has - * been obsoleted by change-x-forwarded-for{block}. - * - * Revision 1.118 2008/09/19 15:26:29 fabiankeil - * Add change-x-forwarded-for{} action to block or add - * X-Forwarded-For headers. Mostly based on code removed - * before 3.0.7. - * - * Revision 1.117 2008/08/30 12:03:07 fabiankeil - * Remove FEATURE_COOKIE_JAR. - * - * Revision 1.116 2008/05/20 16:05:02 fabiankeil - * Move parsers structure definition from project.h to parsers.h. - * - * Revision 1.115 2008/05/19 16:57:20 fabiankeil - * Declare all members of the parsers structure immutable. - * - * Revision 1.114 2008/04/11 16:35:39 fabiankeil - * Oops, I forgot to shorten the URL_SPEC_INITIALIZER in my last commit. - * - * Revision 1.113 2008/04/10 14:41:04 fabiankeil - * Ditch url_spec's path member now that it's no longer used. - * - * Revision 1.112 2008/04/06 15:18:34 fabiankeil - * Oh well, rename the --enable-pcre-host-patterns option to - * --enable-extended-host-patterns as it's not really PCRE syntax. - * - * Revision 1.111 2008/04/06 14:54:26 fabiankeil - * Use PCRE syntax in host patterns when configured - * with --enable-pcre-host-patterns. - * - * Revision 1.110 2008/03/29 12:13:46 fabiankeil - * Remove send-wafer and send-vanilla-wafer actions. - * - * Revision 1.109 2008/03/28 15:13:41 fabiankeil - * Remove inspect-jpegs action. - * - * Revision 1.108 2008/03/27 18:27:36 fabiankeil - * Remove kill-popups action. - * - * Revision 1.107 2008/03/26 18:07:08 fabiankeil - * Add hostname directive. Closes PR#1918189. - * - * Revision 1.106 2008/03/24 11:21:03 fabiankeil - * Share the action settings for multiple patterns in the same - * section so we waste less memory for gigantic block lists - * (and load them slightly faster). Reported by Franz Schwartau. - * - * Revision 1.105 2008/03/21 11:16:27 fabiankeil - * Garbage-collect csp->my_ip_addr_str and csp->my_hostname. - * - * Revision 1.104 2008/03/04 18:30:40 fabiankeil - * Remove the treat-forbidden-connects-like-blocks action. We now - * use the "blocked" page for forbidden CONNECT requests by default. - * - * Revision 1.103 2008/03/01 14:00:45 fabiankeil - * Let the block action take the reason for the block - * as argument and show it on the "blocked" page. - * - * Revision 1.102 2008/02/03 13:46:14 fabiankeil - * Add SOCKS5 support. Patch #1862863 by Eric M. Hopper with minor changes. - * - * Revision 1.101 2007/12/07 18:29:23 fabiankeil - * Remove now-obsolete csp member x_forwarded. - * - * Revision 1.100 2007/09/02 13:42:11 fabiankeil - * - Allow port lists in url patterns. - * - Ditch unused url_spec member pathlen. - * - * Revision 1.99 2007/07/21 11:51:36 fabiankeil - * As Hal noticed, checking dispatch_cgi() as the last cruncher - * looks like a bug if CGI requests are blocked unintentionally, - * so don't do it unless the user enabled the new config option - * "allow-cgi-request-crunching". - * - * Revision 1.98 2007/07/14 07:31:26 fabiankeil - * Add new csp->content_type flag (CT_DECLARED). - * - * Revision 1.97 2007/05/27 12:38:08 fabiankeil - * - Remove some left-overs from the switch to dedicated header filters. - * - Adjust "X-Filter: No" to disable dedicated header filters. - * - Prepare for forward-override{} - * - * Revision 1.96 2007/05/14 10:41:15 fabiankeil - * Ditch the csp member cookie_list[] which isn't used anymore. - * - * Revision 1.95 2007/04/30 15:02:19 fabiankeil - * Introduce dynamic pcrs jobs that can resolve variables. - * - * Revision 1.94 2007/04/15 16:39:21 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.93 2007/03/20 15:16:34 fabiankeil - * Use dedicated header filter actions instead of abusing "filter". - * Replace "filter-client-headers" and "filter-client-headers" - * with "server-header-filter" and "client-header-filter". - * - * Revision 1.92 2007/03/17 15:20:05 fabiankeil - * New config option: enforce-blocks. - * - * Revision 1.91 2007/03/05 13:28:03 fabiankeil - * Add some CSP_FLAGs for the header parsers. - * - * Revision 1.90 2007/02/07 10:36:16 fabiankeil - * Add new http_response member to save - * the reason why the response was generated. - * - * Revision 1.89 2007/01/27 13:09:16 fabiankeil - * Add new config option "templdir" to - * change the templates directory. - * - * Revision 1.88 2007/01/25 13:36:59 fabiankeil - * Add csp->error_message for failure reasons - * that should be embedded into the CGI pages. - * - * Revision 1.87 2007/01/01 19:36:37 fabiankeil - * Integrate a modified version of Wil Mahan's - * zlib patch (PR #895531). - * - * Revision 1.86 2006/12/31 17:56:37 fabiankeil - * Added config option accept-intercepted-requests - * and disabled it by default. - * - * Revision 1.85 2006/12/31 15:03:31 fabiankeil - * Fix gcc43 compiler warnings and a comment. - * - * Revision 1.84 2006/12/21 12:57:48 fabiankeil - * Add config option "split-large-forms" - * to work around the browser bug reported - * in BR #1570678. - * - * Revision 1.83 2006/12/06 19:26:29 fabiankeil - * Moved HTTP snipplets into jcc.c. They aren't - * used anywhere else. - * - * Revision 1.82 2006/09/20 15:50:31 fabiankeil - * Doubled size of HOSTENT_BUFFER_SIZE to mask - * problems with gethostbyname_r and some - * /etc/hosts configurations. Only a workaround - * until we get the real fix ready. - * Thanks Félix Rauch for reporting. - * - * Increased value of MAX_TRUSTED_REFERRERS from 64 to 512. - * - * Revision 1.81 2006/09/06 13:03:04 fabiankeil - * Respond with 400 and a short text message - * if the client tries to use Privoxy as FTP proxy. - * - * Revision 1.80 2006/09/06 10:43:32 fabiankeil - * Added config option enable-remote-http-toggle - * to specify if Privoxy should recognize special - * headers (currently only X-Filter) to change its - * behaviour. Disabled by default. - * - * Revision 1.79 2006/09/06 09:23:37 fabiankeil - * Make number of retries in case of forwarded-connect problems - * a config file option (forwarded-connect-retries) and use 0 as - * default. - * - * Revision 1.78 2006/08/31 16:25:06 fabiankeil - * Work around a buffer overflow that caused Privoxy to - * segfault if too many trusted referrers were used. Good - * enough for now, but should be replaced with a real - * solution after the next release. - * - * Revision 1.77 2006/08/21 12:50:51 david__schmidt - * Formatting cleanup - * - * Revision 1.76 2006/08/14 08:25:19 fabiankeil - * Split filter-headers{} into filter-client-headers{} - * and filter-server-headers{}. - * Added parse_header_time() to share some code. - * Replaced timegm() with mktime(). - * - * Revision 1.75 2006/08/03 02:46:41 david__schmidt - * Incorporate Fabian Keil's patch work: * http://www.fabiankeil.de/sourcecode/privoxy/ - * - * Revision 1.74 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.72.2.7 2006/01/29 23:10:56 david__schmidt - * Multiple filter file support - * - * Revision 1.72.2.6 2004/10/03 12:53:46 david__schmidt - * Add the ability to check jpeg images for invalid - * lengths of comment blocks. Defensive strategy - * against the exploit: - * Microsoft Security Bulletin MS04-028 - * Buffer Overrun in JPEG Processing (GDI+) Could - * Allow Code Execution (833987) - * Enabled with +inspect-jpegs in actions files. - * - * Revision 1.72.2.5 2004/01/30 15:29:29 oes - * Updated the copyright note - * - * Revision 1.72.2.4 2004/01/13 16:12:14 oes - * Fixed double slash in USER_MANUAL_URL. Closes BR #867088. - * - * Revision 1.72.2.3 2003/03/11 11:54:37 oes - * Introduced RC_FLAG_* flags for use in child process return code - * - * Revision 1.72.2.2 2002/11/28 18:15:44 oes - * Added flag to each cgi_dispatcher that allows or denies - * external linking and removed const qualifier from - * struct list_entry.str. - * - * Revision 1.72.2.1 2002/08/10 11:25:18 oes - * - Include config.h for access to config data - * - Include <pcre*.h> depending on where they are - * - * Revision 1.72 2002/05/14 21:35:49 oes - * Split HELP_LINK_PREFIX into ACTIONS_HELP_PREFIX and CONFIG_HELP_PREFIX - * because of split in user-manual - * - * Revision 1.71 2002/05/12 21:39:36 jongfoster - * - Adding Doxygen-style comments to structures and #defines. - * - * Revision 1.70 2002/05/12 16:05:50 jongfoster - * Fixing ACTION_MASK_ALL to be unsigned long rather than - * just unsigned int. I don't know if anyone is porting - * Privoxy to 16-bit platforms, but if so, +limit-connect - * wouldn't have worked because of this bug. - * - * Revision 1.69 2002/05/08 16:00:16 oes - * Added size member to struct iob, so it can - * be alloced larger than needed. - * - * Revision 1.68 2002/04/26 12:56:00 oes - * Killed REDIRECT_URL, added USER_MANUAL_URL and HELP_LINK_PREFIX - * - * Revision 1.67 2002/04/24 02:12:43 oes - * - Jon's multiple AF patch: - * - Make csp->actions_list an array - * - #define MAX_AF_FILES - * - Moved CGI_PARAM_LEN_MAX (500) here - * - * Revision 1.66 2002/04/15 19:06:43 jongfoster - * Typos - * - * Revision 1.65 2002/04/04 00:36:36 gliptak - * always use pcre for matching - * - * Revision 1.64 2002/04/03 22:28:03 gliptak - * Removed references to gnu_regex - * - * Revision 1.63 2002/03/31 17:19:00 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.62 2002/03/26 22:48:49 swa - * new homepage url - * - * 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 - * - Introduced http_response.head_length - * - Introduced config.my_ip_addr_str, config.my_hostname, - * config.admin_address and config.proxy_info_url - * - Removed config.proxy_args_header and config.proxy_args_trailer, - * renamed config.proxy_args_invocation to config.proxy_args - * - Removed HTML snipplets and GIFs - * - Removed logentry from cancelled commit - * - * Revision 1.18 2001/06/09 10:57:39 jongfoster - * Adding definition of BUFFER_SIZE. - * Changing struct cgi_dispatcher to use "const" strings. - * - * Revision 1.17 2001/06/07 23:15:09 jongfoster - * Merging ACL and forward files into config file. - * Moving struct gateway members into struct forward_spec - * Removing config->proxy_args_gateways - * Cosmetic: Adding a few comments - * - * Revision 1.16 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.15 2001/06/04 11:28:53 swa - * redirect did not work due to missing / - * - * Revision 1.14 2001/06/03 11:03:48 oes - * Added struct map, - * added struct http_response, - * changed struct interceptors to struct cgi_dispatcher, - * moved HTML stuff to cgi.h - * - * Revision 1.13 2001/06/01 20:05:36 jongfoster - * Support for +image-blocker{}: added ACTION_IMAGE_BLOCKER - * constant, and removed csp->tinygif. - * - * Revision 1.12 2001/06/01 18:49:17 jongfoster - * Replaced "list_share" with "list" - the tiny memory gain was not - * worth the extra complexity. - * - * Revision 1.11 2001/06/01 10:32:47 oes - * Added constants for anchoring selection bitmap - * - * Revision 1.10 2001/05/31 21:33:53 jongfoster - * Changes for new actions file, replacing permissionsfile - * and parts of the config file. Also added support for - * list_shared. - * - * Revision 1.9 2001/05/31 17:32:31 oes - * - * - Enhanced domain part globbing with infix and prefix asterisk - * matching and optional unanchored operation - * - * Revision 1.8 2001/05/29 20:09:15 joergs - * HTTP_REDIRECT_TEMPLATE fixed. - * - * Revision 1.7 2001/05/29 09:50:24 jongfoster - * Unified blocklist/imagelist/actionslist. - * 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.6 2001/05/27 22:17:04 oes - * - * - re_process_buffer no longer writes the modified buffer - * to the client, which was very ugly. It now returns the - * buffer, which it is then written by chat. - * - * - content_length now adjusts the Content-Length: header - * for modified documents rather than crunch()ing it. - * (Length info in csp->content_length, which is 0 for - * unmodified documents) - * - * - For this to work, sed() is called twice when filtering. - * - * 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 - * 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.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 "actionsfile". - * - 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 - * - * - *********************************************************************/ - - -/* Declare struct FILE for vars and funcs. */ -#include <stdio.h> - -/* Need time_t for file_list */ -#include <time.h> -/* Needed for pcre choice */ -#include "config.h" - -/* - * Include appropriate regular expression libraries. - * Note that pcrs and pcre (native) are needed for cgi - * and are included anyway. - */ - -#ifdef STATIC_PCRE -# include "pcre.h" -#else -# ifdef PCRE_H_IN_SUBDIR -# include <pcre/pcre.h> -# else -# include <pcre.h> -# endif -#endif - -#ifdef STATIC_PCRS -# include "pcrs.h" -#else -# include <pcrs.h> -#endif - -#ifdef STATIC_PCRE -# include "pcreposix.h" -#else -# ifdef PCRE_H_IN_SUBDIR -# include <pcre/pcreposix.h> -# else -# include <pcreposix.h> -# endif -#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... - */ -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - -typedef SOCKET jb_socket; - -#define JB_INVALID_SOCKET INVALID_SOCKET - -#else /* ndef _WIN32 */ - -/** - * The type used by sockets. On UNIX it's an int. Microsoft decided to - * make it an unsigned. - */ -typedef int jb_socket; - -/** - * The error value used for variables of type jb_socket. On UNIX this - * is -1, however Microsoft decided to make socket handles unsigned, so - * they use a different value. - */ - -#define JB_INVALID_SOCKET (-1) - -#endif /* ndef _WIN32 */ - - -/** - * A standard error code. This should be JB_ERR_OK or one of the JB_ERR_xxx - * series of errors. - */ -typedef int 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. */ -#define JB_ERR_COMPRESS 6 /**< Error on decompression */ - -/** - * This macro is used to free a pointer that may be NULL. - * It also sets the variable to NULL after it's been freed. - * The paramater should be a simple variable without side effects. - */ -#define freez(X) { if(X) { free((void*)X); X = NULL ; } } - - -/** - * Fix a problem with Solaris. There should be no effect on other - * platforms. - * - * Solaris's isspace() is a macro which uses it's argument directly - * as an array index. Therefore we need to make sure that high-bit - * characters generate +ve values, and ideally we also want to make - * the argument match the declared parameter type of "int". - * - * Note: Remember to #include <ctype.h> if you use these macros. - */ -#define ijb_toupper(__X) toupper((int)(unsigned char)(__X)) -#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) -#define ijb_isspace(__X) isspace((int)(unsigned char)(__X)) - -/** - * Use for statically allocated buffers if you have no other choice. - * Remember to check the length of what you write into the buffer - * - we don't want any buffer overflows! - */ -#define BUFFER_SIZE 5000 - -/** - * Max length of CGI parameters (arbitrary limit). - */ -#define CGI_PARAM_LEN_MAX 500U - -/** - * 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. - */ -/** - * XXX: Temporary doubled, for some configurations - * 1K is still too small and we didn't get the - * real fix ready for inclusion. - */ -#define HOSTENT_BUFFER_SIZE 2048 - -/** - * Do not use. Originally this was so that you can - * say "while (FOREVER) { ...do something... }". - * However, this gives a warning with some compilers (e.g. VC++). - * Instead, use "for (;;) { ...do something... }". - */ -#define FOREVER 1 - -/** - * Default IP address to listen on, as a string. - * Set to "127.0.0.1". - */ -#define HADDR_DEFAULT "127.0.0.1" - -/** - * Default port to listen on, as a number. - * Set to 8118. - */ -#define HADDR_PORT 8118 - - -/* Forward def for struct client_state */ -struct configuration_spec; - - -/** - * Entry in a linked list of strings. - */ -struct list_entry -{ - /** - * The string pointer. It must point to a dynamically malloc()ed - * string or be NULL for the list functions to work. In the latter - * case, just be careful next time you iterate through the list in - * your own code. - */ - char *str; - - /** Next entry in the linked list, or NULL if no more. */ - struct list_entry *next; -}; - -/** - * A header for a linked list of strings. - */ -struct list -{ - /** First entry in the list, or NULL if the list is empty. */ - struct list_entry *first; - - /** Last entry in the list, or NULL if the list is empty. */ - struct list_entry *last; -}; - - -/** - * An entry in a map. This is a name=value pair. - */ -struct map_entry -{ - /** The key for the map. */ - const char *name; - /** The value associated with that key. */ - const char *value; - /** The next map entry, or NULL if none. */ - struct map_entry *next; -}; - -/** - * A map from a string to another string. - * This is used for the paramaters passed in a HTTP GET request, and - * to store the exports when the CGI interface is filling in a template. - */ -struct map -{ - /** The first map entry, or NULL if the map is empty. */ - struct map_entry *first; - /** The last map entry, or NULL if the map is empty. */ - struct map_entry *last; -}; - - -/** - * A HTTP request. This includes the method (GET, POST) and - * the parsed URL. - * - * This is also used whenever we want to match a URL against a - * URL pattern. This always contains the URL to match, and never - * a URL pattern. (See struct url_spec). - */ -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) */ -}; - -/** - * Reasons for generating a http_response instead of delivering - * the requested resource. Mostly ordered the way they are checked - * for in chat(). - */ -#define RSP_REASON_UNSUPPORTED 1 -#define RSP_REASON_BLOCKED 2 -#define RSP_REASON_UNTRUSTED 3 -#define RSP_REASON_REDIRECTED 4 -#define RSP_REASON_CGI_CALL 5 -#define RSP_REASON_NO_SUCH_DOMAIN 6 -#define RSP_REASON_FORWARDING_FAILED 7 -#define RSP_REASON_CONNECT_FAILED 8 -#define RSP_REASON_OUT_OF_MEMORY 9 -#define RSP_REASON_INTERNAL_ERROR 10 - -/** - * Response generated by CGI, blocker, or error handler - */ -struct http_response -{ - 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 browser (e.g. images). */ - int reason; /**< Why the response was generated in the first place. */ -}; - -/** - * A URL or a tag pattern. - */ -struct url_spec -{ - /** The string which was parsed to produce this url_spec. - Used for debugging or display only. */ - char *spec; - -#ifdef FEATURE_EXTENDED_HOST_PATTERNS - regex_t *host_regex;/**< Regex for host matching */ -#else - char *dbuffer; /**< Buffer with '\0'-delimited domain name, or NULL to match all hosts. */ - 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. */ -#endif /* defined FEATURE_EXTENDED_HOST_PATTERNS */ - - char *port_list; /**< List of acceptable ports, or NULL to match all ports */ - - regex_t *preg; /**< Regex for matching path part */ - regex_t *tag_regex; /**< Regex for matching tags */ -}; - -/** - * If you declare a static url_spec, this is the value to initialize it to zero. - */ -#ifndef FEATURE_EXTENDED_HOST_PATTERNS -#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, NULL, NULL, NULL } -#else -#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, NULL, NULL } -#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */ - -/** - * Constant for host part matching in URLs. If set, indicates that the start of - * the pattern must match the start of the URL. E.g. this is not set for the - * pattern ".example.com", so that it will match both "example.com" and - * "www.example.com". It is set for the pattern "example.com", which makes it - * match "example.com" only, not "www.example.com". - */ -#define ANCHOR_LEFT 1 - -/** - * Constant for host part matching in URLs. If set, indicates that the end of - * the pattern must match the end of the URL. E.g. this is not set for the - * pattern "ad.", so that it will match any host called "ad", irrespective - * of how many subdomains are in the fully-qualified domain name. - */ -#define ANCHOR_RIGHT 2 - - -/** - * An I/O buffer. Holds a string which can be appended to, and can have data - * removed from the beginning. - */ -struct iob -{ - char *buf; /**< Start of buffer */ - char *cur; /**< Start of relevant data */ - char *eod; /**< End of relevant data */ - size_t size; /**< Size as malloc()ed */ -}; - - -/** - * Return the number of bytes in the I/O buffer associated with the passed - * client_state pointer. - * May be zero. - */ -#define IOB_PEEK(CSP) ((CSP->iob->cur > CSP->iob->eod) ? (CSP->iob->eod - CSP->iob->cur) : 0) - - -/** - * Remove any data in the I/O buffer associated with the passed - * client_state pointer. - */ -#define IOB_RESET(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob)); - -/* Bits for csp->content_type bitmask: */ -#define CT_TEXT 0x0001U /**< Suitable for pcrs filtering. */ -#define CT_GIF 0x0002U /**< Suitable for GIF filtering. */ -#define CT_TABOO 0x0004U /**< DO NOT filter, irrespective of other flags. */ - -/* Although these are not, strictly speaking, content types - * (they are content encodings), it is simple to handle them - * as such. - */ -#define CT_GZIP 0x0010U /**< gzip-compressed data. */ -#define CT_DEFLATE 0x0020U /**< zlib-compressed data. */ - -/** - * Flag to signal that the server declared the content type, - * so we can differentiate between unknown and undeclared - * content types. - */ -#define CT_DECLARED 0x0040U - -/** - * The mask which includes all actions. - */ -#define ACTION_MASK_ALL (~0UL) - -/** - * The most compatible set of actions - i.e. none. - */ -#define ACTION_MOST_COMPATIBLE 0x00000000UL - -/** Action bitmap: Block the request. */ -#define ACTION_BLOCK 0x00000001UL -/** Action bitmap: Deanimate if it's a GIF. */ -#define ACTION_DEANIMATE 0x00000002UL -/** Action bitmap: Downgrade HTTP/1.1 to 1.0. */ -#define ACTION_DOWNGRADE 0x00000004UL -/** Action bitmap: Fast redirects. */ -#define ACTION_FAST_REDIRECTS 0x00000008UL -/** Action bitmap: Remove or add "X-Forwarded-For" header. */ -#define ACTION_CHANGE_X_FORWARDED_FOR 0x00000010UL -/** Action bitmap: Hide "From" header. */ -#define ACTION_HIDE_FROM 0x00000020UL -/** Action bitmap: Hide "Referer" header. (sic - follow HTTP, not English). */ -#define ACTION_HIDE_REFERER 0x00000040UL -/** Action bitmap: Hide "User-Agent" and similar headers. */ -#define ACTION_HIDE_USER_AGENT 0x00000080UL -/** Action bitmap: This is an image. */ -#define ACTION_IMAGE 0x00000100UL -/** Action bitmap: Sets the image blocker. */ -#define ACTION_IMAGE_BLOCKER 0x00000200UL -/** Action bitmap: Prevent compression. */ -#define ACTION_NO_COMPRESSION 0x00000400UL -/** Action bitmap: Change cookies to session only cookies. */ -#define ACTION_NO_COOKIE_KEEP 0x00000800UL -/** Action bitmap: Block rending cookies. */ -#define ACTION_NO_COOKIE_READ 0x00001000UL -/** Action bitmap: Block setting cookies. */ -#define ACTION_NO_COOKIE_SET 0x00002000UL -/** Action bitmap: Override the forward settings in the config file */ -#define ACTION_FORWARD_OVERRIDE 0x00004000UL -/** Action bitmap: Block as empty document */ -#define ACTION_HANDLE_AS_EMPTY_DOCUMENT 0x00008000UL -/** Action bitmap: Limit CONNECT requests to safe ports. */ -#define ACTION_LIMIT_CONNECT 0x00010000UL -/** Action bitmap: Redirect request. */ -#define ACTION_REDIRECT 0x00020000UL -/** Action bitmap: Crunch or modify "if-modified-since" header. */ -#define ACTION_HIDE_IF_MODIFIED_SINCE 0x00040000UL -/** Action bitmap: Overwrite Content-Type header. */ -#define ACTION_CONTENT_TYPE_OVERWRITE 0x00080000UL -/** Action bitmap: Crunch specified server header. */ -#define ACTION_CRUNCH_SERVER_HEADER 0x00100000UL -/** Action bitmap: Crunch specified client header */ -#define ACTION_CRUNCH_CLIENT_HEADER 0x00200000UL -/** Action bitmap: Enable text mode by force */ -#define ACTION_FORCE_TEXT_MODE 0x00400000UL -/** Action bitmap: Enable text mode by force */ -#define ACTION_CRUNCH_IF_NONE_MATCH 0x00800000UL -/** Action bitmap: Enable content-dispostion crunching */ -#define ACTION_HIDE_CONTENT_DISPOSITION 0x01000000UL -/** Action bitmap: Replace or block Last-Modified header */ -#define ACTION_OVERWRITE_LAST_MODIFIED 0x02000000UL -/** Action bitmap: Replace or block Accept-Language header */ -#define ACTION_HIDE_ACCEPT_LANGUAGE 0x04000000UL - - -/** Action string index: How to deanimate GIFs */ -#define ACTION_STRING_DEANIMATE 0 -/** Action string index: Replacement for "From:" header */ -#define ACTION_STRING_FROM 1 -/** Action string index: How to block images */ -#define ACTION_STRING_IMAGE_BLOCKER 2 -/** Action string index: Replacement for "Referer:" header */ -#define ACTION_STRING_REFERER 3 -/** Action string index: Replacement for "User-Agent:" header */ -#define ACTION_STRING_USER_AGENT 4 -/** Action string index: Legal CONNECT ports. */ -#define ACTION_STRING_LIMIT_CONNECT 5 -/** Action string index: Server headers containing this pattern are crunched*/ -#define ACTION_STRING_SERVER_HEADER 6 -/** Action string index: Client headers containing this pattern are crunched*/ -#define ACTION_STRING_CLIENT_HEADER 7 -/** Action string index: Replacement for the "Accept-Language:" header*/ -#define ACTION_STRING_LANGUAGE 8 -/** Action string index: Replacement for the "Content-Type:" header*/ -#define ACTION_STRING_CONTENT_TYPE 9 -/** Action string index: Replacement for the "content-dispostion:" header*/ -#define ACTION_STRING_CONTENT_DISPOSITION 10 -/** Action string index: Replacement for the "If-Modified-Since:" header*/ -#define ACTION_STRING_IF_MODIFIED_SINCE 11 -/** Action string index: Replacement for the "Last-Modified:" header. */ -#define ACTION_STRING_LAST_MODIFIED 12 -/** Action string index: Redirect URL */ -#define ACTION_STRING_REDIRECT 13 -/** Action string index: Decode before redirect? */ -#define ACTION_STRING_FAST_REDIRECTS 14 -/** Action string index: Overriding forward rule. */ -#define ACTION_STRING_FORWARD_OVERRIDE 15 -/** Action string index: Reason for the block. */ -#define ACTION_STRING_BLOCK 16 -/** Action string index: what to do with the "X-Forwarded-For" header. */ -#define ACTION_STRING_CHANGE_X_FORWARDED_FOR 17 -/** Number of string actions. */ -#define ACTION_STRING_COUNT 18 - - -/* To make the ugly hack in sed easier to understand */ -#define CHECK_EVERY_HEADER_REMAINING 0 - - -/** Index into current_action_spec::multi[] for headers to add. */ -#define ACTION_MULTI_ADD_HEADER 0 -/** Index into current_action_spec::multi[] for content filters to apply. */ -#define ACTION_MULTI_FILTER 1 -/** Index into current_action_spec::multi[] for server-header filters to apply. */ -#define ACTION_MULTI_SERVER_HEADER_FILTER 2 -/** Index into current_action_spec::multi[] for client-header filters to apply. */ -#define ACTION_MULTI_CLIENT_HEADER_FILTER 3 -/** Index into current_action_spec::multi[] for client-header tags to apply. */ -#define ACTION_MULTI_CLIENT_HEADER_TAGGER 4 -/** Index into current_action_spec::multi[] for server-header tags to apply. */ -#define ACTION_MULTI_SERVER_HEADER_TAGGER 5 -/** Number of multi-string actions. */ -#define ACTION_MULTI_COUNT 6 - - -/** - * This structure contains a list of actions to apply to a URL. - * It only contains positive instructions - no "-" options. - * It is not used to store the actions list itself, only for - * url_actions() to return the current values. - */ -struct current_action_spec -{ - /** Actions to apply. A bit set to "1" means perform the action. */ - unsigned long flags; - - /** - * Paramaters for those actions that require them. - * Each entry is valid if & only if the corresponding entry in "flags" is - * set. - */ - char * string[ACTION_STRING_COUNT]; - - /** Lists of strings for multi-string actions. */ - struct list multi[ACTION_MULTI_COUNT][1]; -}; - - -/** - * This structure contains a set of changes to actions. - * It can contain both positive and negative instructions. - * It is used to store an entry in the actions list. - */ -struct action_spec -{ - unsigned long mask; /**< Actions to keep. A bit set to "0" means remove action. */ - unsigned long add; /**< Actions to add. A bit set to "1" means add action. */ - - /** - * Paramaters for those actions that require them. - * Each entry is valid if & only if the corresponding entry in "flags" is - * set. - */ - char * string[ACTION_STRING_COUNT]; - - /** Lists of strings to remove, for multi-string actions. */ - struct list multi_remove[ACTION_MULTI_COUNT][1]; - - /** If nonzero, remove *all* strings from the multi-string action. */ - int multi_remove_all[ACTION_MULTI_COUNT]; - - /** Lists of strings to add, for multi-string actions. */ - struct list multi_add[ACTION_MULTI_COUNT][1]; -}; - - -/** - * This structure is used to store action files. - * - * It contains an URL or tag pattern, and the changes to - * the actions. It's a linked list and should only be - * free'd through unload_actions_file() unless there's - * only a single entry. - */ -struct url_actions -{ - struct url_spec url[1]; /**< The URL or tag pattern. */ - - struct action_spec *action; /**< Action settings that might be shared with - the list entry before or after the current - one and can't be free'd willy nilly. */ - - struct url_actions *next; /**< Next action section in file, or NULL. */ -}; - - -/* - * Flags for use in csp->flags - */ - -/** - * Flag for csp->flags: Set if this client is processing data. - * Cleared when the thread associated with this structure dies. - */ -#define CSP_FLAG_ACTIVE 0x01U - -/** - * Flag for csp->flags: Set if the server's reply is in "chunked" - * transfer encoding - */ -#define CSP_FLAG_CHUNKED 0x02U - -/** - * Flag for csp->flags: Set if this request was enforced, although it would - * normally have been blocked. - */ -#define CSP_FLAG_FORCED 0x04U - -/** - * Flag for csp->flags: Set if any modification to the body was done. - */ -#define CSP_FLAG_MODIFIED 0x08U - -/** - * Flag for csp->flags: Set if request was blocked. - */ -#define CSP_FLAG_REJECTED 0x10U - -/** - * Flag for csp->flags: Set if we are toggled on (FEATURE_TOGGLE). - */ -#define CSP_FLAG_TOGGLED_ON 0x20U - -/** - * Flag for csp->flags: Set if an acceptable Connection header - * is already set. - */ -#define CSP_FLAG_CLIENT_CONNECTION_HEADER_SET 0x00000040U - -/** - * Flag for csp->flags: Set if adding the 'Connection: close' header - * for the server isn't necessary. - */ -#define CSP_FLAG_SERVER_CONNECTION_CLOSE_SET 0x00000080U - -/** - * Flag for csp->flags: Signals header parsers whether they - * are parsing server or client headers. - */ -#define CSP_FLAG_CLIENT_HEADER_PARSING_DONE 0x00000100U - -/** - * Flag for csp->flags: Set if adding the Host: header - * isn't necessary. - */ -#define CSP_FLAG_HOST_HEADER_IS_SET 0x00000200U - -/** - * Flag for csp->flags: Set if filtering is disabled by X-Filter: No - * XXX: As we now have tags we might as well ditch this. - */ -#define CSP_FLAG_NO_FILTERING 0x00000400U - -/** - * Flag for csp->flags: Set the client IP has appended to - * an already existing X-Forwarded-For header in which case - * no new header has to be generated. - */ -#define CSP_FLAG_X_FORWARDED_FOR_APPENDED 0x00000800U - -/** - * Flag for csp->flags: Set if the server wants to keep - * the connection alive. - */ -#define CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE 0x00001000U - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE -/** - * Flag for csp->flags: Set if the server specified the - * content length. - */ -#define CSP_FLAG_CONTENT_LENGTH_SET 0x00002000U -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - -/* - * Flags for use in return codes of child processes - */ - -/** - * Flag for process return code: Set if exiting porcess has been toggled - * during its lifetime. - */ -#define RC_FLAG_TOGGLED 0x10 - -/** - * Flag for process return code: Set if exiting porcess has blocked its - * request. - */ -#define RC_FLAG_BLOCKED 0x20 - -/** - * Maximum number of actions/filter files. This limit is arbitrary - it's just used - * to size an array. - */ -#define MAX_AF_FILES 10 - -/** - * The state of a Privoxy processing thread. - */ -struct client_state -{ - /** The proxy's configuration */ - struct configuration_spec * config; - - /** The actions to perform on the current request */ - struct current_action_spec action[1]; - - /** socket to talk to client (web browser) */ - jb_socket cfd; - - /** socket to talk to server (web server or proxy) */ - jb_socket sfd; - - /** Multi-purpose flag container, see CSP_FLAG_* above */ - unsigned int flags; - - /** Client PC's IP address, as reported by the accept() function. - As a string. */ - char *ip_addr_str; - /** Client PC's IP address, as reported by the accept() function. - As a number. */ - unsigned long ip_addr_long; - - /** The URL that was requested */ - struct http_request http[1]; - - /* - * The final forwarding settings. - * XXX: Currently this is only used for forward-override, - * so we can free the space in sweep. - */ - struct forward_spec * fwd; - - /** An I/O buffer used for buffering data read from the network */ - struct iob iob[1]; - - /** List of all headers for this request */ - struct list headers[1]; - - /** List of all tags that apply to this request */ - struct list tags[1]; - - /** MIME-Type key, see CT_* above */ - unsigned int content_type; - - /** Actions files associated with this client */ - struct file_list *actions_list[MAX_AF_FILES]; - - /** pcrs job files. */ - struct file_list *rlist[MAX_AF_FILES]; - - /** Length after content modification. */ - unsigned long long content_length; - -#ifdef FEATURE_CONNECTION_KEEP_ALIVE - /** Expected length of content after which we - * should stop reading from the server socket. - */ - /* XXX: is this the right location? */ - unsigned long long expected_content_length; -#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ - -#ifdef FEATURE_TRUST - - /** Trust file. */ - struct file_list *tlist; - -#endif /* def FEATURE_TRUST */ - - /** - * Failure reason to embedded in the CGI error page, - * or NULL. Currently only used for socks errors. - */ - char *error_message; - - /** Next thread in linked list. Only read or modify from the main thread! */ - 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 available CGI functions. - */ -struct cgi_dispatcher -{ - /** The URL of the CGI, relative to the CGI root. */ - const char * const name; - - /** The handler function for the CGI */ - jb_err (* const handler)(struct client_state *csp, struct http_response *rsp, const struct map *parameters); - - /** The description of the CGI, to appear on the main menu, or NULL to hide it. */ - const char * const description; - - /** A flag that indicates whether unintentional calls to this CGI can cause damage */ - int harmless; -}; - - -/** - * A data file used by Privoxy. Kept in a linked list. - */ -struct file_list -{ - /** - * This is a pointer to the data structures associated with the file. - * Read-only once the structure has been created. - */ - void *f; - - /** - * The unloader function. - * 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 - * problems. - */ - void (*unloader)(void *); - - /** - * Used internally by sweep(). Do not access from elsewhere. - */ - int active; - - /** - * File last-modified time, so we can check if file has been changed. - * Read-only once the structure has been created. - */ - time_t lastmodified; - - /** - * The full filename. - */ - char * filename; - - /** - * Pointer to next entry in the linked list of all "file_list"s. - * This linked list is so that sweep() can navigate it. - * Since sweep() can remove items from the list, we must be careful - * to only access this value from main thread (when we know sweep - * won't be running). - */ - struct file_list *next; -}; - - -#ifdef FEATURE_TRUST - -/** - * The format of a trust file when loaded into memory. - */ -struct block_spec -{ - struct url_spec url[1]; /**< The URL pattern */ - int reject; /**< FIXME: Please document this! */ - struct block_spec *next; /**< Next entry in linked list */ -}; - -/** - * Arbitrary limit for the number of trusted referrers. - */ -#define MAX_TRUSTED_REFERRERS 512 - -#endif /* def FEATURE_TRUST */ - - -#define SOCKS_NONE 0 /**< Don't use a SOCKS server */ -#define SOCKS_4 40 /**< original SOCKS 4 protocol */ -#define SOCKS_4A 41 /**< as modified for hosts w/o external DNS */ -#define SOCKS_5 50 /**< as modified for hosts w/o external DNS */ - - -/** - * How to forward a connection to a parent proxy. - */ -struct forward_spec -{ - /** URL pattern that this forward_spec is for. */ - struct url_spec url[1]; - - /** Connection type. Must be SOCKS_NONE, SOCKS_4, SOCKS_4A or SOCKS_5. */ - int type; - - /** SOCKS server hostname. Only valid if "type" is SOCKS_4 or SOCKS_4A. */ - char *gateway_host; - - /** SOCKS server port. */ - int gateway_port; - - /** Parent HTTP proxy hostname, or NULL for none. */ - char *forward_host; - - /** Parent HTTP proxy port. */ - int forward_port; - - /** Next entry in the linked list. */ - struct forward_spec *next; -}; - - -/** - * Initializer for a static struct forward_spec. - */ -#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL } - -/* Supported filter types */ -#define FT_CONTENT_FILTER 0 -#define FT_CLIENT_HEADER_FILTER 1 -#define FT_SERVER_HEADER_FILTER 2 -#define FT_CLIENT_HEADER_TAGGER 3 -#define FT_SERVER_HEADER_TAGGER 4 - -#define MAX_FILTER_TYPES 5 - -/** - * This struct represents one filter (one block) from - * the re_filterfile. If there is more than one filter - * in the file, the file will be represented by a - * chained list of re_filterfile specs. - */ -struct re_filterfile_spec -{ - char *name; /**< Name from FILTER: statement in re_filterfile. */ - char *description; /**< Description from FILTER: statement in re_filterfile. */ - struct list patterns[1]; /**< The patterns from the re_filterfile. */ - pcrs_job *joblist; /**< The resulting compiled pcrs_jobs. */ - int type; /**< Filter type (content, client-header, server-header). */ - int dynamic; /**< Set to one if the pattern might contain variables - and has to be recompiled for every request. */ - struct re_filterfile_spec *next; /**< The pointer for chaining. */ -}; - - -#ifdef FEATURE_ACL - -#define ACL_PERMIT 1 /**< Accept connection request */ -#define ACL_DENY 2 /**< Reject connection request */ - -/** - * An IP address pattern. Used to specify networks in the ACL. - */ -struct access_control_addr -{ - unsigned long addr; /**< The IP address as an integer. */ - unsigned long mask; /**< The network mask as an integer. */ - unsigned long port; /**< The port number. */ -}; - -/** - * An access control list (ACL) entry. - * - * This is a linked list. - */ -struct access_control_list -{ - struct access_control_addr src[1]; /**< Client IP address */ - struct access_control_addr dst[1]; /**< Website or parent proxy IP address */ - - short action; /**< ACL_PERMIT or ACL_DENY */ - struct access_control_list *next; /**< The next entry in the ACL. */ -}; - -#endif /* def FEATURE_ACL */ - - -/** Maximum number of loaders (actions, re_filter, ...) */ -#define NLOADERS 8 - - -/** configuration_spec::feature_flags: CGI actions editor. */ -#define RUNTIME_FEATURE_CGI_EDIT_ACTIONS 1U - -/** configuration_spec::feature_flags: Web-based toggle. */ -#define RUNTIME_FEATURE_CGI_TOGGLE 2U - -/** configuration_spec::feature_flags: HTTP-header-based toggle. */ -#define RUNTIME_FEATURE_HTTP_TOGGLE 4U - -/** configuration_spec::feature_flags: Split large forms to limit the number of GET arguments. */ -#define RUNTIME_FEATURE_SPLIT_LARGE_FORMS 8U - -/** configuration_spec::feature_flags: Check the host header for requests with host-less request lines. */ -#define RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS 16U - -/** configuration_spec::feature_flags: Don't allow to circumvent blocks with the force prefix. */ -#define RUNTIME_FEATURE_ENFORCE_BLOCKS 32U - -/** configuration_spec::feature_flags: Allow to block or redirect CGI requests. */ -#define RUNTIME_FEATURE_CGI_CRUNCHING 64U - -/** configuration_spec::feature_flags: Try to keep the connection to the server alive. */ -#define RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE 128U - -/** - * Data loaded from the configuration file. - * - * (Anomaly: toggle is still handled through a global, not this structure) - */ -struct configuration_spec -{ - /** What to log */ - int debug; - - /** Nonzero to enable multithreading. */ - int multi_threaded; - - /** - * Bitmask of features that can be enabled/disabled through the config - * file. Currently defined bits: - * - * - RUNTIME_FEATURE_CGI_EDIT_ACTIONS - * - RUNTIME_FEATURE_CGI_TOGGLE - * - RUNTIME_FEATURE_HTTP_TOGGLE - * - RUNTIME_FEATURE_SPLIT_LARGE_FORMS - */ - unsigned feature_flags; - - /** The log file name. */ - const char *logfile; - - /** The config file directory. */ - const char *confdir; - - /** The directory for customized CGI templates. */ - const char *templdir; - - /** The log file directory. */ - const char *logdir; - - /** The full paths to the actions files. */ - const char *actions_file[MAX_AF_FILES]; - - /** The short names of the actions files. */ - const char *actions_file_short[MAX_AF_FILES]; - - /** The administrator's email address */ - char *admin_address; - - /** A URL with info on this proxy */ - char *proxy_info_url; - - /** URL to the user manual (on our website or local copy) */ - char *usermanual; - - /** The file names of the pcre filter files. */ - const char *re_filterfile[MAX_AF_FILES]; - - /** The short names of the pcre filter files. */ - const char *re_filterfile_short[MAX_AF_FILES]; - - /** The hostname to show on CGI pages, or NULL to use the real one. */ - const char *hostname; - - /** IP address to bind to. Defaults to HADDR_DEFAULT == 127.0.0.1. */ - const char *haddr; - - /** Port to bind to. Defaults to HADDR_PORT == 8118. */ - int hport; - - /** Size limit for IOB */ - size_t buffer_limit; - -#ifdef FEATURE_TRUST - - /** The file name of the trust file. */ - const char * trustfile; - - /** FIXME: DOCME: Document this. */ - struct list trust_info[1]; - - /** FIXME: DOCME: Document this. */ - struct url_spec *trust_list[MAX_TRUSTED_REFERRERS]; - -#endif /* def FEATURE_TRUST */ - -#ifdef FEATURE_ACL - - /** The access control list (ACL). */ - struct access_control_list *acl; - -#endif /* def FEATURE_ACL */ - - /** Information about parent proxies (forwarding). */ - struct forward_spec *forward; - - /** Number of retries in case a forwarded connection attempt fails */ - int forwarded_connect_retries; - - /* Timeout when waiting on sockets for data to become available. */ - int socket_timeout; - - /** All options from the config file, HTML-formatted. */ - char *proxy_args; - - /** The configuration file object. */ - struct file_list *config_file_list; - - /** List of loaders */ - int (*loaders[NLOADERS])(struct client_state *); - - /** Nonzero if we need to bind() to the new port. */ - int need_bind; -}; - -/** Calculates the number of elements in an array, using sizeof. */ -#define SZ(X) (sizeof(X) / sizeof(*X)) - -#ifdef FEATURE_FORCE_LOAD -/** The force load URL prefix. */ -#define FORCE_PREFIX "/PRIVOXY-FORCE" -#endif /* def FEATURE_FORCE_LOAD */ - -#ifdef FEATURE_NO_GIFS -/** The MIME type for images ("image/png" or "image/gif"). */ -#define BUILTIN_IMAGE_MIMETYPE "image/png" -#else -#define BUILTIN_IMAGE_MIMETYPE "image/gif" -#endif /* def FEATURE_NO_GIFS */ - - -/* - * Hardwired URLs - */ - -/** URL for the Privoxy home page. */ -#define HOME_PAGE_URL "http://www.privoxy.org/" - -/** URL for the Privoxy user manual. */ -#define USER_MANUAL_URL HOME_PAGE_URL VERSION "/user-manual/" - -/** Prefix for actions help links (append to USER_MANUAL_URL). */ -#define ACTIONS_HELP_PREFIX "actions-file.html#" - -/** Prefix for config option help links (append to USER_MANUAL_URL). */ -#define CONFIG_HELP_PREFIX "config.html#" - -/* - * 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 "/" - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef PROJECT_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/regression-tests.action b/external/privoxy/regression-tests.action deleted file mode 100644 index bf12a31..0000000 --- a/external/privoxy/regression-tests.action +++ /dev/null @@ -1,782 +0,0 @@ -############################################################################# -# $Id: regression-tests.action,v 1.22 2009/02/22 15:07:58 fabiankeil Exp $ -############################################################################# -# -# This is a configuration file for Privoxy-Regression-Test -# (included in the source tarball's tools directory). -# -# After referencing it in your Privoxy configuration both Privoxy and -# Privoxy-Regression-Test should be good to go. -# -############################################################################# -# -# Copyright (c) 2007-2009 Fabian Keil fk@fabiankeil.de -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# -############################################################################# - -{{settings}} -for-privoxy-version=3.0.11 - -# Some dependencies Privoxy-Regression-Test should know about: -# -# Level 9 needs = config line user-manual\s+(.?.?/|[A-Za-z]:) -# Level 12 needs = config line enable-edit-actions\s+1 -# Level 13 needs = feature status FEATURE_CONNECTION_KEEP_ALIVE Yes -# Level 14 needs = feature status FEATURE_CONNECTION_KEEP_ALIVE No - -####################################################### -# Enable taggers to activate the tests on demand -# and suppress hiding the User-Agent for -# Privoxy-Regression-Test to save log space. -####################################################### -{\ - +client-header-tagger{user-agent} \ - +client-header-tagger{privoxy-control} \ - +client-header-filter{privoxy-control} \ -} -config.privoxy.org/ -p.p/ -127.0.0.1/ - -{-hide-user-agent} -TAG:^User-Agent: Privoxy-Regression-Test - -####################################################### -# Test accept-language{}. -####################################################### - -# Set Header = Accept-Language: de-de -# Expect Header = Accept-Language: en-gb -{+hide-accept-language{en-gb}} -TAG:^hide-accept-language{en-gb}$ - -# Set Header = Accept-Language: de-de -# Expect Header = REMOVAL -{+hide-accept-language{block}} -TAG:^hide-accept-language{block}$ - -####################################################### -# Sections for hide-referrer{} to test: -# -# 1) conditional-block -# 2) conditional-forge -# 3) forge -# 4) block -# 5) a parameter that looks like a valid fake referrer -# 6) a parameter that looks like an invalid fake referrer -####################################################### - -# Set Header = Referer: http://www.example.org/foo -# Expect Header = REMOVAL -# -# Set Header = Referer: http://p.p/foo -# Expect Header = NO CHANGE -# -# Set Header = Referer: p.p/ -# Expect Header = REMOVAL -# -# Set Header = Referer: p -# Expect Header = REMOVAL -# -# Set Header = Referer: http:// -# Expect Header = REMOVAL -# -# Set Header = Referer: https://p.p/ -# Expect Header = REMOVAL -{+hide-referrer{conditional-block}} -TAG:^hide-referrer{conditional-block}$ - -# Set Header = Referer: http://www.example.org/foo -# Expect Header = Referer: http://p.p/ -# -# Set Header = Referer: http://p.p/foo -# Expect Header = NO CHANGE -# -# Set Header = Referer: p.p/ -# Expect Header = Referer: http://p.p/ -# -# Set Header = Referer: p -# Expect Header = Referer: http://p.p/ -# -# Set Header = Referer: http:// -# Expect Header = Referer: http://p.p/ -# -# Set Header = Referer: https://p.p/ -# Expect Header = Referer: http://p.p/ -{+hide-referrer{conditional-forge}} -TAG:^hide-referrer{conditional-forge}$ - -# Set Header = Referer: http://www.example.org/foo -# Expect Header = Referer: http://p.p/ -{+hide-referrer{forge}} -TAG:^hide-referrer{forge}$ - -# Set Header = Referer: http://www.example.org/foo -# Expect Header = REMOVAL -{+hide-referrer{block}} -TAG:^hide-referrer{block}$ - -# Set Header = Referer: http://www.example.org/foo -# Expect Header = Referer: invalid -{+hide-referrer{invalid}} -TAG:^hide-referrer{invalid}$ - -# Set Header = Referer: http://www.example.org/asdf -# Expect Header = Referer: http://www.privoxy.org/ -{+hide-referrer{http://www.privoxy.org/%7D%7D -TAG:^hide-referrer{http://www.privoxy.org/%5C%7D$ - -#{+hide-referrer{}} -#TAG:^hide-referrer{}$ - -####################################################### -# Test hide-user-agent{}. -####################################################### - -# Set Header = User-Agent: Mozilla/5.0 (X11; U; NetBSD i386; de-CH; rv:1.8.1.6) Gecko/20070806 Firefox/2.0.0.6 -# Expect Header = User-Agent: Mozilla/5.0 (X11; U; FreeBSD alpha; en-GB; rv:1.8.1.6) Gecko/20070913 Firefox/2.0.0.6 -{+hide-user-agent{Mozilla/5.0 (X11; U; FreeBSD alpha; en-GB; rv:1.8.1.6) Gecko/20070913 Firefox/2.0.0.6}} -TAG:^hide-user-agent{Mozilla/5.0 (X11; U; FreeBSD alpha; en-GB; rv:1.8.1.6) Gecko/20070913 Firefox/2.0.0.6}$ - -# XXX: Check the code that is tested here. -# Set Header = ua-blah: blah -# Expect Header = REMOVAL -{+hide-user-agent{block}} -TAG:^hide-user-agent{block}$ - -# Set Header = ua-blah: blah -# Expect Header = NO CHANGE -{-hide-user-agent{}} -TAG:^-hide-user-agent{block}$ - - -####################################################### -# Test add-header{}. -####################################################### - -# Set Header = X-Whatever: foo -# Expect Header = X-Custom-Header: yes, please - -{+add-header{X-Custom-Header: yes, please}} -TAG:^add-header{X-Custom-Header: yes, please}$ - -####################################################### -# Test client-header-filter{hide-tor-exit-notation}. -####################################################### - -# Set Header = Referer: http://p.p.zwiebelsuppe.exit/ -# Expect Header = Referer: http://p.p/ -# -# Set Header = Referer: http://p.p.zwiebelsuppe.exit/foo/bar/baaz/ -# Expect Header = Referer: http://p.p/foo/bar/baaz/ -# -# Set Header = Referer: http://p.p/ -# Expect Header = NO CHANGE -# -# Set Header = Referer: http://config.privoxy.org.zwiebelsuppe.exit/foo/bar/baaz.html -# Expect Header = Referer: http://config.privoxy.org/foo/bar/baaz.html -# -# Set Header = Host: p.p.zwiebelsuppe.exit -# Expect Header = Host: p.p -# -# Set Header = Host: p.p -# Expect Header = NO CHANGE -# -# Set Header = Referer: http://config.privoxy.org.ad356ef8e87a89e6c898b74500d58607ac691178.exit/foo/... -# Expect Header = Referer: http://config.privoxy.org/foo/baaz.html - -{+client-header-filter{hide-tor-exit-notation} -hide-referer} -TAG:^client-header-filter{hide-tor-exit-notation}$ - -####################################################### -# Test crunch-client-header{}. -####################################################### - -# Set Header = Content-Type: text/html -# Expect Header = REMOVAL -# -# Set Header = Content-Type: text/html; charset=4711 -# Expect Header = REMOVAL -# -# Set Header = Content-Type: text/plain -# Expect Header = NO CHANGE - -{+crunch-client-header{text/html}} -TAG:^crunch-client-header{text/plain}$ - - -####################################################### -# Test crunch-if-none-match. -####################################################### - -# Set Header = If-None-Match: 8987afd239d2093kd2309kd -# Expect Header = REMOVAL - -# Set Header = If-None-Match: 82c3cb50c984ef11b1fed749949b2a16 -# Expect Header = REMOVAL - -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = NO CHANGE - -{+crunch-if-none-match -hide-if-modified-since} -TAG:^crunch-if-none-match$ - -####################################################### -# Test hide-if-modified-since -####################################################### - -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = REMOVAL -# -# Set Header = If-None-Match: 82c3cb50c984ef11b1fed749949b2a16 -# Expect Header = NO CHANGE - -{+hide-if-modified-since{block} -crunch-if-none-match} -TAG:^hide-if-modified-since{block}$ - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = REMOVAL -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = SOME CHANGE - -{+hide-if-modified-since{-60} -crunch-if-none-match} -TAG:^hide-if-modified-since{-60}$ - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = REMOVAL -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = SOME CHANGE - -{+hide-if-modified-since{+60} -crunch-if-none-match} -TAG:^hide-if-modified-since{+60}$ - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = REMOVAL -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = SOME CHANGE - -{+hide-if-modified-since{60} -crunch-if-none-match} -TAG:^hide-if-modified-since{60}$ - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = REMOVAL -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = NO CHANGE - -{+hide-if-modified-since{+0} -crunch-if-none-match} -TAG:^hide-if-modified-since{+0}$ - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = REMOVAL -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = NO CHANGE - -{+hide-if-modified-since{-0} -crunch-if-none-match} -TAG:^hide-if-modified-since{-0}$ - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = REMOVAL -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = NO CHANGE - -{+hide-if-modified-since{0} -crunch-if-none-match} -TAG:^hide-if-modified-since{0}$ - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = REMOVAL -# Set Header = If-Modified-Since: Thu, 04 Oct 2007 09:56:35 GMT -# Expect Header = NO CHANGE - -{+hide-if-modified-since{NaN} -crunch-if-none-match} -TAG:^hide-if-modified-since{NaN}$ - - -####################################################### -# Test crunch-outgoing-cookies -####################################################### - -# Set Header = If-Modified-Since: Gee, this date is invalid -# Expect Header = NO CHANGE -# -# Set Header = Cookie: PREF=ID=6cf0abd34262:TM=117335617:LM=1617:S=jZypyJ7LPiwFi1_ -# Expect Header = REMOVAL -{\ - +crunch-outgoing-cookies \ - -crunch-incoming-cookies \ - -session-cookies-only \ - -hide-if-modified-since \ -} -TAG:^crunch-outgoing-cookies$ - -####################################################### -# Test session-cookies-only -# -# XXX: pretty useless as session-cookies-only doesn't -# affect client headers. -####################################################### - -# Set Header = Cookie: NSC_gffe-iuuq-mc-wtfswfs=8efb330d3660;expires=Thu, 04-Oct-07 19:11:34 GMT;path=/ -# Expect Header = NO CHANGE -# -# Set Header = Cookie: PREF=ID=6cf0abd34262:TM=117335617:LM=1617:S=jZypyJ7LPiwFi1_ -# Expect Header = NO CHANGE -{\ - -crunch-outgoing-cookies \ - -crunch-incoming-cookies \ - +session-cookies-only \ - -hide-if-modified-since \ -} -TAG:^session-cookies-only$ - -####################################################### -# Test change-x-forwarded-for -####################################################### - -# Set Header = X-Forwarded-For: 10.0.0.1 -# Expect Header = NO CHANGE -{\ - -change-x-forwarded-for \ -} -TAG:^-change-x-forwarded-for$ - -# Set Header = X-Forwarded-For: 10.0.0.1 -# Expect Header = REMOVAL -{\ - +change-x-forwarded-for{block} \ -} -TAG:^change-x-forwarded-for{block}$ - -# Set Header = X-Forwarded-For: 10.0.0.1 -# Expect Header = SOME CHANGE -{\ - +change-x-forwarded-for{add} \ -} -TAG:^change-x-forwarded-for{add}$ - -####################################################### -# Test hide-from-header -####################################################### - -# Set Header = From: schneewitchen@example.org -# Expect Header = REMOVAL -{\ - +hide-from-header{block}\ -} -TAG:^hide-from-header{block}$ - -# Set Header = From: schneewitchen@example.org -# Expect Header = From: siebenzwerge@example.org -{\ - +hide-from-header{siebenzwerge@example.org}\ -} -TAG:^hide-from-header{siebenzwerge@example.org}$ - -####################################################### -# Test prevent-compression -####################################################### - -# Set Header = Accept-Encoding: gzip, deflate -# Expect Header = REMOVAL -# -# Set Header = Accept-Encoding: gzip -# Expect Header = REMOVAL -# -# Set Header = Accept-Encoding: deflate -# Expect Header = REMOVAL -{\ - +prevent-compression\ -} -TAG:^prevent-compression$ - -####################################################### -# Test content filters which could cause problems with -# range requests. -####################################################### - -# Set Header = Range: bytes=1234-5678 -# Expect Header = REMOVAL -# Set Header = If-Range: bytes=1234-5678 -# Expect Header = REMOVAL -# Set Header = Request-Range: bytes=1234-5678 -# Expect Header = REMOVAL -{\ - +deanimate-gifs{last} \ - -filter \ -} -TAG:^deanimate-gifs{last}$ - -# Set Header = Range: bytes=1234-5678 -# Expect Header = REMOVAL -# Set Header = If-Range: bytes=1234-5678 -# Expect Header = REMOVAL -# Set Header = Request-Range: bytes=1234-5678 -# Expect Header = REMOVAL -{\ - -deanimate-gifs \ - +filter{banners-by-size} \ -} -TAG:^filter{banners-by-size}$ - -# Set Header = Range: bytes=1234-5678 -# Expect Header = NO CHANGE -# Set Header = If-Range: bytes=1234-5678 -# Expect Header = NO CHANGE -# Set Header = Request-Range: bytes=1234-5678 -# Expect Header = NO CHANGE -{\ - -deanimate-gifs \ - -filter \ -} -TAG:^no-content-filter$ - -# Set Header = Connection: close -# Expect Header = Connection: keep-alive -# Level = 13 -# Set Header = Connection: keep-alive -# Expect Header = NO CHANGE -# Level = 13 -# Set Header = Connection: -# Expect Header = Connection: keep-alive -# Level = 13 -{} -TAG:^Connection: keep-alive$ - -# Set Header = Connection: keep-alive -# Expect Header = Connection: close -# Level = 14 -# Set Header = Connection: -# Expect Header = Connection: close -# Level = 14 -{} -TAG:^Connection: close$ - -# XXX: Removing a header by not specifying a value is -# an inherited curl feature and could be viewed as a -# bug as far as Privoxy-Regression-Test is concerned. -# -# Set Header = Host: -# Expect Header = Host: p.p -{} -TAG:^No Host header$ - -# Set Header = Host: whatever.example.org -# Expect Header = NO CHANGE -{} -TAG:^Host header other than the target host$ - -# XXX: check the RFC to use a real value -# Set Header = Keep-Alive: Yes -# Expect Header = REMOVAL -{} -TAG:^Keep-Alive header removal$ - -# XXX: check the RFC to use a real value -# Set Header = proxy-connection: keep-alive -# Expect Header = REMOVAL -{} -TAG:^Proxy-Connection removal$ - -# Set Header = Proxy-Connection: keep-alive -# Expect Header = REMOVAL -{} -TAG:^Proxy-Connection removal$ - -# These are somewhat redundant when testing with -# GET requests, but I want to remember then when -# TRACE requests are supported. -# -# Set Header = Max-Forwards: 0 -# Expect Header = NO CHANGE -# Set Header = Max-Forwards: 1 -# Expect Header = NO CHANGE -# Set Header = Max-Forwards: -1 -# Expect Header = NO CHANGE -# Set Header = Max-Forwards: 3 -# Expect Header = NO CHANGE -{} -TAG:^Max-Forwards header without TRACE method$ - -################################################################ -# -# Fairly dumb tests for Privoxy CGI pages. -# -# These are mainly useful for checking for memory leaks -# with Valgrind or whether or not the user manual is installed -# correctly and are unlikely to actually detect any -# -# Note that if "Expect Status Code" is missing, 200 is implied. -# -################################################################ - -# Fetch Test = http://p.p/ -# Will fail if compiled with FEATURE_GRACEFUL_TERMINATION -# Fetch Test = http://p.p/die -# Expect Status Code = 404 -# Fetch Test = http://p.p/show-status -# Fetch Test = http://config.privoxy.org/show-status?file=actions&index=0 -# Fetch Test = http://config.privoxy.org/show-status?file=filter&index=0 -# XXX: for the invalid ones we probably shouldn't return status code 200. -# Fetch Test = http://config.privoxy.org/show-status?file=actions&index=100 -# Fetch Test = http://config.privoxy.org/show-status?file=actions&index=NaN -# Fetch Test = http://config.privoxy.org/show-status?file=actions -# Fetch Test = http://config.privoxy.org/show-status?file=filter&index=100 -# Fetch Test = http://config.privoxy.org/show-status?file=filter&index=NaN -# Fetch Test = http://config.privoxy.org/show-status?file=filter -# Fetch Test = http://config.privoxy.org/show-status?file=invalid -# Fetch Test = http://config.privoxy.org/show-status?file=trust -# Fetch Test = http://p.p/show-version -# Fetch Test = http://p.p/show-request -# Fetch Test = http://p.p/show-url-info -# Fetch Test = http://p.p/show-url-info?url=www.privoxy.org%2F -# Fetch Test = http://p.p/show-url-info?url=http:%2F%2Fwww.privoxy.org%2F -# Fetch Test = http://p.p/show-url-info?url=HTTp:%2F%2Fwww.privoxy.org%2F -# Fetch Test = http://p.p/show-url-info?url=https:%2F%2Fwww.privoxy.org%2F -# Fetch Test = http://p.p/show-url-info?url=HtTps:%2F%2Fwww.privoxy.org%2F -# Fetch Test = http://p.p/show-url-info?url=ftp:%2F%2Fwww.privoxy.org%2F -# Fetch Test = http://p.p/show-url-info?url=FTp:%2F%2Fwww.privoxy.org%2F -# Fetch Test = http://p.p/show-url-info?url= -# Fetch Test = http://p.p/show-url-info?url=%2F -# Fetch Test = http://p.p/toggle -# Fetch Test = http://p.p/edit-actions -# Fetch Test = http://p.p/eaa -# Fetch Test = http://p.p/eau -# Fetch Test = http://p.p/ear -# Fetch Test = http://p.p/eal -# Fetch Test = http://p.p/eafu -# Fetch Test = http://p.p/eas -# Fetch Test = http://p.p/easa -# Fetch Test = http://p.p/easr -# Fetch Test = http://p.p/eass -# Fetch Test = http://p.p/edit-actions-for-url -# Fetch Test = http://p.p/edit-actions-list -# Fetch Test = http://p.p/edit-actions-submit -# Fetch Test = http://p.p/edit-actions-url -# Fetch Test = http://p.p/edit-actions-url-form -# Fetch Test = http://p.p/edit-actions-add-url -# Fetch Test = http://p.p/edit-actions-add-url-form -# Fetch Test = http://p.p/edit-actions-remove-url -# Fetch Test = http://p.p/edit-actions-remove-url-form -# Fetch Test = http://p.p/edit-actions-section-add -# Fetch Test = http://p.p/edit-actions-section-remove -# Fetch Test = http://p.p/edit-actions-section-swap -# Fetch Test = http://p.p/error-favicon.ico -# Fetch Test = http://p.p/favicon.ico -# Fetch Test = http://p.p/robots.txt -# Fetch Test = http://p.p/send-banner -# Fetch Test = http://p.p/send-stylesheet -# Fetch Test = http://p.p/t -# Fetch Test = http://p.p/url-info-osd.xml - -# Trusted CGI Request = http://p.p/edit-actions -# Expect Status Code = 302 -# Level = 12 # Depends on the CGI editor being enabled -# Fetch Test = http://p.p/does-not-exist -# Expect Status Code = 404 -# Trusted CGI Request = http://p.p/eaa -# Trusted CGI Request = http://p.p/eau -# Trusted CGI Request = http://p.p/ear -# Trusted CGI Request = http://p.p/eal -# Trusted CGI Request = http://p.p/eafu -# Trusted CGI Request = http://p.p/eas -# Trusted CGI Request = http://p.p/easa -# Trusted CGI Request = http://p.p/easr -# Trusted CGI Request = http://p.p/eass -# Trusted CGI Request = http://p.p/edit-actions-for-url -# Trusted CGI Request = http://p.p/edit-actions-list -# Trusted CGI Request = http://p.p/edit-actions-submit -# Trusted CGI Request = http://p.p/edit-actions-url -# Trusted CGI Request = http://p.p/edit-actions-url-form -# Trusted CGI Request = http://p.p/edit-actions-add-url -# Trusted CGI Request = http://p.p/edit-actions-add-url-form -# Trusted CGI Request = http://p.p/edit-actions-remove-url -# Trusted CGI Request = http://p.p/edit-actions-remove-url-form -# Trusted CGI Request = http://p.p/edit-actions-section-add -# Trusted CGI Request = http://p.p/edit-actions-section-remove -# Trusted CGI Request = http://p.p/edit-actions-section-swap -# Trusted CGI Request = http://p.p/send-stylesheet - -# The following tests depend on Privoxy being configured to deliver the user manual - -# Fetch Test = http://p.p/user-manual -# Expect Status Code = 302 -# Level = 9 -# Fetch Test = http://p.p/user-manual/ -# Level = 9 -# Fetch Test = http://p.p/user-manual/actions-file.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/appendix.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/config.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/configuration.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/contact.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/copyright.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/files-in-use.jpg -# Level = 9 -# Fetch Test = http://p.p/user-manual/filter-file.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/index.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/installation.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/introduction.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/p_doc.css -# Level = 9 -# Fetch Test = http://p.p/user-manual/proxy2.jpg -# Level = 9 -# Fetch Test = http://p.p/user-manual/proxy_setup.jpg -# Level = 9 -# Fetch Test = http://p.p/user-manual/quickstart.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/seealso.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/startup.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/templates.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/upgradersnote.html -# Level = 9 -# Fetch Test = http://p.p/user-manual/whatsnew.html -# Level = 9 - - -# Method Test = OPTIONS -# Method Test = GET -# Method Test = get -# Method Test = gEt -# Method Test = HEAD -# Method Test = POST -# Method Test = PUT -# Method Test = DELETE -# Method Test = OPTIONS -# Method Test = TRACE -# Method Test = CONNECT -# Method Test = PROPFIND -# Method Test = PROPPATCH -# Method Test = MOVE -# Method Test = COPY -# Method Test = MKCOL -# Method Test = LOCK -# Method Test = UNLOCK -# Method Test = BCOPY -# Method Test = BMOVE -# Method Test = BDELETE -# Method Test = BPROPFIND -# Method Test = BPROPPATCH -# Method Test = SUBSCRIBE -# Method Test = UNSUBSCRIBE -# Method Test = NOTIFY -# Method Test = POLL -# Method Test = VERSION-CONTROL -# Method Test = REPORT -# Method Test = CHECKOUT -# Method Test = CHECKIN -# Method Test = UNCHECKOUT -# Method Test = MKWORKSPACE -# Method Test = UPDATE -# Method Test = LABEL -# Method Test = MERGE -# Method Test = BASELINE-CONTROL -# Method Test = MKACTIVITY -# Method Test = PRIVOXY-REGRESSION-TEST-IN-THE-HOUSE -# Expect Status Code = 400 - -{+block{Forbidden Port. You are not supposed to see this.}} -config.privoxy.org:1-/ -p.p:1-/ - -{-block} -config.privoxy.org:3,79-81/ -p.p:3,22,79-81/ - -# Fetch Test = http://oh-dear-this-hostname-is-so-very-long-that-it-can-not-possibly-be-for... -# Expect Status Code = 503 -{+forward-override{forward-socks5 127.0.0.1:12345 .}} -oh-dear-this-hostname-is-so-very-long-that-it-can-not-possibly-be-forwarded-through-socks5-as-a-result-we-therefore-expect-privoxy-to-return-an-error-response-instead-of-forwarding-the-request-because-as-already-mentioned-this-host-is-really-very-long.example/ - -# Fetch Test = http://oh-dear-this-hostname-is-short-enough-but-there-is-no-socks-server-li... -# Expect Status Code = 503 -{+forward-override{forward-socks5 127.0.0.1:12345 .}} -oh-dear-this-hostname-is-short-enough-but-there-is-no-socks-server-listening.example - -# This one currently triggers the same error condition as the -# test above (socks5 server unreachable), but once Privoxy -# starts to properly reject invalid ports it should become useful. - -# Fetch Test = http://invalid-forward5-gateway-port.example -# Expect Status Code = 503 -{+forward-override{forward-socks5 127.0.0.1:-1 127.0.0.1:12345}} -invalid-forward5-gateway-port.example - -# Fetch Test = http://forward5-null-gateway-host.example -# Expect Status Code = 503 -{+forward-override{forward-socks5 :12345 127.0.0.1:12345}} -forward5-null-gateway-host.example - -# Fetch Test = http://www.forbidden-connect.example:444/ -# Method = CONNECT -# Expect Status Code = 403 -{+limit-connect{443}} -www.forbidden-connect.example/ - -# Fetch Test = http://www.blocked-request.example/blocked-request -# Expect Status Code = 403 -{+block{This request failed to make it to the target destination which means the test succeeded.}} -www.blocked-request.example/blocked-request - -# Fetch Test = http://www.blocked-request.example/blocked-request-with-no-reason-specified -# Expect Status Code = 403 -{+block} -www.blocked-request.example/blocked-request-with-no-reason-specified - -# Some domain pattern tests -# -{+block{domain pattern test}} -# Blocked URL = http://domain-pattern-test.example/ -# Blocked URL = http://domain-pattern-test.example.org/ -domain-pattern-test.example. - -# Just in case there is no white-space fuzzer in the house ... -# -# Set Header = X-LWS-Test: no superfluous white space here -# Expect Header = NO CHANGE -# Set Header = X-LWS-Test: superfluous white space in the house -# Expect Header = X-LWS-Test: superfluous white space in the house -# Set Header = X-LWS-Test : superfluous white space in the house -# Expect Header = X-LWS-Test: superfluous white space in the house -# Set Header = X-LWS-Test: :superfluous white space in the house -# Expect Header = X-LWS-Test: :superfluous white space in the house -# Set Header = X-LWS-Test: :no superfluous white space here -# Expect Header = NO CHANGE -# Set Header = X-LWS-Test: superfluous white tabs in the house -# Expect Header = X-LWS-Test: superfluous white tabs in the house -# Set Header = X-LWS-Test : superfluous white tabs in the house -# Expect Header = X-LWS-Test: superfluous white tabs in the house -# Set Header = X-LWS-Test: "leave quoted lws alone" -# Expect Header = X-LWS-Test: "leave quoted lws alone" -# Set Header = X-LWS-Test: "leave quoted lws alone" thxbye -# Expect Header = X-LWS-Test: "leave quoted lws alone" thxbye -# Set Header = X-LWS-Test: " Do I Look like quoted text? Me thinks not. -# Expect Header = X-LWS-Test: " Do I Look like quoted text? Me thinks not. -# Set Header = X-LWS-Test: "This is quoted" this is not "but this is again" -# Expect Header = X-LWS-Test: "This is quoted" this is not "but this is again" -# Set Header = X-LWS-Test: "This is quoted" this is not "this is " but " this again is not -# Expect Header = X-LWS-Test: "This is quoted" this is not "this is " but " this again is not -{} -TAG:^LWS Tests$ diff --git a/external/privoxy/slackware/rc.privoxy.orig b/external/privoxy/slackware/rc.privoxy.orig deleted file mode 100644 index cbd0db5..0000000 --- a/external/privoxy/slackware/rc.privoxy.orig +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/sh -# ******************************************************************** -# This script uses exit to return proper error codes, -# sourcing (. /path/to/rc.privoxy) it in your system's -# rc files is a bad idea. -# ******************************************************************** - -RETVAL=1 - -PRIVOXY_PRG="%PROGRAM%" -PRIVOXY_BIN="%SBIN_DEST%/$PRIVOXY_PRG" -PRIVOXY_CONF="%CONF_DEST%/config" -PRIVOXY_USER="%USER%" -PRIVOXY_GROUP="%GROUP%" -PRIVOXY_PID="/var/run/$PRIVOXY_PRG.pid" - -declare -i check -check=(`/bin/ps -e|/bin/grep $PRIVOXY_PRG|/usr/bin/wc -l`) - -# some checks for us -if [ ! -x $PRIVOXY_BIN ] ; then exit 0 ;fi -if [ ! -f $PRIVOXY_CONF ] ; then exit 0 ;fi - -# See how we were called. - -PRIVOXY="$PRIVOXY_BIN --user $PRIVOXY_USER.$PRIVOXY_GROUP --pidfile $PRIVOXY_PID $PRIVOXY_CONF" - -start () { - # start daemon - echo -n $"Starting $PRIVOXY_PRG: " - - if [ ! -f $PRIVOXY_PID ]; then - ( $PRIVOXY 2>/dev/tty9 ) \ - && echo " OK" \ - && /bin/touch /var/lock/$PRIVOXY_PRG \ - && RETVAL=0 - elif [ $check -lt 3 ]; then - echo "Zombie lock file found" - /bin/rm -f /var/lock/$PRIVOXY_PRG $PRIVOXY_PID - echo "Retrying..." - start - else - echo "Already running" - fi - echo -} - -stop () { - # stop daemon - echo -n $"Stopping $PRIVOXY_PRG: " - if [ -f $PRIVOXY_PID ]; then - /bin/kill `/bin/cat $PRIVOXY_PID` \ - && /bin/rm -f /var/lock/$PRIVOXY_PRG $PRIVOXY_PID \ - && echo " OK" \ - && RETVAL=0 - echo - else - echo " Not Running" - fi -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - reload) - if [ -f $PRIVOXY_PID ] ; then - /bin/kill -HUP `cat $PRIVOXY_PID` \ - && RETVAL=0 - fi - ;; - restart) - stop - start - ;; - kill) - echo "Kill all Privoxy" - /bin/rm -f /var/lock/$PRIVOXY_PRG $PRIVOXY_PID - /bin/killall $PRIVOXY - ;; - condrestart) - # restart only if already running - if [ -f $PRIVOXY_PID ] ; then - stop - start - fi - ;; - status) - /bin/ps ax|/bin/grep $PRIVOXY_PRG|/bin/grep -v 'grep|init.d|rc.d' - RETVAL=0 - ;; - top) - if [ -f $PRIVOXY_PID ]; then - a="" - for i in `/sbin/pidof $PRIVOXY_PRG` ; do - a="$a -p $i" - done - /usr/bin/top $a - fi - ;; - *) - echo $"Usage: $PRIVOXY_PRG {start|stop|reload|restart|condrestart|status|top|kill}" - exit 1 -esac - -exit $RETVAL diff --git a/external/privoxy/ssplit.c b/external/privoxy/ssplit.c deleted file mode 100644 index d916286..0000000 --- a/external/privoxy/ssplit.c +++ /dev/null @@ -1,218 +0,0 @@ -const char ssplit_rcs[] = "$Id: ssplit.c,v 1.9 2007/11/03 14:35:45 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/ssplit.c,v $ - * - * Purpose : A function to split a string at specified delimiters. - * - * 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: ssplit.c,v $ - * Revision 1.9 2007/11/03 14:35:45 fabiankeil - * Fix spelling in Purpose line. Patch submitted by Simon Ruderich. - * - * Revision 1.8 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.6 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * Revision 1.1.1.1 2001/05/15 13:59:04 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <string.h> -#include <stdlib.h> - -#include "ssplit.h" -#include "miscutil.h" - -const char ssplit_h_rcs[] = SSPLIT_H_VERSION; - -/* Define this for lots of debugging information to stdout */ -#undef SSPLIT_VERBOSE -/* #define SSPLIT_VERBOSE 1 */ - - -/********************************************************************* - * - * Function : ssplit - * - * Description : Split a string using delimiters in `delim'. Results - * go into `vec'. - * - * Parameters : - * 1 : str = string to split. Will be split in place - * (i.e. do not free until you've finished with vec, - * previous contents will be trashed by the call). - * 2 : delim = array of delimiters (if NULL, uses " \t"). - * 3 : vec[] = results vector (aka. array) [out] - * 4 : vec_len = number of usable slots in the vector (aka. array size) - * 5 : dont_save_empty_fields = zero if consecutive delimiters - * give a null output field(s), nonzero if they are just - * to be considered as single delimeter - * 6 : ignore_leading = nonzero to ignore leading field - * separators. - * - * Returns : -1 => Error: vec_len is too small to hold all the - * data, or str == NULL. - * >=0 => the number of fields put in `vec'. - * On error, vec and str may still have been overwritten. - * - *********************************************************************/ -int ssplit(char *str, const char *delim, char *vec[], int vec_len, - int dont_save_empty_fields, int ignore_leading) -{ - unsigned char is_delim[256]; - unsigned char char_type; - int vec_count = 0; - - if (!str) - { - return(-1); - } - - - /* Build is_delim array */ - - memset(is_delim, '\0', sizeof(is_delim)); - - if (!delim) - { - delim = " \t"; /* default field separators */ - } - - while (*delim) - { - is_delim[(unsigned)(unsigned char)*delim++] = 1; /* separator */ - } - - is_delim[(unsigned)(unsigned char)'\0'] = 2; /* terminator */ - is_delim[(unsigned)(unsigned char)'\n'] = 2; /* terminator */ - - - /* Parse string */ - - if (ignore_leading) - { - /* skip leading separators */ - while (is_delim[(unsigned)(unsigned char)*str] == 1) - { - str++; - } - } - - /* first pointer is the beginning of string */ - /* Check if we want to save this field */ - if ( (!dont_save_empty_fields) - || (is_delim[(unsigned)(unsigned char)*str] == 0) ) - { - /* - * We want empty fields, or the first character in this - * field is not a delimiter or the end of string. - * So save it. - */ - if (vec_count >= vec_len) - { - return(-1); /* overflow */ - } - vec[vec_count++] = (char *) str; - } - - while ((char_type = is_delim[(unsigned)(unsigned char)*str]) != 2) - { - if (char_type == 1) - { - /* the char is a separator */ - - /* null terminate the substring */ - *str++ = '\0'; - - /* Check if we want to save this field */ - if ( (!dont_save_empty_fields) - || (is_delim[(unsigned)(unsigned char)*str] == 0) ) - { - /* - * We want empty fields, or the first character in this - * field is not a delimiter or the end of string. - * So save it. - */ - if (vec_count >= vec_len) - { - return(-1); /* overflow */ - } - vec[vec_count++] = (char *) str; - } - } - else - { - str++; - } - } - *str = '\0'; /* null terminate the substring */ - -#ifdef SSPLIT_VERBOSE - { - int i; - printf("dump %d strings\n", vec_count); - for (i = 0; i < vec_count; i++) - { - printf("%d '%s'\n", i, vec[i]); - } - } -#endif /* def SSPLIT_VERBOSE */ - - return(vec_count); -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/ssplit.h b/external/privoxy/ssplit.h deleted file mode 100644 index 3e9b991..0000000 --- a/external/privoxy/ssplit.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef SSPLIT_H_INCLUDED -#define SSPLIT_H_INCLUDED -#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.7 2006/07/18 14:48:47 david__schmidt Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/ssplit.h,v $ - * - * Purpose : A function to split a string at specified deliminters. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * 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: ssplit.h,v $ - * Revision 1.7 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.5 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern int ssplit(char *str, const char *delim, char *vec[], int vec_len, - int dont_save_empty_fields, int ignore_leading); - -/* Revision control strings from this header and associated .c file */ -extern const char ssplit_rcs[]; -extern const char ssplit_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef SSPLIT_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/strptime.h b/external/privoxy/strptime.h deleted file mode 100644 index 63ffe57..0000000 --- a/external/privoxy/strptime.h +++ /dev/null @@ -1,1003 +0,0 @@ -/* Convert a string representation of time to a time value. - Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper drepper@cygnus.com, 1996. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* XXX This version of the implementation is not really complete. - Some of the fields cannot add information alone. But if seeing - some of them in the same format (such as year, week and weekday) - this is enough information for determining the date. */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <ctype.h> -#include <limits.h> -#include <string.h> -#include <time.h> - -#ifdef _LIBC -# include "../locale/localeinfo.h" -#endif - - -#ifndef __P -# if defined (__GNUC__) || (defined (__STDC__) && __STDC__) -# define __P(args) args -# else -# define __P(args) () -# endif /* GCC. */ -#endif /* Not __P. */ - -#if ! HAVE_LOCALTIME_R && ! defined localtime_r -# ifdef _LIBC -# define localtime_r __localtime_r -# else -/* Approximate localtime_r as best we can in its absence. */ -# define localtime_r my_localtime_r -static struct tm *localtime_r __P ((const time_t *, struct tm *)); -static struct tm * -localtime_r (t, tp) - const time_t *t; - struct tm *tp; -{ - struct tm *l = localtime (t); - if (! l) - return 0; - *tp = *l; - return tp; -} -# endif /* ! _LIBC */ -#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */ - - -#define match_char(ch1, ch2) if (ch1 != ch2) return NULL -#if defined __GNUC__ && __GNUC__ >= 2 -# define match_string(cs1, s2) \ - ({ size_t len = strlen (cs1); \ - int result = strncasecmp ((cs1), (s2), len) == 0; \ - if (result) (s2) += len; \ - result; }) -#else -/* Oh come on. Get a reasonable compiler. */ -# define match_string(cs1, s2) \ - (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) -#endif -/* We intentionally do not use isdigit() for testing because this will - lead to problems with the wide character version. */ -#define get_number(from, to, n) \ - do { \ - int __n = n; \ - val = 0; \ - while (*rp == ' ') \ - ++rp; \ - if (*rp < '0' || *rp > '9') \ - return NULL; \ - do { \ - val *= 10; \ - val += *rp++ - '0'; \ - } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9'); \ - if (val < from || val > to) \ - return NULL; \ - } while (0) -#ifdef _NL_CURRENT -# define get_alt_number(from, to, n) \ - ({ \ - __label__ do_normal; \ - if (*decided != raw) \ - { \ - const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \ - int __n = n; \ - int any = 0; \ - while (*rp == ' ') \ - ++rp; \ - val = 0; \ - do { \ - val *= 10; \ - while (*alts != '\0') \ - { \ - size_t len = strlen (alts); \ - if (strncasecmp (alts, rp, len) == 0) \ - break; \ - alts += len + 1; \ - ++val; \ - } \ - if (*alts == '\0') \ - { \ - if (*decided == not && ! any) \ - goto do_normal; \ - /* If we haven't read anything it's an error. */ \ - if (! any) \ - return NULL; \ - /* Correct the premature multiplication. */ \ - val /= 10; \ - break; \ - } \ - else \ - *decided = loc; \ - } while (--__n > 0 && val * 10 <= to); \ - if (val < from || val > to) \ - return NULL; \ - } \ - else \ - { \ - do_normal: \ - get_number (from, to, n); \ - } \ - 0; \ - }) -#else -# define get_alt_number(from, to, n) \ - /* We don't have the alternate representation. */ \ - get_number(from, to, n) -#endif -#define recursive(new_fmt) \ - (*(new_fmt) != '\0' \ - && (rp = strptime_internal (rp, (new_fmt), tm, decided, era_cnt)) != NULL) - - -#ifdef _LIBC -/* This is defined in locale/C-time.c in the GNU libc. */ -extern const struct locale_data _nl_C_LC_TIME; -extern const unsigned short int __mon_yday[2][13]; - -# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string) -# define ab_weekday_name \ - (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string) -# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string) -# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string) -# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string) -# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string) -# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string) -# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string) -# define HERE_T_FMT_AMPM \ - (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string) -# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string) - -# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n) -#else -static char const weekday_name[][10] = - { - "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday" - }; -static char const ab_weekday_name[][4] = - { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - }; -static char const month_name[][10] = - { - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" - }; -static char const ab_month_name[][4] = - { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; -# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y" -# define HERE_D_FMT "%m/%d/%y" -# define HERE_AM_STR "AM" -# define HERE_PM_STR "PM" -# define HERE_T_FMT_AMPM "%I:%M:%S %p" -# define HERE_T_FMT "%H:%M:%S" - -const unsigned short int __mon_yday[2][13] = - { - /* Normal years. */ - { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, - /* Leap years. */ - { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } - }; -#endif - -/* Status of lookup: do we use the locale data or the raw data? */ -enum locale_status { not, loc, raw }; - - -#ifndef __isleap -/* Nonzero if YEAR is a leap year (every 4 years, - except every 100th isn't, and every 400th is). */ -# define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) -#endif - -/* Compute the day of the week. */ -static void -day_of_the_week (struct tm *tm) -{ - /* We know that January 1st 1970 was a Thursday (= 4). Compute the - the difference between this data in the one on TM and so determine - the weekday. */ - int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2); - int wday = (-473 - + (365 * (tm->tm_year - 70)) - + (corr_year / 4) - - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0) - + (((corr_year / 4) / 25) / 4) - + __mon_yday[0][tm->tm_mon] - + tm->tm_mday - 1); - tm->tm_wday = ((wday % 7) + 7) % 7; -} - -/* Compute the day of the year. */ -static void -day_of_the_year (struct tm *tm) -{ - tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon] - + (tm->tm_mday - 1)); -} - -static char * -#ifdef _LIBC -internal_function -#endif -strptime_internal __P ((const char *rp, const char *fmt, struct tm *tm, - enum locale_status *decided, int era_cnt)); - -static char * -#ifdef _LIBC -internal_function -#endif -strptime_internal (rp, fmt, tm, decided, era_cnt) - const char *rp; - const char *fmt; - struct tm *tm; - enum locale_status *decided; - int era_cnt; -{ - const char *rp_backup; - int cnt; - size_t val; - int have_I, is_pm; - int century, want_century; - int want_era; - int have_wday, want_xday; - int have_yday; - int have_mon, have_mday; -#ifdef _NL_CURRENT - size_t num_eras; -#endif - struct era_entry *era; - - have_I = is_pm = 0; - century = -1; - want_century = 0; - want_era = 0; - era = NULL; - - have_wday = want_xday = have_yday = have_mon = have_mday = 0; - - while (*fmt != '\0') - { - /* A white space in the format string matches 0 more or white - space in the input string. */ - if (isspace (*fmt)) - { - while (isspace (*rp)) - ++rp; - ++fmt; - continue; - } - - /* Any character but `%' must be matched by the same character - in the iput string. */ - if (*fmt != '%') - { - match_char (*fmt++, *rp++); - continue; - } - - ++fmt; -#ifndef _NL_CURRENT - /* We need this for handling the `E' modifier. */ - start_over: -#endif - - /* Make back up of current processing pointer. */ - rp_backup = rp; - - switch (*fmt++) - { - case '%': - /* Match the `%' character itself. */ - match_char ('%', *rp++); - break; - case 'a': - case 'A': - /* Match day of week. */ - for (cnt = 0; cnt < 7; ++cnt) - { -#ifdef _NL_CURRENT - if (*decided !=raw) - { - if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp)) - { - if (*decided == not - && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt), - weekday_name[cnt])) - *decided = loc; - break; - } - if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp)) - { - if (*decided == not - && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), - ab_weekday_name[cnt])) - *decided = loc; - break; - } - } -#endif - if (*decided != loc - && (match_string (weekday_name[cnt], rp) - || match_string (ab_weekday_name[cnt], rp))) - { - *decided = raw; - break; - } - } - if (cnt == 7) - /* Does not match a weekday name. */ - return NULL; - tm->tm_wday = cnt; - have_wday = 1; - break; - case 'b': - case 'B': - case 'h': - /* Match month name. */ - for (cnt = 0; cnt < 12; ++cnt) - { -#ifdef _NL_CURRENT - if (*decided !=raw) - { - if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp)) - { - if (*decided == not - && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt), - month_name[cnt])) - *decided = loc; - break; - } - if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp)) - { - if (*decided == not - && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), - ab_month_name[cnt])) - *decided = loc; - break; - } - } -#endif - if (match_string (month_name[cnt], rp) - || match_string (ab_month_name[cnt], rp)) - { - *decided = raw; - break; - } - } - if (cnt == 12) - /* Does not match a month name. */ - return NULL; - tm->tm_mon = cnt; - want_xday = 1; - break; - case 'c': - /* Match locale's date and time format. */ -#ifdef _NL_CURRENT - if (*decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT))) - { - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (*decided == not && - strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT)) - *decided = loc; - want_xday = 1; - break; - } - *decided = raw; - } -#endif - if (!recursive (HERE_D_T_FMT)) - return NULL; - want_xday = 1; - break; - case 'C': - /* Match century number. */ -#ifdef _NL_CURRENT - match_century: -#endif - get_number (0, 99, 2); - century = val; - want_xday = 1; - break; - case 'd': - case 'e': - /* Match day of month. */ - get_number (1, 31, 2); - tm->tm_mday = val; - have_mday = 1; - want_xday = 1; - break; - case 'F': - if (!recursive ("%Y-%m-%d")) - return NULL; - want_xday = 1; - break; - case 'x': -#ifdef _NL_CURRENT - if (*decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, D_FMT))) - { - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (*decided == not - && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT)) - *decided = loc; - want_xday = 1; - break; - } - *decided = raw; - } -#endif - /* Fall through. */ - case 'D': - /* Match standard day format. */ - if (!recursive (HERE_D_FMT)) - return NULL; - want_xday = 1; - break; - case 'k': - case 'H': - /* Match hour in 24-hour clock. */ - get_number (0, 23, 2); - tm->tm_hour = val; - have_I = 0; - break; - case 'I': - /* Match hour in 12-hour clock. */ - get_number (1, 12, 2); - tm->tm_hour = val % 12; - have_I = 1; - break; - case 'j': - /* Match day number of year. */ - get_number (1, 366, 3); - tm->tm_yday = val - 1; - have_yday = 1; - break; - case 'm': - /* Match number of month. */ - get_number (1, 12, 2); - tm->tm_mon = val - 1; - have_mon = 1; - want_xday = 1; - break; - case 'M': - /* Match minute. */ - get_number (0, 59, 2); - tm->tm_min = val; - break; - case 'n': - case 't': - /* Match any white space. */ - while (isspace (*rp)) - ++rp; - break; - case 'p': - /* Match locale's equivalent of AM/PM. */ -#ifdef _NL_CURRENT - if (*decided != raw) - { - if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp)) - { - if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR)) - *decided = loc; - break; - } - if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp)) - { - if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR)) - *decided = loc; - is_pm = 1; - break; - } - *decided = raw; - } -#endif - if (!match_string (HERE_AM_STR, rp)) - if (match_string (HERE_PM_STR, rp)) - is_pm = 1; - else - return NULL; - break; - case 'r': -#ifdef _NL_CURRENT - if (*decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM))) - { - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (*decided == not && - strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM), - HERE_T_FMT_AMPM)) - *decided = loc; - break; - } - *decided = raw; - } -#endif - if (!recursive (HERE_T_FMT_AMPM)) - return NULL; - break; - case 'R': - if (!recursive ("%H:%M")) - return NULL; - break; - case 's': - { - /* The number of seconds may be very high so we cannot use - the `get_number' macro. Instead read the number - character for character and construct the result while - doing this. */ - time_t secs = 0; - if (*rp < '0' || *rp > '9') - /* We need at least one digit. */ - return NULL; - - do - { - secs *= 10; - secs += *rp++ - '0'; - } - while (*rp >= '0' && *rp <= '9'); - - if (localtime_r (&secs, tm) == NULL) - /* Error in function. */ - return NULL; - } - break; - case 'S': - get_number (0, 61, 2); - tm->tm_sec = val; - break; - case 'X': -#ifdef _NL_CURRENT - if (*decided != raw) - { - if (!recursive (_NL_CURRENT (LC_TIME, T_FMT))) - { - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT)) - *decided = loc; - break; - } - *decided = raw; - } -#endif - /* Fall through. */ - case 'T': - if (!recursive (HERE_T_FMT)) - return NULL; - break; - case 'u': - get_number (1, 7, 1); - tm->tm_wday = val % 7; - have_wday = 1; - break; - case 'g': - get_number (0, 99, 2); - /* XXX This cannot determine any field in TM. */ - break; - case 'G': - if (*rp < '0' || *rp > '9') - return NULL; - /* XXX Ignore the number since we would need some more - information to compute a real date. */ - do - ++rp; - while (*rp >= '0' && *rp <= '9'); - break; - case 'U': - case 'V': - case 'W': - get_number (0, 53, 2); - /* XXX This cannot determine any field in TM without some - information. */ - break; - case 'w': - /* Match number of weekday. */ - get_number (0, 6, 1); - tm->tm_wday = val; - have_wday = 1; - break; - case 'y': -#ifdef _NL_CURRENT - match_year_in_century: -#endif - /* Match year within century. */ - get_number (0, 99, 2); - /* The "Year 2000: The Millennium Rollover" paper suggests that - values in the range 69-99 refer to the twentieth century. */ - tm->tm_year = val >= 69 ? val : val + 100; - /* Indicate that we want to use the century, if specified. */ - want_century = 1; - want_xday = 1; - break; - case 'Y': - /* Match year including century number. */ - get_number (0, 9999, 4); - tm->tm_year = val - 1900; - want_century = 0; - want_xday = 1; - break; - case 'Z': - /* XXX How to handle this? */ - break; - case 'E': -#ifdef _NL_CURRENT - switch (*fmt++) - { - case 'c': - /* Match locale's alternate date and time format. */ - if (*decided != raw) - { - const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT); - - if (*fmt == '\0') - fmt = _NL_CURRENT (LC_TIME, D_T_FMT); - - if (!recursive (fmt)) - { - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (fmt, HERE_D_T_FMT)) - *decided = loc; - want_xday = 1; - break; - } - *decided = raw; - } - /* The C locale has no era information, so use the - normal representation. */ - if (!recursive (HERE_D_T_FMT)) - return NULL; - want_xday = 1; - break; - case 'C': - if (*decided != raw) - { - if (era_cnt >= 0) - { - era = _nl_select_era_entry (era_cnt); - if (match_string (era->era_name, rp)) - { - *decided = loc; - break; - } - else - return NULL; - } - else - { - num_eras = _NL_CURRENT_WORD (LC_TIME, - _NL_TIME_ERA_NUM_ENTRIES); - for (era_cnt = 0; era_cnt < (int) num_eras; - ++era_cnt, rp = rp_backup) - { - era = _nl_select_era_entry (era_cnt); - if (match_string (era->era_name, rp)) - { - *decided = loc; - break; - } - } - if (era_cnt == (int) num_eras) - { - era_cnt = -1; - if (*decided == loc) - return NULL; - } - else - break; - } - - *decided = raw; - } - /* The C locale has no era information, so use the - normal representation. */ - goto match_century; - case 'y': - if (*decided == raw) - goto match_year_in_century; - - get_number(0, 9999, 4); - tm->tm_year = val; - want_era = 1; - want_xday = 1; - break; - case 'Y': - if (*decided != raw) - { - num_eras = _NL_CURRENT_WORD (LC_TIME, - _NL_TIME_ERA_NUM_ENTRIES); - for (era_cnt = 0; era_cnt < (int) num_eras; - ++era_cnt, rp = rp_backup) - { - era = _nl_select_era_entry (era_cnt); - if (recursive (era->era_format)) - break; - } - if (era_cnt == (int) num_eras) - { - era_cnt = -1; - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - *decided = loc; - era_cnt = -1; - break; - } - - *decided = raw; - } - get_number (0, 9999, 4); - tm->tm_year = val - 1900; - want_century = 0; - want_xday = 1; - break; - case 'x': - if (*decided != raw) - { - const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT); - - if (*fmt == '\0') - fmt = _NL_CURRENT (LC_TIME, D_FMT); - - if (!recursive (fmt)) - { - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (fmt, HERE_D_FMT)) - *decided = loc; - break; - } - *decided = raw; - } - if (!recursive (HERE_D_FMT)) - return NULL; - break; - case 'X': - if (*decided != raw) - { - const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT); - - if (*fmt == '\0') - fmt = _NL_CURRENT (LC_TIME, T_FMT); - - if (!recursive (fmt)) - { - if (*decided == loc) - return NULL; - else - rp = rp_backup; - } - else - { - if (strcmp (fmt, HERE_T_FMT)) - *decided = loc; - break; - } - *decided = raw; - } - if (!recursive (HERE_T_FMT)) - return NULL; - break; - default: - return NULL; - } - break; -#else - /* We have no information about the era format. Just use - the normal format. */ - if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y' - && *fmt != 'x' && *fmt != 'X') - /* This is an illegal format. */ - return NULL; - - goto start_over; -#endif - case 'O': - switch (*fmt++) - { - case 'd': - case 'e': - /* Match day of month using alternate numeric symbols. */ - get_alt_number (1, 31, 2); - tm->tm_mday = val; - have_mday = 1; - want_xday = 1; - break; - case 'H': - /* Match hour in 24-hour clock using alternate numeric - symbols. */ - get_alt_number (0, 23, 2); - tm->tm_hour = val; - have_I = 0; - break; - case 'I': - /* Match hour in 12-hour clock using alternate numeric - symbols. */ - get_alt_number (1, 12, 2); - tm->tm_hour = val - 1; - have_I = 1; - break; - case 'm': - /* Match month using alternate numeric symbols. */ - get_alt_number (1, 12, 2); - tm->tm_mon = val - 1; - have_mon = 1; - want_xday = 1; - break; - case 'M': - /* Match minutes using alternate numeric symbols. */ - get_alt_number (0, 59, 2); - tm->tm_min = val; - break; - case 'S': - /* Match seconds using alternate numeric symbols. */ - get_alt_number (0, 61, 2); - tm->tm_sec = val; - break; - case 'U': - case 'V': - case 'W': - get_alt_number (0, 53, 2); - /* XXX This cannot determine any field in TM without - further information. */ - break; - case 'w': - /* Match number of weekday using alternate numeric symbols. */ - get_alt_number (0, 6, 1); - tm->tm_wday = val; - have_wday = 1; - break; - case 'y': - /* Match year within century using alternate numeric symbols. */ - get_alt_number (0, 99, 2); - tm->tm_year = val >= 69 ? val : val + 100; - want_xday = 1; - break; - default: - return NULL; - } - break; - default: - return NULL; - } - } - - if (have_I && is_pm) - tm->tm_hour += 12; - - if (century != -1) - { - if (want_century) - tm->tm_year = tm->tm_year % 100 + (century - 19) * 100; - else - /* Only the century, but not the year. Strange, but so be it. */ - tm->tm_year = (century - 19) * 100; - } - -#ifdef _NL_CURRENT - if (era_cnt != -1) - { - era = _nl_select_era_entry(era_cnt); - if (want_era) - tm->tm_year = (era->start_date[0] - + ((tm->tm_year - era->offset) - * era->absolute_direction)); - else - /* Era start year assumed. */ - tm->tm_year = era->start_date[0]; - } - else -#endif - if (want_era) - return NULL; - - if (want_xday && !have_wday) - { - if ( !(have_mon && have_mday) && have_yday) - { - /* We don't have tm_mon and/or tm_mday, compute them. */ - int t_mon = 0; - while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday) - t_mon++; - if (!have_mon) - tm->tm_mon = t_mon - 1; - if (!have_mday) - tm->tm_mday = - (tm->tm_yday - - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1); - } - day_of_the_week (tm); - } - if (want_xday && !have_yday) - day_of_the_year (tm); - - return (char *) rp; -} - - -char * -strptime (buf, format, tm) - const char *buf; - const char *format; - struct tm *tm; -{ - enum locale_status decided; - -#ifdef _NL_CURRENT - decided = not; -#else - decided = raw; -#endif - return strptime_internal (buf, format, tm, &decided, -1); -} diff --git a/external/privoxy/templates/blocked b/external/privoxy/templates/blocked deleted file mode 100644 index 3ebc22e..0000000 --- a/external/privoxy/templates/blocked +++ /dev/null @@ -1,287 +0,0 @@ -########################################################## -# -# "Blocked" Error Output template for Privoxy. -# -# NOTE: UNLIKE THE OTHER TEMPLATES, THIS ONE USES -# JavaScript write() TO GENERATE THE PAGE IN JS_AWARE -# BROWSERS. SYMBOL SUBSTITUTIONS THAT RESULT IN MULTILINE -# STRINGS WILL BREAK THE JavaScript SYNTAX. -# USE WITH CAUTION. -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written in plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# protocol: -# The request's protocol: http:// or https:// -# hostport: -# The host and port part of the blocked request's URL. -# path: -# The path part of the blocked request's URL. -# path-ue: -# The path part of the blocked request's URL, url-encoded. -# -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# force-support: -# Privoxy has been compiled with support for forced loading -# of blocked content. In that case, the symbol "force-prefix" is -# avaiable, which translates to the FORCE_PREFIX -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> - <head> - <title>Request blocked (Privoxy@@my-hostname@)</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico" type="image/x-icon"> - <style type="text/css"> -#include cgi-style.css - </style> - <script type="text/javascript" language="javascript"> - <!-- - /* - * Is this window or frame too small - * for the full-blown "blocked" page? - */ - function isSmallFrame() - { - minWidth = 650; - minHeight = 330; - - /* - * Navigator, Mozilla, Opera - */ - if (window.innerWidth - && (window.innerWidth >= minWidth) - && (window.innerHeight >= minHeight)) - { - return false; - } - - /* - * MSIE - */ - else if (document.body && document.body.clientWidth - && (document.body.clientWidth >= minWidth) - && (document.body.clientHeight >= minHeight)) - { - return false; - } - - /* - * Small window or unsupported browser - */ - return true; - } - //--> - </script> - </head> - <body> - <script type="text/javascript" language="javascript"> - <!-- -# Note: The same small version is used at the bottom -# of this file in the <noscript> context. If you -# make changes here, keep the other version in sync! - - if (isSmallFrame()) - { - document.write('\ - <p class="small" align="center"> \ - Request blocked by <a href="@default-cgi@" target="_blank">Privoxy</a>: @block-reason@ \ - <br>See <a href="@default-cgi@show-url-info?url=@hostport@@path-ue@" \ - target="_blank">why this block applies</a> \ - <!-- @if-force-support-start --> \ - or <a href="http://@hostport@@force-prefix@@path@">go \ - <!-- if-force-support-end@ --> \ - to <b>@protocol@@hostport@@path@</b> \ - <!-- @if-force-support-start --> \ - anyway</a>. \ - <!-- if-force-support-end@ --> \ - </p> \ - '); - - } - else - { - document.write('\ - <table cellpadding="20" cellspacing="10" border="0" width="100%">\ - <tr> \ - <td class="status"> \ - BLOCKED \ - </td> \ - <td class="title" width=100%> \ - <h1> \ - This is <a href="@homepage@">Privoxy</a> @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, \ - @if-enabled-display-then@enabled@else-not-enabled-display@disabled@endif-enabled-display@ \ - </h1> \ - </td> \ - </tr> \ - \ -<!-- @if-unstable-start --> \ -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in \ - <tr> \ - <td class="warning" colspan="2"> \ - <h2>Warning:</h2> \ - <p> \ - <b>Please note that this <font color=red>@code-status@</font> release \ - of the proxy software is not intended for production systems! \ - <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b> \ - </p> \ - </td> \ - </tr> \ -<!-- if-unstable-end@ --> \ - \ - <tr> \ - <td class="box" colspan="2"> \ - <h2>Request for blocked URL</h2> \ - <p>Your request for <b>@protocol@@hostport@@path@</b> was blocked. \ - <br>Block reason: @block-reason@ \ - <br><a href="@default-cgi@show-url-info?url=@hostport@@path-ue@" \ - target="_blank">See why this block applies</a> \ -<!-- @if-force-support-start --> \ - or <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>. \ -<!-- if-force-support-end@ --> \ - </p> \ - </td> \ - </tr> \ - \ - <tr> \ - <td class="box" colspan="2"> \ - <h2>More Privoxy:</h2> \ - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> \ - </td> \ - </tr> \ - \ - <tr> \ - <td class="info" colspan="2"> \ - <big><b>Support and Service via Sourceforge:</b></big> \ - <p> \ - We value your feedback. To provide you with the best support, \ - we ask that you: \ - </p> \ - <ul> \ - <li> \ - use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> or (better) the \ - <a href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a> to get help. \ - </li> \ - <li> \ - submit banners and all problems with the actions file only through the \ - <a href="javascript:void(window.open(\'http://www.privoxy.org/actions\',\'Feedback\',\'width=600,scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no\').focus());">actions \ - file feedback system</a>. \ - </li> \ - <li> \ - submit bugs only through our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug tracker</a>. \ - Make sure that the bug has not yet been submitted. \ - </li> \ - <li> \ - submit feature requests only through our <a href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature \ - request tracker</a>. \ - </li> \ - </ul> \ - </td> \ - </tr> \ - \ -<!-- @if-have-help-info-start --> \ - <tr> \ - <td class="info" colspan="2"> \ - <h2>Local Privoxy support:</h2> \ - \ -<!-- @if-have-proxy-info-start --> \ - <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.</p> \ -<!-- if-have-proxy-info-end@ --> \ - \ -<!-- @if-have-adminaddr-info-start --> \ - <p>Address e-mail questions about this service to \ - <a href="mailto:@admin-address@"><code>@admin-address@</code></a>, \ - who will be glad to help you. \ - </p> \ -<!-- if-have-adminaddr-info-end@ --> \ - </td> \ - </tr> \ -<!-- if-have-help-info-end@ --> \ - \ - </table> \ - '); - } - //--> - </script> - -# Note: The same small version is used above via JavaScript -# If you make changes here, keep the other version in sync! - - <noscript> - <p class="small" align="center"> - Request blocked by <a href="@default-cgi@" target="_blank">Privoxy</a>: @block-reason@ - <br>See <a href="@default-cgi@show-url-info?url=@hostport@@path-ue@" - target="_blank">why this block applies</a> - <!-- @if-force-support-start --> - or <a href="http://@hostport@@force-prefix@@path@">go - <!-- if-force-support-end@ --> - to <b>@protocol@@hostport@@path@</b> - <!-- @if-force-support-start --> - anyway</a>. - <!-- if-force-support-end@ --> - </p> - </noscript> - - </body> -</html> diff --git a/external/privoxy/templates/cgi-error-404 b/external/privoxy/templates/cgi-error-404 deleted file mode 100644 index c12b564..0000000 --- a/external/privoxy/templates/cgi-error-404 +++ /dev/null @@ -1,149 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>404 - Privoxy Configuration Page not found</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="status"> - 404 - </td> - <td class="title" style="width: 100%"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning" colspan="2"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning" colspan="2"> - <h2>Privoxy Configuration page not found</h2> - <p>You typed in what looks like a URL used to configure - Privoxy, but it cannot be recognised. Maybe it's - for a different Privoxy version, or you typed it - in wrong? Or maybe the Privoxy administrator - has decided to disable the feature.</p> - <p>If you got here by clicking a link in the - configuration interface, please file a bug report!</p> - <p>You can use the menu below to select from the available - configuration options</p> - </td> - </tr> - - <tr> - <td class="box" colspan="2"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info" colspan="2"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info" colspan="2"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/cgi-error-bad-param b/external/privoxy/templates/cgi-error-bad-param deleted file mode 100644 index a1e3f05..0000000 --- a/external/privoxy/templates/cgi-error-bad-param +++ /dev/null @@ -1,156 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy: Bad parameter</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning"> - <h2>Bad parameter to Privoxy configuration page</h2> - <p>You've found a page used to configure Privoxy, but the - parameters (the part of the web page address after the - "?" mark) are wrong or missing.</p> - <p>Possible causes:</p> - <ul> - <li>If you just typed a URL pattern into a form, then you got - something wrong. Press the "back" button on your browser - once and correct what you typed.</li> - <li>If you tried to type in the URL, then you've found a - page where you can't do that. You can only view this - page by following links from elsewhere in the configuration - interface.</li> - <li>If you got here using your browser's "back" button, then - that is deliberately disabled for this page.</li> - <li>If you got here by clicking a link in the - configuration interface, please file a bug report!</li> - </ul> - <p>You can use the menu below to select from the available - configuration options</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>Privoxy Menu:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/cgi-error-disabled b/external/privoxy/templates/cgi-error-disabled deleted file mode 100644 index 9faffc6..0000000 --- a/external/privoxy/templates/cgi-error-disabled +++ /dev/null @@ -1,169 +0,0 @@ -########################################################## -# -# Feature disabled or referrer untrusted Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Configuration Page Disabled</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> -</head> - -<body> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning"> - <h2>Privoxy Configuration access denied</h2> - <p>Access to <b>@url@</b> has been denied because:</p> - - <ul> - <li>it requires a feature that has been disabled by the Privoxy administrator,</li> - <li>you didn't come here through one of Privoxy's CGI pages, or</li> - <li>the <q>Referer:</q> header is blocked.</li> - </ul> - - <p>Note that the following features which used to be enabled in earlier - releases are now off by default: - </p> - <ul> - <li><a href="@user-manual@config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions</a></li> - <li><a href="@user-manual@config.html#ENABLE-REMOTE-TOGGLE">enable-remote-toggle</a></li> - <li><a href="@user-manual@config.html#ENABLE-REMOTE-HTTP-TOGGLE">enable-remote-http-toggle</a> - (Most likely you don't need this anyway.)</li> - </ul> - - <p>Please refer to the documentation behind the links to learn how to - enable them again and what the consequences are.</p> - - <p>All enabled features are accessible from the - <a href="@default-cgi@">main menu</a>, some of them - are <em>protected</em> with a referrer check though. - If you got caught by the referrer check, but are <strong>absolutely</strong> sure - you know what you are doing, please <a title="Retry from a trusted referrer" - href="@url@">try again</a>.</p> - - <p>If the <q>Referer:</q> header is blocked, you'll have to make an exception for - Privoxy's web interface first. Note that <em>dumb</em> referrer blocking - is a bad idea anyway, as it makes it easier to fingerprint your - requests. Consider using Privoxy's conditional referrer block instead.</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/cgi-error-file b/external/privoxy/templates/cgi-error-file deleted file mode 100644 index 09bf2cb..0000000 --- a/external/privoxy/templates/cgi-error-file +++ /dev/null @@ -1,139 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy: Actions file not found</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning"> - <h2>Actions file not found</h2> - <p>The actions file you are trying to edit (index <code>@f@</code>) - does not exist, or cannot be read.</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>Privoxy Menu:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/cgi-error-file-read-only b/external/privoxy/templates/cgi-error-file-read-only deleted file mode 100644 index bfce277..0000000 --- a/external/privoxy/templates/cgi-error-file-read-only +++ /dev/null @@ -1,146 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy: Cannot write to actions file</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning"> - <h2>Cannot write to actions file</h2> - <p>The actions file you are trying to edit (<code>@f@.action</code>) - could not be written to.</p> - <p>You many not have permission to write to the file - check the file - permissions. On Windows, right-click the file, choose Properties, - and make sure it is not read-only.</p> - <p>Another reason you may see this message is if you have run out of - disk space. If that is the case, then the actions file has been - truncated - if you get further errors, you may need to fix it - using a text editor.</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>Privoxy Menu:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/cgi-error-modified b/external/privoxy/templates/cgi-error-modified deleted file mode 100644 index 3b04b4b..0000000 --- a/external/privoxy/templates/cgi-error-modified +++ /dev/null @@ -1,157 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy: URL out of date</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning"> - <h2>URL out of date - file has changed since it was generated</h2> - <p>The URL you're viewing is out of date. To prevent possible - damage to your configuration file, this action has been ignored. - </p> - <p>Possible causes:</p> - <ul> - <li>If you got here using your browser's "back" button, then - that is deliberately disabled for this page. Please - navigate around the configuration editor using the - links provided.</li> - <li>Perhaps you've got more than one browser window open, and - you're trying to change the same file in both? You can - only have one editor window open at a time. Your other edit - window should continue to function.</li> - <li>You may have modified the file some other way - perhaps by - editing it with a text editor. Simply go back in to the - configuration interface using the links below.</li> - </ul> - <p>You can go back into the edit interface using the menu below, - or by clicking <a href="edit-actions-list?f=@f@">here</a>. - </p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/cgi-error-parse b/external/privoxy/templates/cgi-error-parse deleted file mode 100644 index 695131c..0000000 --- a/external/privoxy/templates/cgi-error-parse +++ /dev/null @@ -1,176 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy: Parse error</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning"> - <h2>Parse error</h2> - <p>The file you're trying to edit is not valid. You need to fix - it using a text editor before you can edit it using the - web-based editor.</p> - <p>This error should only occur if you edited the file using a text - editor. If you managed to take a valid file and break it this - badly using the web-based editor, please file a bug report!</p> - <p>When you've fixed the problem, you can go back into the edit - interface using the menu below, or by clicking <a - href="edit-actions-list?f=@f@">here</a>. - </p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>Problem description:</h2> - <p>@parse-error@</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>The line which caused the problem:</h2> - <pre>@line-raw@</pre> - </td> - </tr> - - <tr> - <td class="box"> - <h2>The line which caused the problem, with comments removed</h2> - <p><code>@line-data@</code></p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>Note</h2> - <p>Only the first error is reported - the file may contain other - errors, as well as the one reported above.</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/cgi-style.css b/external/privoxy/templates/cgi-style.css deleted file mode 100644 index b66c580..0000000 --- a/external/privoxy/templates/cgi-style.css +++ /dev/null @@ -1,173 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/cgi-style.css,v $ -# -# Purpose : Style sheet for the web-based config interface. -# -# 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: cgi-style.css,v $ -# Revision 1.12 2007/12/11 21:20:53 fabiankeil -# Make strong warnings red too. -# -# Revision 1.11 2007/12/08 14:29:06 fabiankeil -# Use CSS to let the URL and pattern input fields scale with -# the browser width and try to prevent vertical scroll bars -# if the width is less than 80 characters. Closes #1843596, -# thanks to Gerry Murphy and Lee. -# -# Revision 1.10 2007/01/22 13:12:43 fabiankeil -# White space cosmetics for #include. -# -# Revision 1.9 2006/12/17 17:50:55 fabiankeil -# Add white space workaround for tables -# in show-status CGI page. -# -# Revision 1.8 2002/05/12 15:53:41 jongfoster -# Adding standard comment header with license and CVS log. -# -# -############################################################################## - -/* - * CSS for Privoxy CGI and script output - * - * $Id: cgi-style.css,v 1.12 2007/12/11 21:20:53 fabiankeil Exp $ - */ - -/* - * General rules: Font, Color, Headings, Margins, Links - */ -body,td,th { font-family: arial, helvetica, helv, sans-serif; } -body { background-color: #ffffff; color: #000000; } - -h1 { font-size: 140%; margin: 0px; } -h2 { font-size: 120%; margin: 0px; } -h3 { font-size: 110%; margin: 0px; } - -p,pre { margin-left: 15px; } -li { margin: 2px 15px; } -dl { margin: 2px 15px; } - -a:link { color: #0000dd; text-decoration: none; } -a:visited { color: #330099; text-decoration: none; } -a:active { color: #3333ff; text-decoration: none; } - -/* - * Boxen as Table elements: - */ -td.title { border: solid black 1px; background-color: #dddddd; } -td.box { border: solid black 1px; background-color: #eeeeee; } -td.info { border: solid black 1px; background-color: #ccccff; } -td.warning { border: solid black 1px; background-color: #ffdddd; } - -/* - * Special Table Boxen: for nesting, naked container and for - * the Status field in CGI Output: - */ -td.wrapbox { border: solid black 1px; padding: 5px; } -td.container { padding: 0px; } -td.status { border: solid black 1px; background-color: #ff0000; color: #ffffff; font-size: 300%; font-weight: bolder; } - -/* - * Same Boxen as <div>s: - */ -div.title { border: solid black 1px; background-color: #dddddd; margin: 20px; padding: 20px; } -div.box { border: solid black 1px; background-color: #eeeeee; margin: 20px; padding: 20px; } -div.info { border: solid black 1px; background-color: #ccccff; margin: 20px; padding: 20px; } -div.warning { border: solid black 1px; background-color: #ffdddd; margin: 20px; padding: 20px; } -div.wrapbox { border: solid black 1px; margin: 20px; padding: 5px; } - - -/* - * Bold definitions in <dl>s, grey BG for table headings, transparent (no-bordered) table - */ -dt { font-weight: bold; } -th { background-color: #dddddd; } -table.transparent { border-style: none} - -/* - * Special purpose paragraphs: Small for page footers, - * Important for quoting wrong or dangerous examples, - * Whiteframed for the toggle?mini=y CGI - */ -p.small { font-size: 10px; margin: 0px; } -p.important { border: solid black 1px; background-color: #ffdddd; font-weight: bold; padding: 2px; } -p.whiteframed { margin: 5px; padding: 5px; border: solid black 1px; text-align: center; background-color: #eeeeee; } - -/* - * Links as buttons: - */ - -td.buttons { - padding: 2px; -} - -a.cmd, td.indentbuttons a, td.buttons a { - white-space: nowrap; - width: auto; - padding: 2px; - background-color: #dddddd; - color: #000000; - text-decoration: none; - border-top: 1px solid #ffffff; - border-left: 1px solid #ffffff; - border-bottom: 1px solid #000000; - border-right: 1px solid #000000; -} -a.cmd:hover, td.indentbuttons a:hover, td.buttons a:hover { - background-color: #eeeeee; -} -a.cmd:active, td.indentbuttons a:active, td.buttons a:active { - border-top: 1px solid #000000; - border-left: 1px solid #000000; - border-bottom: 1px solid #ffffff; - border-right: 1px solid #ffffff; -} - - -/* - * Special red emphasis: - */ -em.warning, strong.warning { color: #ff0000 } - -/* - * In show-status we use tables directly behind headlines - * and for some reason or another the headlines are set to - * "margin:0" and leave the tables no air to breath. - * - * A proper fix would be to replace or remove the "margin:0", - * but as this affects every cgi page we do it another time - * and use this workaround until then. - */ -.box table { margin-top: 1em; } - -/* - * Let the URL and pattern input fields scale with the browser - * width and try to prevent vertical scroll bars if the width - * is less than 80 characters. - */ -input.url, input.pattern { width: 95%; } diff --git a/external/privoxy/templates/connect-failed b/external/privoxy/templates/connect-failed deleted file mode 100644 index 3607552..0000000 --- a/external/privoxy/templates/connect-failed +++ /dev/null @@ -1,156 +0,0 @@ -########################################################## -# -# Connect-Failed Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# host-ip: -# 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 -# 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 -# 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. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>503 - Connect failed (Privoxy@@my-hostname@)</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> - <style type="text/css"> -#include cgi-style.css - </style> -</head> - -<body> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="status"> - 503 - </td> - <td class="title" style="width: 100%"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning" colspan="2"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning" colspan=2> - <h2>Connect failed</h2> - <p>Your request for <a href="@protocol@@hostport@@path@"><b>@protocol@@hostport@@path@</b></a> could - not be fulfilled, because the connection to <b>@host@</b> (@host-ip@) could not be established. - </p> - <p>This is often a temporary failure, so you might just - <a href="@protocol@@hostport@@path@">try again</a>. - </p> - </td> - </tr> - - <tr> - <td class="box" colspan="2"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info" colspan="2"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info" colspan="2"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/default b/external/privoxy/templates/default deleted file mode 100644 index 065aedc..0000000 --- a/external/privoxy/templates/default +++ /dev/null @@ -1,131 +0,0 @@ -########################################################## -# -# Default-CGI Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# 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. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy@@my-hostname@</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Privoxy Menu:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/edit-actions-add-url-form b/external/privoxy/templates/edit-actions-add-url-form deleted file mode 100644 index 32ee64f..0000000 --- a/external/privoxy/templates/edit-actions-add-url-form +++ /dev/null @@ -1,216 +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.18 2007/12/08 14:36:43 fabiankeil -# - Use the shiny new CSS "pattern" class. -# - s@URL Pattern@URL or TAG Pattern@ -# -# Revision 1.17 2007/01/23 16:03:16 fabiankeil -# - Add favicon links. -# - Remove useless W3C validator links. -# -# Revision 1.16 2006/07/18 14:49:13 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.14.2.2 2002/08/23 02:22:53 hal9 -# Fix a perl brain fart with <li> in comments. -# -# Revision 1.14 2002/05/21 19:10:30 oes -# - Added jump target and button style to "cancel" link -# - Fixed title -# -# Revision 1.13 2002/04/10 13:32:53 oes -# Made templates modular -# -# Revision 1.12 2002/04/08 17:08:14 oes -# Cosmetic: make status in title lowercase -# -# Revision 1.11 2002/04/05 16:01:33 oes -# Correct HTML, external Stylesheets, eye candy, some fixes -# -# Revision 1.10 2002/03/26 22:29:56 swa -# we have a new homepage! -# -# Revision 1.9 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.8 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.7 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.6 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.5 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.4 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.3 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.2 2002/01/17 21:21:03 jongfoster -# DOS->Unix line endings -# -# Revision 1.1 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# section -# -############################################################################# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> - - <title>Privoxy@@my-hostname@: Add URL Pattern</title> - - <script type="text/javascript"> -<!-- - function validate(text) - { - if (text=="") - { - alert("You need to type a pattern in order to continue!"); - return false; - } - - return true; -} -//--> - </script> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Add URL or TAG Pattern</h2> - <form method="GET" action="edit-actions-add-url" - onSubmit="return validate(u.value);"> - <p> - <input type="hidden" name="f" value="@f@"> - <input type="hidden" name="v" value="@v@"> - <input type="hidden" name="s" value="@s@"> - <input type="text" name="u" value="" size="78" class="pattern"><br> - <input type="submit" value="Submit"> - <input type="reset" value="Reset"> - <a class="cmd" href="edit-actions-list?f=@f@#l@s@">Cancel</a> - </p> - </form> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> - diff --git a/external/privoxy/templates/edit-actions-for-url b/external/privoxy/templates/edit-actions-for-url deleted file mode 100644 index fd673af..0000000 --- a/external/privoxy/templates/edit-actions-for-url +++ /dev/null @@ -1,1425 +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-2008 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.56 2008/09/20 10:04:33 fabiankeil -# Remove hide-forwarded-for-headers action which has -# been obsoleted by change-x-forwarded-for{block}. -# -# Revision 1.55 2008/09/19 15:26:29 fabiankeil -# Add change-x-forwarded-for{} action to block or add -# X-Forwarded-For headers. Mostly based on code removed -# before 3.0.7. -# -# Revision 1.54 2008/03/29 12:14:27 fabiankeil -# Remove send-wafer and send-vanilla-wafer actions. -# -# Revision 1.53 2008/03/28 15:13:45 fabiankeil -# Remove inspect-jpegs action. -# -# Revision 1.52 2008/03/15 14:52:36 fabiankeil -# Add CGI editor support for the "disable all filters of this type" -# directives "-client-header-filter", "-server-header-filter", -# "-client-header-tagger" and "-server-header-tagger". -# -# Revision 1.51 2008/03/07 16:46:49 fabiankeil -# Reword limit-connect{} entry. -# -# Revision 1.50 2008/03/04 18:30:44 fabiankeil -# Remove the treat-forbidden-connects-like-blocks action. We now -# use the "blocked" page for forbidden CONNECT requests by default. -# -# Revision 1.49 2008/03/01 14:00:47 fabiankeil -# Let the block action take the reason for the block -# as argument and show it on the "blocked" page. -# -# Revision 1.48 2007/12/11 21:18:55 fabiankeil -# Make forward-override accessible through the CGI editor. -# -# Revision 1.47 2007/12/06 18:21:55 fabiankeil -# Update hide-forwarded-for-headers description. -# -# Revision 1.46 2007/11/10 15:06:10 fabiankeil -# - Add support for +hide-referrer{conditional-forge}. -# - Minor rewordings. -# -# Revision 1.45 2007/05/24 13:38:45 fabiankeil -# Two minor fixes. -# -# Revision 1.44 2007/04/15 16:39:21 fabiankeil -# Introduce tags as alternative way to specify which -# actions apply to a request. At the moment tags can be -# created based on client and server headers. -# -# Revision 1.43 2007/03/29 11:40:34 fabiankeil -# Divide @filter-params@ into @client-header-filter-params@ -# @content-filter-params@ and @server-header-filter-params@. -# -# Revision 1.42 2007/03/20 15:40:00 fabiankeil -# Adjust to new world order with dedicated header-filter actions. -# -# Revision 1.41 2007/01/23 16:03:16 fabiankeil -# - Add favicon links. -# - Remove useless W3C validator links. -# -# Revision 1.40 2006/12/21 13:01:03 fabiankeil -# Prepare for "split-large-forms". -# -# Mention that redirect{} now also understands -# a single pcrs job as argument. -# -# Add some table summaries and remove useless validator link. -# -# Revision 1.39 2006/10/04 17:37:54 fabiankeil -# JavaScript fix for bug report #1570678. -# -# Revision 1.38 2006/09/08 12:06:35 fabiankeil -# Have hide-if-modified-since interpret the random -# range value as minutes instead of hours. Allows -# more fine-grained configuration. -# -# Revision 1.37 2006/09/05 18:20:14 fabiankeil -# Sorted alphabetically, fixed spelling mistakes -# and shortened some descriptions. -# -# Revision 1.36 2006/08/14 08:29:17 fabiankeil -# Split filter-headers{} into filter-client-headers{} -# and filter-server-headers{}. -# -# Revision 1.35 2006/08/03 02:46:42 david__schmidt -# Incorporate Fabian Keil's patch work:http://www.fabiankeil.de/sourcecode/privoxy/ -# -# Revision 1.34 2006/07/18 14:49:13 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.29.2.5 2004/10/05 03:17:26 david__schmidt -# Typo: inspect_jpegs, not inspect-jpegs in form -# -# Revision 1.29.2.4 2004/10/03 12:53:46 david__schmidt -# Add the ability to check jpeg images for invalid -# lengths of comment blocks. Defensive strategy -# against the exploit: -# Microsoft Security Bulletin MS04-028 -# Buffer Overrun in JPEG Processing (GDI+) Could -# Allow Code Execution (833987) -# Enabled with +inspect-jpegs in actions files. -# -# Revision 1.29.2.3 2002/08/23 02:22:53 hal9 -# Fix a perl brain fart with <li> in comments. -# -# Revision 1.29.2.1 2002/08/02 12:51:42 oes -# Added top submit button; Consistency with docs: Change default name for action from hide-referer to hide-referrer -# -# Revision 1.29 2002/05/21 19:10:57 oes -# Fixed JavaScript error -# -# Revision 1.28 2002/05/14 21:36:38 oes -# - Renamed prevent-(setting/reading)-cookies to -# crunch-(incoming/outgoing)-cookies -# - Renamed helplink export to actions-help-prefix -# - Restored alphabetical order of actions -# -# Revision 1.27 2002/04/26 22:55:26 jongfoster -# Removing the alternating colors because they've been wrong -# since the actions renames, they're high maintenance, they -# don't look particularly good, and now there are gaps between -# the table cells we don't need them. -# -# Revision 1.26 2002/04/26 21:55:17 jongfoster -# Cosmetic change: Making the +filter UI look the same as -# the other actions. -# -# Revision 1.25 2002/04/26 21:37:50 jongfoster -# Fixing all(?) the substitutions that were broken in the -# recent actions rename. -# -# Revision 1.24 2002/04/26 18:24:28 jongfoster -# Fixing typos in help hyperlinks -# -# Revision 1.23 2002/04/26 12:57:02 oes -# Actions renamed, alphabetically sorted, comments fixed, and names linked to help -# -# Revision 1.22 2002/04/10 13:32:53 oes -# Made templates modular -# -# Revision 1.21 2002/04/08 17:05:18 oes -# Inline a style exception -# -# Revision 1.20 2002/04/05 16:01:30 oes -# Correct HTML, external Stylesheets, eye candy, some fixes -# -# Revision 1.19 2002/03/26 22:29:56 swa -# we have a new homepage! -# -# 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-referrer-param-forge -# hide-referrer-param-block -# hide-referrer-param-custom -# hide-referrer-param -# hide-user-agent-param -# image-blocker-param-pattern -# image-blocker-param-blank -# image-blocker-param-custom -# -# -############################################################################# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> - - <title>Privoxy@@my-hostname@: Edit actions</title> - -<style type="text/css"> -td.action { font-weight: bold; - font-style: italic; - white-space: nowrap } -td.subaction { font-style: italic } -th { font-weight: bold; } -# This is the key to the color names below: -# bg=background, en="Enable", dis="Disable", noc="No Change", hdr=header -# 1=odd rows, 2=even rows, h=Table header -tr.hdr { background-color: #999999 } -tr.bg1 { background-color: #eeeeee } -td.en1 { background-color: #ddffdd } -td.dis1 { background-color: #ffdddd } -td.noc1 { background-color: #ddddff } -th.enh { background-color: #99ff99 } -th.dish { background-color: #ff9999 } -th.noch { background-color: #9999ff } -table.wide { padding: 5px; } -td.green { border: solid black 1px; background-color: #ddffdd; } -</style> - -<!-- -border-color: white; - border-style: solid; - border-left-width: 10px; - border-right-width: 10px; - border-top-width: 0px; - border-bottom-width: 0px } ---> - -<script type="text/javascript"> -<!-- - -function hide_from_header_param_disable(tf) -{ - if (document.getElementById) { - // NS6 or IE5 - document.getElementById("hide_from_header_param").disabled = tf; - } else if (document.all) { - // IE4 - document.myform.hide_from_header_param.disabled = tf; - } -} - -function hide_referrer_param_disable(tf) -{ - if (document.getElementById) { - document.getElementById("hide_referrer_param").disabled = tf; - } else if (document.all) { - document.myform.hide_referrer_param.disabled = tf; - } -} - -function set_image_blocker_param_disable(tf) -{ - if (document.getElementById) { - document.getElementById("set_image_blocker_param").disabled = tf; - } else if (document.all) { - document.myform.set_image_blocker_param.disabled = tf; - } -} - -function show_add_header_opts(tf) -{ - if (document.getElementById) { - target = document.getElementById("add_header_opts"); - } else if (document.all) { - target = document.add_header_opts; - } else { - return; - } - target.style.display = (tf ? "" : "none"); -} - -function show_deanimate_opts(tf) -{ - if (document.getElementById) { - target = document.getElementById("deanimate_opts"); - } else if (document.all) { - target = document.deanimate_opts; - } else { - return; - } - target.style.display = (tf ? "" : "none"); -} - -function show_hide_from_header_opts(tf) -{ - if (document.getElementById) { - target = document.getElementById("hide_from_header_opts"); - } else if (document.all) { - target = document.hide_from_header_opts; - } else { - return; - } - target.style.display = (tf ? "" : "none"); -} - -function show_hide_referrer_opts(tf) -{ - if (document.getElementById) { - target = document.getElementById("hide_referrer_opts"); - } else if (document.all) { - target = document.hide_referrer_opts; - } else { - return; - } - target.style.display = (tf ? "" : "none"); -} - -function show_user_agent_opts(tf) -{ - if (document.getElementById) { - target = document.getElementById("user_agent_opts"); - } else if (document.all) { - target = document.user_agent_opts; - } else { - return; - } - target.style.display = (tf ? "" : "none"); -} - -function show_set_image_blocker_opts(tf) -{ - if (document.getElementById) { - target = document.getElementById("set_image_blocker_opts"); - } else if (document.all) { - target = document.set_image_blocker_opts; - } else { - return; - } - target.style.display = (tf ? "" : "none"); -} - -function show_limit_connect_opts(tf) -{ - if (document.getElementById) { - target = document.getElementById("limit_connect_opts"); - } else if (document.all) { - target = document.limit_connect_opts; - } else { - return; - } - target.style.display = (tf ? "" : "none"); -} - -//--> -</script> -</head> - -<body> - -<!-- @if-one-form-only-start --> -<form method="GET" action="edit-actions-submit" id="myform" name="myform"> -<!-- if-one-form-only-end@ --> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - -<!-- @if-one-form-only-start --> - <tr> - <td class="box"> - <h2>Edit Actions - <input type="hidden" name="f" value="@f@"> - <input type="hidden" name="v" value="@v@"> - <input type="hidden" name="s" value="@s@"> - </h2> - </td> - </tr> - - <tr> - <td class="green" align="center"> - <p><input type="submit" value="Submit" name="Submit"></p> - </td> - </tr> -<!-- if-one-form-only-end@ --> - -<tr><td class="wrapbox"> - -<!-- @if-multiple-forms-start --> -<form method="GET" action="edit-actions-submit" id="myform" name="myform"> - <h2>Edit Actions (Section 1)</h2> -<!-- if-multiple-forms-end@ --> - - <table summary="Action section 1" border="0" cellspacing="2" width="100%" class="wide"> - <tr class="hdr" align="left"> - <th class="enh" align="center">Enable</th> - <th class="dish" align="center">Disable</th> - <th class="noch" align="center">No Change</th> - <th>Action</th> - <th>Description</th> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="add_header" id="add_header_y" value="Y" @add-header-y@ - onclick="show_add_header_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="add_header" value="N" @add-header-n@ - onclick="show_add_header_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="add_header" value="X" @add-header-x@ - onclick="show_add_header_opts(false)"></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@ADD-HEADER">add-header</a></td> - <td>Adds HTTP headers.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="add_header_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>Editing the settings for this option, or turning - it on if it was off, is not yet supported using this web-based - editor.</td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="block" value="Y" @block-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="block" value="N" @block-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="block" value="X" @block-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@BLOCK">block</a></td> - <td>Block the request.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="block_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>Block reason to tell the user:<br> - <input type="text" name="block_mode" size="40" value="@block-param@"> - </td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="change_x_forwarded_for" id="change_x_forwarded_for_y" value="Y" @change-x-forwarded-for-y@ - onclick="show_change_x_forwarded_for_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="change_x_forwarded_for" value="N" @change-x-forwarded-for-n@ - onclick="show_change_x_forwarded_for_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="change_x_forwarded_for" value="X" @change-x-forwarded-for-x@ - onclick="show_change_x_forwarded_for_opts(false)"></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CHANGE-X-FORWARDED-FOR">change-x-forwarded-for</a></td> - <td>Specifies whether to block or add X-Forwarded-For headers.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="change_x_forwarded_for_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="change_x_forwarded_for_mode" value="block" - id="change_x_forwarded_for_mode_block" @change-x-forwarded-for-param-block@><label - for="change_x_forwarded_for_mode_block">Block the header.</label><br> - <input type="radio" name="change_x_forwarded_for_mode" value="add" - id="change_x_forwarded_for_mode_add" @change-x-forwarded-for-param-add@><label - for="change_x_forwarded_for_mode_add">Add the header.</label><br> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1"> </td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="client_header_filter_all" id="client_header_filter_all_n" value="N" @client-header-filter-all-n@ ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="client_header_filter_all" id="client_header_filter_all_x" value="X" @client-header-filter-all-x@ ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CLIENT-HEADER-FILTER">client-header-filter</a> *</td> - <td>Filter the client headers. - You can use the radio buttons on this line to disable - all client-header filters applied by previous rules, and/or - you can enable or disable the filters individually below.</td> - </tr> -@client-header-filter-params@ - <tr class="bg1" align="left" valign="top"> - <td class="en1"> </td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="client_header_tagger_all" id="client_header_tagger_all_n" value="N" @client-header-tagger-all-n@ ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="client_header_tagger_all" id="client_header_tagger_all_x" value="X" @client-header-tagger-all-x@ ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CLIENT-HEADER-TAGGER">client-header-tagger</a> *</td> - <td>Create tags based on the client headers. - You can use the radio buttons on this line to disable - all client-header taggers applied by previous rules, and/or - you can enable or disable the taggers individually below.</td> - </tr> -@client-header-tagger-params@ - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="content_type_overwrite" value="Y" @content-type-overwrite-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="content_type_overwrite" value="N" @content-type-overwrite-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="content_type_overwrite" value="X" @content-type-overwrite-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CONTENT_TYPE_OVERWRITE">content-type-overwrite</a></td> - <td>Replace Content-Type header. By default it only applies to - text documents, but if you know what you're doing you - can enable force-text-mode to modify binary content types as well.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="content_type_overwrite_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>New Content-Type:<br> - <input type="text" name="content_type_overwrite_mode" size="40" - value="@content-type-overwrite-param@"></td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="crunch_client_header" id="crunch_client_header_y" value="Y" @crunch-client-header-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="crunch_client_header" value="N" @crunch-client-header-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="crunch_client_header" value="X" @crunch-client-header-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CRUNCH-CLIENT-HEADER">crunch-client-header</a></td> - <td>Remove header(s) matching the supplied pattern.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="crunch_client_header_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>Header string to suppress:<br> - <input type="text" name="crunch_client_header_mode" size="40" - value="@crunch-client-header-param@"></td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="crunch_if_none_match" value="Y" @crunch-if-none-match-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="crunch_if_none_match" value="N" @crunch-if-none-match-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="crunch_if_none_match" value="X" @crunch-if-none-match-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CRUNCH_IF_NONE_MATCH">crunch-if-none-match</a></td> - <td>Remove If-None-Match header. Useful for filter testing - and to make sure the header can't be used to track your visits.</td> - </tr> - - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="crunch_incoming_cookies" value="Y" @crunch-incoming-cookies-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="crunch_incoming_cookies" value="N" @crunch-incoming-cookies-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="crunch_incoming_cookies" value="X" @crunch-incoming-cookies-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</a></td> - <td>Prevent the website from setting HTTP cookies on your system.</td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="crunch_outgoing_cookies" value="Y" @crunch-outgoing-cookies-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="crunch_outgoing_cookies" value="N" @crunch-outgoing-cookies-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="crunch_outgoing_cookies" value="X" @crunch-outgoing-cookies-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</a></td> - <td>Prevent the website from reading HTTP cookies from your system.</td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="crunch_server_header" id="crunch_server_header_y" value="Y" @crunch-server-header-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="crunch_server_header" value="N" @crunch-server-header-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="crunch_server_header" value="X" @crunch-server-header-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@CRUNCH-SERVER-HEADER">crunch-server-header</a></td> - <td>Remove server header(s) matching the supplied pattern.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="crunch_server_header_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>Header string to suppress:<br> - <input type="text" name="crunch_server_header_mode" size="40" - value="@crunch-server-header-param@"></td> - </tr> - - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="deanimate_gifs" id="deanimate_gifs_y" value="Y" @deanimate-gifs-y@ - onclick="show_deanimate_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="deanimate_gifs" value="N" @deanimate-gifs-n@ - onclick="show_deanimate_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="deanimate_gifs" value="X" @deanimate-gifs-x@ - onclick="show_deanimate_opts(false)"></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@DEANIMATE-GIFS">deanimate-gifs</a></td> - <td>Replace animated GIFs with their (first/last) frame.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="deanimate_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>Use the <input type="radio" name="deanimate_gifs_mode" - value="first" id="deanimate_first" @deanimate-gifs-param-first@><label - for="deanimate_first">first frame</label> <input - type="radio" name="deanimate_gifs_mode" value="last" - id="deanimate_last" @deanimate-gifs-param-last@><label - for="deanimate_last">last frame</label></td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="downgrade_http_version" value="Y" @downgrade-http-version-y@></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="downgrade_http_version" value="N" @downgrade-http-version-n@></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="downgrade_http_version" value="X" @downgrade-http-version-x@></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@DOWNGRADE-HTTP-VERSION" - >downgrade-http-version</a></td> - <td>Change HTTP/1.1 requests to HTTP/1.0. Only change if you know - what you're doing!</td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="fast_redirects" value="Y" @fast-redirects-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="fast_redirects" value="N" @fast-redirects-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="fast_redirects" value="X" @fast-redirects-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@FAST-REDIRECTS">fast-redirects</a></td> - <td>Bypass some click-tracking URLs.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="fast-redirects_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td> - <input type="radio" name="fast_redirects_mode" - value="simple-check" id="fast_redirects_simple_check" @fast-redirects-param-simple-check@><label - for="fast_redirects_simple_check">Simple check.</label> - <br> - <input type="radio" name="fast_redirects_mode" value="check-decoded-url" - id="fast_redirects_check_decoded_url" @fast-redirects-param-check-decoded-url@><label - for="fast_redirects_check_decoded_url">Decode URL before checking.</label></td> - </tr> -<!-- @if-multiple-forms-start --> - </table> - <p> - <input type="hidden" name="f" value="@f@"> - <input type="hidden" name="v" value="@v@"> - <input type="hidden" name="s" value="@s@"> - <input type="submit" value="Submit changes in Section 1" name="Submit"> - </p> - </form> - </td></tr> - <tr><td class="wrapbox"> - <form method="GET" action="edit-actions-submit" id="myform-2" name="myform"> - <h2>Edit Actions (Section 2)</h2> - <table summary="Action section 2" border="0" cellspacing="2" width="100%" class="wide"> - <tr class="hdr" align="left"> - <th class="enh" align="center">Enable</th> - <th class="dish" align="center">Disable</th> - <th class="noch" align="center">No Change</th> - <th>Action</th> - <th>Description</th> - </tr> -<!-- if-multiple-forms-end@ --> - <tr class="bg1" align="left" valign="top"> - <td class="en1"> </td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="filter_all" id="filter_all_n" value="N" @filter-all-n@ ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="filter_all" id="filter_all_x" value="X" @filter-all-x@ ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@FILTER">filter</a> *</td> - <td>Filter the website through regular expression - filters. You can use the radio buttons on this line to disable - all filters applied by previous rules, and/or you can enable or - disable the filters individually below.</td> - </tr> - -@content-filter-params@ - -<!-- @if-multiple-forms-start --> - </table> - <p> - <input type="hidden" name="f" value="@f@"> - <input type="hidden" name="v" value="@v@"> - <input type="hidden" name="s" value="@s@"> - <input type="submit" value="Submit changes in Section 2" name="Submit"> - </p> - </form> - </td></tr> - <tr><td class="wrapbox"> - <form method="GET" action="edit-actions-submit" id="myform-3" name="myform"> - <h2>Edit Actions (Section 3)</h2> - <table summary="Action section 3" border="0" cellspacing="2" width="100%" class="wide"> - <tr class="hdr" align="left"> - <th class="enh" align="center">Enable</th> - <th class="dish" align="center">Disable</th> - <th class="noch" align="center">No Change</th> - <th>Action</th> - <th>Description</th> - </tr> -<!-- if-multiple-forms-end@ --> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="force_text_mode" value="Y" @force-text-mode-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="force_text_mode" value="N" @force-text-mode-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="force_text_mode" value="X" @force-text-mode-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@FORCE_TEXT_MODE">force-text-mode</a></td> - <td> - Enable filtering on documents whose Content-Type wasn't recognized as text. - Do think twice, nothing is alright. - </td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="forward_override" id="forward_override_y" value="Y" @forward-override-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="forward_override" id="forward_override_n" value="N" @forward-override-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="forward_override" id="forward_override_x" value="X" @forward-override-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@FORWARD-OVERRIDE">forward-override</a></td> - <td>Override forward directives in the configuration file. - Note that the <a href="@user-manual@actions-file.html#FORWARD-OVERRIDE">parameter syntax</a> - isn't checked until the action is used. <strong class="warning">Syntax errors - will cause Privoxy to exit.</strong></td> - </tr> - <tr class="bg1" align="left" valign="top" id="forward_override_language_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td> - Overriding forward directive:<br> - <input type="text" name="forward_override_param" - id="forward_override_param" size="40" - value="@forward-override-param@"><br> - </td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="handle_as_empty_document" value="Y" @handle-as-empty-document-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="handle_as_empty_document" value="N" @handle-as-empty-document-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="handle_as_empty_document" value="X" @handle-as-empty-document-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HANDLE_AS_EMPTY_DOCUMENT">handle-as-empty-document</a></td> - <td> - Block with an <em>empty</em> document instead of an Image or HTML message. - The <em>empty</em> document contains only a space and can safely be parsed - as JavaScript or Style Sheet. Use content-type-overwrite to specify the - Content-Type, default is <q>text/html</q>. - </td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="handle_as_image" value="Y" @handle-as-image-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="handle_as_image" value="N" @handle-as-image-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="handle_as_image" value="X" @handle-as-image-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HANDLE-AS-IMAGE">handle-as-image</a></td> - <td>Request is for an image (only useful in conjunction with the <i><b><a href="@user-manual@@actions-help-prefix@BLOCK">block</a></b></i> - and <i><b><a href="@user-manual@@actions-help-prefix@SET-IMAGE-BLOCKER">set-image-blocker</a></b></i> actions).</td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="hide_accept_language" id="hide_accept_language_y" value="Y" @hide-accept-language-y@ - onclick="show_hide_accept_language_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="hide_accept_language" id="hide_accept_language_n" value="N" @hide-accept-language-n@ - onclick="show_hide_accept_language_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="hide_accept_language" id="hide_accept_language_x" value="X" @hide-accept-language-x@ - onclick="show_hide_accept_language_opts(false)" - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HIDE-ACCEPT-LANGUAGE">hide-accept-language</a></td> - <td>Pretend to have different language settings. (Makes a fake User-Agent more believable, - but you may end up with content in the language you pretended to understand.)</td> - </tr> - <tr class="bg1" align="left" valign="top" id="hide_accept-language_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="hide_accept_language_mode" value="block" - onclick="hide_accept_language_param_disable(true)" - @hide-accept-language-param-block@ id="hide_accept_language_mode_block"><label - for="hide_accept_language_mode_block">Remove Accept-Language header without replacement.</label> - <br> - <input type="radio" name="hide_accept_language_mode" value="CUSTOM" - onclick="hide_accept_language_param_disable(false)" - @hide-accept-language-param-custom@ id="hide_accept_language_mode_set"><label - for="hide_accept_language_mode_set">Fake these language settings:</label><br> - <input type="text" name="hide_accept_language_param" - id="hide_accept_language_param" size="40" - value="@hide-accept-language-param@"><br> - </td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="hide_content_disposition" id="hide_content_disposition_y" value="Y" @hide-content-disposition-y@ - onclick="show_hide_content_disposition_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="hide_content_disposition" id="hide_content_disposition_n" value="N" @hide-content-disposition-n@ - onclick="show_hide_content_disposition_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="hide_content_disposition" id="hide_content_disposition_x" value="X" @hide-content-disposition-x@ - onclick="show_hide_content_disposition_opts(false)" - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HIDE-CONTENT-DISPOSITION">hide-content-disposition</a></td> - <td>Block or overwrite the content-disposition header. Useful to view a document inside the browser, - even if you were supposed to save it first, or to change the suggested file name.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="hide_content_disposition_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="hide_content_disposition_mode" value="block" - onclick="hide_content_disposition_param_disable(true)" - @hide-content-disposition-param-block@ id="hide_content_disposition_mode_block"><label - for="hide_content_disposition_mode_block">Remove content-disposition header without replacement.</label> - <br> - <input type="radio" name="hide_content_disposition_mode" value="CUSTOM" - onclick="hide_content_disposition_param_disable(false)" - @hide-content-disposition-param-custom@ id="hide_content_disposition_mode_set"><label - for="hide_content_disposition_mode_set">Overwrite content-dispostion header with:</label><br> - <input type="text" name="hide_content_disposition_param" - id="hide_content_disposition_param" size="40" - value="@hide-content-disposition-param@"><br> - </td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="hide_from_header" id="hide_from_header_y" value="Y" @hide-from-header-y@ - onclick="show_hide_from_header_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="hide_from_header" value="N" @hide-from-header-n@ - onclick="show_hide_from_header_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="hide_from_header" value="X" @hide-from-header-x@ - onclick="show_hide_from_header_opts(false)"></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HIDE-FROM-HEADER">hide-from-header</a></td> - <td>Stop old web browsers from sending the user's e-mail address with - every request.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="hide_from_header_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="hide_from_header_mode" value="block" - onclick="hide_from_header_param_disable(true);" - @hide-from-header-param-block@ id="hide_from_header_mode_block"><label - for="hide_from_header_mode_block">Remove completely</label><br> - <input type="radio" name="hide_from_header_mode" value="CUSTOM" - onclick="hide_from_header_param_disable(false);" - @hide-from-header-param-custom@ id="hide_from_header_mode_set"><label - for="hide_from_header_mode_set">Fake e-mail address:</label><br> - <input type="text" name="hide_from_header_param" id="hide_from_header_param" - size="40" value="@hide-from-header-param@"></td> - </tr> - - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="hide_if_modified_since" value="Y" @hide-if-modified-since-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="hide_if_modified_since" value="N" @hide-if-modified-since-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="hide_if_modified_since" value="X" @hide-if-modified-since-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HIDE_IF_MODIFIED_SINCE">hide-if-modified-since</a></td> - <td>Remove or randomize the If-Modified-Since header.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="hide_if-modifed-since_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="hide_if_modified_since_mode" value="block" - onclick="hide_if_modified_since_param_disable(true)" - @hide-if-modified-since-param-block@ id="hide_if_modified_since_mode_block"><label - for="hide_if_modified_since_mode_block">Remove without replacement.</label> - Useful for filter testing.<br> - <input type="radio" name="hide_if_modified_since_mode" value="CUSTOM" - onclick="hide_if_modified_since_param_disable(true)" - @hide-if-modified-since-param-custom@ id="hide_if_modified_since_mode_set"><label - for="hide_if_modified_since_mode_set">Add random amount of seconds in the range of</label> - <input type="text" name="hide_if_modified_since_param" - id="hide_if_modified_since_param" size="4" - value="@hide-if-modified-since-param@"> minute(s). - To appreciate this option a small amount of paranoia is required, - but at least in theory the If-Modified-Since header could be used - to keep track of your visits. - </td> - </tr> -<!-- @if-multiple-forms-start --> - </table> - <p> - <input type="hidden" name="f" value="@f@"> - <input type="hidden" name="v" value="@v@"> - <input type="hidden" name="s" value="@s@"> - <input type="submit" value="Submit changes in Section 3" name="Submit"> - </p> - </form> - </td></tr> - <tr><td class="wrapbox"> - <form method="GET" action="edit-actions-submit" id="myform-4" name="myform"> - <h2>Edit Actions (Section 4)</h2> - <table summary="Action section 4" border="0" cellspacing="2" width="100%" class="wide"> - <tr class="hdr" align="left"> - <th class="enh" align="center">Enable</th> - <th class="dish" align="center">Disable</th> - <th class="noch" align="center">No Change</th> - <th>Action</th> - <th>Description</th> - </tr> -<!-- if-multiple-forms-end@ --> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="hide_referrer" id="hide_referrer_y" value="Y" @hide-referrer-y@ - onclick="show_hide_referrer_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="hide_referrer" id="hide_referrer_n" value="N" @hide-referrer-n@ - onclick="show_hide_referrer_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="hide_referrer" id="hide_referrer_x" value="X" @hide-referrer-x@ - onclick="show_hide_referrer_opts(false)" - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HIDE-REFERRER">hide-referrer</a></td> - <td>Helps prevent tracking by not sending the URL of the previous web - page. </td> - </tr> - <tr class="bg1" align="left" valign="top" id="hide_referrer_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="hide_referrer_mode" value="block" - onclick="hide_referrer_param_disable(true)" - @hide-referrer-param-block@ id="hide_referrer_mode_block"><label - for="hide_referrer_mode_block">Remove completely</label> (breaks images - on some free web hosts).<br> - <input type="radio" name="hide_referrer_mode" value="forge" - onclick="hide_referrer_param_disable(true)" - @hide-referrer-param-forge@ id="hide_referrer_mode_forge"><label - for="hide_referrer_mode_forge">Fake as the root directory of the - site</label> (fools checks for in-site links.)<br> - <input type="radio" name="hide_referrer_mode" value="CUSTOM" - onclick="hide_referrer_param_disable(false)" - @hide-referrer-param-custom@ id="hide_referrer_mode_set"><label - for="hide_referrer_mode_set">Fake as this web address:</label><br> - <input type="text" name="hide_referrer_param" - id="hide_referrer_param" size="40" - value="@hide-referrer-param@"><br> - <input type="radio" name="hide_referrer_mode" value="conditional-block" - onclick="hide_referrer_param_disable(true)" - @hide-referrer-param-conditional-block@ id="hide_referrer_mode_conditional-block"><label - for="hide_referrer_mode_conditional-block">Remove completely if host has changed, - but don't touch in-site referrers. - Less suspicious than the options above.</label><br> - <input type="radio" name="hide_referrer_mode" value="conditional-forge" - onclick="hide_referrer_param_disable(true)" - @hide-referrer-param-conditional-forge@ id="hide_referrer_mode_conditional-forge"><label - for="hide_referrer_mode_conditional-forge">Forge referrer if host has - changed, but don't touch in-site referrers.</label><br> - </td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="hide_user_agent" id="hide_user_agent_y" value="Y" @hide-user-agent-y@ - onclick="show_user_agent_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="hide_user_agent" value="N" @hide-user-agent-n@ - onclick="show_user_agent_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="hide_user_agent" value="X" @hide-user-agent-x@ - onclick="show_user_agent_opts(false)"></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@HIDE-USER-AGENT">hide-user-agent</a></td> - <td>Pretend to be using a different web browser. (May cause problems with broken web sites).</td> - </tr> - <tr class="bg1" align="left" valign="top" id="user_agent_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>User Agent string to send:<br> - <input type="text" name="hide_user_agent_mode" size="40" - value="@hide-user-agent-param@"></td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="limit_connect" id="limit_connect_y" value="Y" @limit-connect-y@ - onclick="show_limit_connect_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="limit_connect" value="N" @limit-connect-n@ - onclick="show_limit_connect_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="limit_connect" value="X" @limit-connect-x@ - onclick="show_limit_connect_opts(false)"></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@LIMIT-CONNECT">limit-connect</a></td> - <td>Limit which ports are allowed in HTTP CONNECT requests. These requests are - used to tunnel SSL and other protocols through HTTP proxies.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="limit_connect_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>Legal ports (comma separated, ranges allowed):<br> - <input type="text" name="limit_connect_mode" size="40" - value="@limit-connect-param@"></td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="overwrite_last_modified" value="Y" @overwrite-last-modified-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="overwrite_last_modified" value="N" @overwrite-last-modified-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="overwrite_last_modified" value="X" @overwrite-last-modified-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@OVERWRITE_LAST_MODIFIED">overwrite-last-modified</a></td> - <td>Remove or randomize the Last-Modified header.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="overwrite_last_modified_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="overwrite_last_modified_mode" value="block" - onclick="overwrite_last_modified_param_disable(true)" - @overwrite-last-modified-param-block@ id="overwrite_last_modified_mode_block"><label - for="overwrite_last_modified_mode_block">Remove without replacement.</label> - <br> - <input type="radio" name="overwrite_last_modified_mode" value="reset-to-request-time" - onclick="overwrite_last_modified_param_disable(true)" - @overwrite-last-modified-param-reset-to-request-time@ - id="overwrite_last_modified_mode_reset-to-request-time"><label - for="overwrite_last_modified_mode_reset-to-request-time">Reset to the time of the request.</label> - <br> - <input type="radio" name="overwrite_last_modified_mode" value="randomize" - onclick="overwrite_last_modified_param_disable(true)" - @overwrite-last-modified-param-randomize@ - id="overwrite_last_modified_mode_randomize"><label - for="overwrite_last_modified_mode_randomize">Overwrite with random value - between original header value and the time of the request.</label> - </td> - </tr> - - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="prevent_compression" value="Y" @prevent-compression-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="prevent_compression" value="N" @prevent-compression-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="prevent_compression" value="X" @prevent-compression-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@PREVENT-COMPRESSION">prevent-compression</a></td> - <td>Disables compression. Compressed web pages are faster to - download, but cannot be filtered with <a href="@user-manual@@actions-help-prefix@FILTER"><b>filter</b></a> - or <a href="@user-manual@@actions-help-prefix@KILL-POPUPS"><b>kill-popups</b></a> - if your Privoxy version was build without zlib support.</td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="redirect" value="Y" @redirect-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="redirect" value="N" @redirect-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="redirect" value="X" @redirect-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@REDIRECT">redirect</a></td> - <td>Redirect to another address. - </tr> - <tr class="bg1" align="left" valign="top" id="redirect_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td>Static address or a single pcrs command to redirect to a rewritten version of the original URL:<br> - <input type="text" name="redirect_mode" size="40" - value="@redirect-param@"></td> - </tr> - - <tr class="bg1" align="left" valign="top"> - <td class="en1"> </td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="server_header_filter_all" id="server_header_filter_all_n" value="N" @server-header-filter-all-n@ ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="server_header_filter_all" id="server_header_filter_all_x" value="X" @server-header-filter-all-x@ ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@SERVER-HEADER-FILTER">server-header-filter</a> *</td> - <td>Filter the server headers. - You can use the radio buttons on this line to disable - all server-header filters applied by previous rules, and/or - you can enable or disable the filters individually below.</td> - </tr> -@server-header-filter-params@ - <tr class="bg1" align="left" valign="top"> - <td class="en1"> </td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="server_header_tagger_all" id="server_header_tagger_all_n" value="N" @server-header-tagger-all-n@ ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="server_header_tagger_all" id="server_header_tagger_all_x" value="X" @server-header-tagger-all-x@ ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@SERVER-HEADER-TAGGER">server-header-tagger</a> *</td> - <td>Create tags based on the server headers. - You can use the radio buttons on this line to disable - all server-header taggers applied by previous rules, and/or - you can enable or disable the taggers individually below.</td> - </tr> -@server-header-tagger-params@ - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="session_cookies_only" value="Y" @session-cookies-only-y@ - ></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="session_cookies_only" value="N" @session-cookies-only-n@ - ></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="session_cookies_only" value="X" @session-cookies-only-x@ - ></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@SESSION-COOKIES-ONLY">session-cookies-only</a></td> - <td>HTTP 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 - <a href="@user-manual@@actions-help-prefix@CRUNCH-OUTGOING-COOKIES"><b>crunch-outgoing-cookies</b></a> and - <a href="@user-manual@@actions-help-prefix@CRUNCH-INCOMING-COOKIES"><b>crunch-incoming-cookies</b></a>.</td> - </tr> - <tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" - name="set_image_blocker" id="set_image_blocker_y" value="Y" @set-image-blocker-y@ - onclick="show_set_image_blocker_opts(true)"></td> - <td class="dis1" align="center" valign="middle"><input type="radio" - name="set_image_blocker" value="N" @set-image-blocker-n@ - onclick="show_set_image_blocker_opts(false)"></td> - <td class="noc1" align="center" valign="middle"><input type="radio" - name="set_image_blocker" value="X" @set-image-blocker-x@ - onclick="show_set_image_blocker_opts(false)"></td> - <td class="action"><a href="@user-manual@@actions-help-prefix@SET-IMAGE-BLOCKER">set-image-blocker</a></td> - <td>Specifies how to block images.</td> - </tr> - <tr class="bg1" align="left" valign="top" id="set_image_blocker_opts"> - <td class="en1"> </td> - <td class="dis1"> </td> - <td class="noc1"> </td> - <td> </td> - <td><input type="radio" name="set_image_blocker_mode" - onclick="set_image_blocker_param_disable(true)" - value="pattern" id="set_image_blocker_mode_pattern" - @set-image-blocker-param-pattern@><label - for="set_image_blocker_mode_pattern">Send a pattern (<img - src="send-banner?type=p" width="12" height="12" - alt="pattern">)</label><br> - <input type="radio" name="set_image_blocker_mode" value="blank" - onclick="set_image_blocker_param_disable(true)" - id="set_image_blocker_mode_blank" @set-image-blocker-param-blank@><label - for="set_image_blocker_mode_blank">Send a 1x1 transparent GIF</label><br> - <input type="radio" name="set_image_blocker_mode" value="CUSTOM" - onclick="set_image_blocker_param_disable(false)" - id="set_image_blocker_mode_set" @set-image-blocker-param-custom@><label - for="set_image_blocker_mode_set">Redirect - the browser to this image URL:</label><br> - <input type="text" name="set_image_blocker_param" id="set_image_blocker_param" - size="40" value="@set-image-blocker-param@"></td> - </tr> - </table> - -<!-- @if-multiple-forms-start --> - <p> - <input type="hidden" name="f" value="@f@"> - <input type="hidden" name="v" value="@v@"> - <input type="hidden" name="s" value="@s@"> - <input type="submit" value="Submit changes in Section 4" name="Submit"> - </p> - </form> -<!-- if-multiple-forms-end@ --> -</td></tr> -<!-- @if-one-form-only-start --> - <tr> - <td class="green" align="center"> - <p><input type="submit" value="Submit" name="Submit"></p> - </td> - </tr> -<!-- if-one-form-only-end@ --> - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> -<!-- @if-one-form-only-start --> -</form> -<!-- if-one-form-only-end@ --> - -<script type="text/javascript"> -<!-- - -if (document.getElementById) { - // alert("Netscape 6 or IE5"); - document.getElementById("hide_from_header_param").disabled = !(document.getElementById("hide_from_header_mode_set").checked); - document.getElementById("hide_referrer_param").disabled = !(document.getElementById("hide_referrer_mode_set").checked); - document.getElementById("set_image_blocker_param").disabled = !(document.getElementById("set_image_blocker_mode_set").checked); - - show_add_header_opts (document.getElementById("add_header_y").checked); - show_deanimate_opts (document.getElementById("deanimate_gifs_y").checked); - show_hide_from_header_opts(document.getElementById("hide_from_header_y").checked); - show_hide_referrer_opts (document.getElementById("hide_referrer_y").checked); - show_user_agent_opts (document.getElementById("hide_user_agent_y").checked); - show_set_image_blocker_opts (document.getElementById("set_image_blocker_y").checked); - show_limit_connect_opts (document.getElementById("limit_connect_y").checked); - show_send_wafer_opts (document.getElementById("send_wafer_y").checked); -} else if (document.all) { - // alert("IE4"); - document.myform.hide_from_header_param.disabled = !(document.myform.hide_from_header_mode_set.checked); - document.myform.hide_referrer_param.disabled = !(document.myform.hide_referrer_mode_set.checked); - document.myform.set_image_blocker_param.disabled = !(document.myform.set_image_blocker_mode_set.checked); - - show_add_header_opts (document.myform.add_header_y.checked); - show_deanimate_opts (document.myform.deanimate_gifs_y.checked); - show_hide_from_header_opts (document.myform.hide_from_header_y.checked); - show_hide_referrer_opts (document.myform.hide_referrer_y.checked); - show_user_agent_opts (document.myform.hide_user_agent_y.checked); - show_set_image_blocker_opts (document.myform.set_image_blocker_y.checked); - show_limit_connect_opts (document.myform.limit_connect_y.checked); - show_send_wafer_opts (document.myform.send_wafer_y.checked); -} else if (document.layers) { - // alert("Netscape 4"); -} -//--> -</script> - - -</body> - -</html> diff --git a/external/privoxy/templates/edit-actions-for-url-filter b/external/privoxy/templates/edit-actions-for-url-filter deleted file mode 100644 index d4dad90..0000000 --- a/external/privoxy/templates/edit-actions-for-url-filter +++ /dev/null @@ -1,40 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-for-url-filter,v $ -# -# Purpose : Template that is included from most of Privoxy's CGI pages -# to show the user how to get help or report problems. -# -# -# Copyright : Written by and Copyright (C) 2002-2007 members of -# the SourceForge Privoxy team. http://www.privoxy.org/ -# -# This template is free software; you can redistribute it -# and/or modify it 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. -# -# Revisions : -# $Log: edit-actions-for-url-filter,v $ -# Revision 1.8 2007/03/29 11:40:34 fabiankeil -# Divide @filter-params@ into @client-header-filter-params@ -# @content-filter-params@ and @server-header-filter-params@. -# -# Revision 1.7 2007/03/20 15:40:00 fabiankeil -# Adjust to new world order with dedicated header-filter actions. -# -# -############################################################################## - -<tr class="bg1" align="left" valign="top"> - <td class="en1" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="Y" @this-filter-y@></td> - <td class="dis1" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="N" @this-filter-n@></td> - <td class="noc1" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="X" @this-filter-x@></td> - <td class="action"> - <input type="hidden" name="filter_t@index@" value="@abbr-filter-type@"> - <input type="hidden" name="filter_n@index@" value="@name@"> - <a href="@user-manual@@actions-help-prefix@@anchor@">@filter-type@</a> @name@ - </td> - <td>@description@</td> -</tr> diff --git a/external/privoxy/templates/edit-actions-list b/external/privoxy/templates/edit-actions-list deleted file mode 100644 index 85ec9b5..0000000 --- a/external/privoxy/templates/edit-actions-list +++ /dev/null @@ -1,412 +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-2007 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.34 2007/05/21 10:54:46 fabiankeil -# - Use strlcpy() instead of strcpy(). -# - Stop treating actions files special. Expect a complete file name -# (with or without path) like it's done for the rest of the files. -# Closes FR#588084. -# - Don't rerun sed() in cgi_show_request(). -# -# Revision 1.33 2007/04/08 13:21:06 fabiankeil -# Reference action files in CGI URLs by id instead -# of using the first part of the file name. -# Fixes BR 1694250 and BR 1590556. -# -# Revision 1.32 2007/01/23 16:03:16 fabiankeil -# - Add favicon links. -# - Remove useless W3C validator links. -# -# Revision 1.31 2006/09/10 14:39:24 hal9 -# Fix typo + minor change. -# -# Revision 1.30 2006/09/09 01:12:15 hal9 -# Soften actions files update interval. -# -# Revision 1.29 2006/07/18 14:49:13 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.26.2.4 2003/12/17 16:35:17 oes -# Work around new & silly MSIE behaviour where the request resulting from -# changing window.location.href doesn't reveal the referrer anymore -# -# Revision 1.26.2.3 2002/09/25 15:34:09 oes -# - Work around JS problem in NS 2.0 (no joke) -# - Make JS string edit popup remove the pattern -# if edited to empty; make JS add popup do nothing -# if pattern empty. -# -# Revision 1.26.2.2 2002/08/23 02:22:53 hal9 -# Fix a perl brain fart with <li> in comments. -# -# Revision 1.26 2002/05/23 23:37:25 oes -# Nit -# -# Revision 1.25 2002/05/21 21:02:52 oes -# Added more help links -# -# Revision 1.24 2002/05/21 19:11:40 oes -# - Added client-side JavaScript versions of edit and add URL forms -# - Moved jump targets to before container table cell -# - Let earu determine the jump target when removing URLs via JS -# - Fixed broken help link -# -# Revision 1.23 2002/05/12 15:53:10 jongfoster -# Restoring CVS log information accidentally removed in -# my previous commit. -# -# Revision 1.22 2002/05/12 15:45:33 jongfoster -# Applying [Patch 552094] New templates for edit-actions-list -# This cleans up the templates by: -# - Removing the (confusing) alternating color scheme. -# - Making everything left-justified. -# -# Revision 1.21 2002/05/03 22:58:15 jongfoster -# Fixing link target in all URLs section -# -# Revision 1.20 2002/04/26 12:57:18 oes -# - Central "button" link style in cgi-style.css -# - Help links now dynamic -# -# Revision 1.19 2002/04/24 02:19:16 oes -# - Show name of actions file being edited -# - Show context sensitive help -# - Add buttons for easy changing of defaults -# - Cosmetics and clarifications -# -# Revision 1.18 2002/04/18 19:21:09 jongfoster -# Added code to detect "conventional" action files, that start -# with a set of actions for all URLs (the pattern "/"). -# These are special-cased in the "edit-actions-list" CGI, so -# that a special UI can be written for them. -# -# Revision 1.17 2002/04/10 13:32:53 oes -# Made templates modular -# -# Revision 1.16 2002/04/08 17:08:14 oes -# Cosmetic: make status in title lowercase -# -# Revision 1.15 2002/04/05 16:01:32 oes -# Correct HTML, external Stylesheets, eye candy, some fixes -# -# Revision 1.14 2002/03/26 22:29:56 swa -# we have a new homepage! -# -# 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 - Yes - everything works. -# -# All browsers should work, you just might not get the pretty CSS buttons. -# -# If your favorite browser isn't listed/tested, please test and add it. -# -# -############################################################################# -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# -# -############################################################################# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> - - <title>Privoxy: Edit actions file @actions-file@</title> - - <style type="text/css"> - -table.framed { - border: solid black 1px; - margin: 10px 0px; -} -tr.actions { - background-color: #eeffee; -} -tr.url { - background-color: #ddddff; -} -tr.adv { - background-color: #FFFFD0; -} -td.header { - font-weight: bold; - font-size: 110%; - padding: 10px 15px 2px 15px; -} -td.url { - font-weight: bold; -} -td.action { - font-weight: bold; - font-style: italic; - padding: 2px 30px; -} -td.nbr, td.buttons { - white-space: nowrap; -} -td.indentbuttons { - padding: 2px 30px; -} -</style> - -<script type="text/javascript"> -<!-- - -// Non-JS capable browsers will follow the link to a HTML "are you sure?" page -// JavaScript-capable browsers will call this function, which does a -// client-side prompt for speed. It may kick off the delete directly. -// It always returns false to cancel following the link. -function rm_p(link,pattern,curtext) -{ - if (window.confirm("Are you sure you want to delete this URL pattern?\nPattern is: "+unescape(curtext))) - { - link.href="edit-actions-remove-url?f=@f@&v=@v@&p="+pattern; - return true; - } - return false; -} - -function e_p(link,pattern,curtext) -{ - if ((newtext=window.prompt("Edit the pattern to your needs:", unescape(curtext))) != null) - { - if (newtext != "") - { link.href="edit-actions-url?f=@f@&v=@v@&p="+pattern+"&u="+escape(newtext); } - else - { link.href="edit-actions-remove-url?f=@f@&v=@v@&p="+pattern; } - return true; - } - return false; -} - -function a_p(link,section) -{ - if (((newtext=window.prompt("Enter the new pattern:", "")) != null ) && (newtext != "")) - { - link.href="edit-actions-add-url?f=@f@&v=@v@&s="+section+"&u="+escape(newtext); - return true; - } - return false; -} -//--> -</script> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="info"> - <h2>What is all this?</h2> - <p> - If you haven't already done so, it is <b>strongly recommended</b> that you at - least skim <a href="@user-manual@@actions-help-prefix@ACTIONS-FILE">the - chapter on actions files</a> in the <a href="@user-manual@">User Manual</a> - before making any changes. You will also find a comprehensive list of - all available actions there, as well how the settings on this page - work. - </p> - <!-- @if-all-urls-present-then@ --> - <p> - Please note that <b>the first section has special importance</b>. It sets the default actions for - all URLs. The resulting actions for a particular URL may differ from these defaults if that - URL matches again further down, but this section is largely responsible for your browsing - experience. Edit manually with great care, or choose from the predefined sets of actions. - </p> - <!-- @else-not-all-urls-present@@endif-all-urls-present@ --> - <!-- @if-default-action-then@ --> - <p> - This is the default action file. Updates for it are available from - <a href="http://www.privoxy.org/">Privoxy.org</a> from time to time. - It is therefore <b>not recommended</b> that you add your private - rules here, since they will be lost if you install an update in the future. - Put your rules in a separate actions file, like <tt>user.action</tt> instead. - </p> - <!-- @else-not-default-action@@endif-default-action@ --> - </td> - </tr> - - <tr> - <td class="box"> - <div class="buttons"> - <h2>Editing Actions File @actions-file@</h2> - <!-- @if-all-urls-present-then@@else-not-all-urls-present@ --> - <p><a class="cmd" href="edit-actions-section-add?f=@f@&v=@v@&s=0">Insert new section at top</a></p> - <!-- @endif-all-urls-present@ --> - </div> - </td> - </tr> - - <!-- @if-all-urls-present-then@ --> - <tr> - <td class="container"><a name="l@all-urls-s@"></a> - <table border="0" width="100%" cellspacing="2" cellpadding="3" class="framed"> - <tr class="actions"><td class="header"><a href="@user-manual@@actions-help-prefix@ACTIONS">Actions</a>:</td></tr> - <tr class="actions"> - <td class="indentbuttons"> - <a href="eafu?f=@f@&v=@v@&s=@all-urls-s@">Edit</a> - @all-urls-buttons@ - </td> - </tr> - <tr class="actions"><td class="action">@all-urls-actions@</td></tr> - <tr class="url"><td class="header"><a href="@user-manual@@actions-help-prefix@AF-PATTERNS">URL patterns</a>:</td></tr> - <tr class="url"><td class="indentbuttons">/ <i>(Matches all requests)</a></td></tr> - <tr class="adv"><td class="header">Advanced:</td></tr> - <tr class="adv"> - <td class="indentbuttons"> - <a href="easa?f=@f@&v=@v@&s=@all-urls-s@#l@all-urls-s-next@">Insert new section below</a> - </td> - </tr> - </table> - </td> - </tr> - <!-- @else-not-all-urls-present@@endif-all-urls-present@ --> - -@sections@ - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> -</body> - -</html> diff --git a/external/privoxy/templates/edit-actions-list-button b/external/privoxy/templates/edit-actions-list-button deleted file mode 100644 index fd0e8b9..0000000 --- a/external/privoxy/templates/edit-actions-list-button +++ /dev/null @@ -1,49 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-button,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-button,v $ -# Revision 1.3 2002/05/12 15:53:10 jongfoster -# Restoring CVS log information accidentally removed in -# my previous commit. -# -# Revision 1.2 2002/05/12 15:45:33 jongfoster -# Applying [Patch 552094] New templates for edit-actions-list -# This cleans up the templates by: -# - Removing the (confusing) alternating color scheme. -# - Making everything left-justified. -# -# Revision 1.1 2002/05/03 23:00:38 jongfoster -# Support for templates for "standard actions" buttons. -# See bug #549871 -# -############################################################################# - <a href="eas?f=@f@&v=@v@&s=@all-urls-s@&p=@button-name@#l@all-urls-s@">Set to @button-name@</a> diff --git a/external/privoxy/templates/edit-actions-list-section b/external/privoxy/templates/edit-actions-list-section deleted file mode 100644 index c8578ad..0000000 --- a/external/privoxy/templates/edit-actions-list-section +++ /dev/null @@ -1,125 +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.16 2006/07/18 14:49:13 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.15.2.1 2003/12/17 16:35:17 oes -# Work around new & silly MSIE behaviour where the request resulting from -# changing window.location.href doesn't reveal the referrer anymore -# -# Revision 1.15 2002/05/21 21:02:52 oes -# Added more help links -# -# Revision 1.14 2002/05/21 19:12:43 oes -# - Added client-side JavaScript versions of edit and add URL forms -# - Moved jump targets to before container table cell -# -# Revision 1.13 2002/05/12 15:45:33 jongfoster -# Applying [Patch 552094] New templates for edit-actions-list -# This cleans up the templates by: -# - Removing the (confusing) alternating color scheme. -# - Making everything left-justified. -# -# Revision 1.12 2002/04/26 12:58:11 oes -# Central "button" link style in cgi-style.css -# -# Revision 1.11 2002/04/24 02:14:03 oes -# Changed shortcuts, Cosmetics -# -# Revision 1.10 2002/04/17 21:27:26 jongfoster -# Adding #linenumber to the URLs which affect blocks, to make -# editing in long files easier. -# -# Revision 1.9 2002/04/17 15:51:47 oes -# Args! Restoring CVS history -# -# Revision 1.8 2002/04/17 15:04:16 oes -# Adapted to style change -# -# Revision 1.7 2002/03/26 22:29:56 swa -# we have a new homepage! -# -# 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. -# -############################################################################# - -<tr><td class="container"><a name="l@s@"></a> -<table border="0" width="100%" cellspacing="2" cellpadding="3" class="framed"> -<tr class="actions"><td class="header"><a href="@user-manual@@actions-help-prefix@ACTIONS">Actions</a>:</td></tr> -<tr class="actions"><td class="indentbuttons"><a href="eafu?f=@f@&v=@v@&s=@s@">Edit</a></td></tr> -<tr class="actions"><td class="action">@actions@</td></tr> -<tr class="url"><td class="header"><a href="@user-manual@@actions-help-prefix@AF-PATTERNS">URL patterns</a>:</td></tr> -<tr class="url"><td class="indentbuttons"><a href="eaa?f=@f@&v=@v@&s=@s@" onclick="return a_p(this,@s@);">Add</a></td></tr> -@urls@ -<tr class="adv"><td class="header">Advanced:</td></tr> -<tr class="adv"><td class="indentbuttons"> -@if-s-prev-exists-start@<a href="eass?f=@f@&v=@v@&s1=@s-prev@&s2=@s@#l@s-prev@">Move section up</a> @if-s-prev-exists-end@ -@if-s-next-exists-start@<a href="eass?f=@f@&v=@v@&s1=@s@&s2=@s-next@#l@s@">Move section down</a> @if-s-next-exists-end@ -<a href="easa?f=@f@&v=@v@&s=@s@#l@s-next@">Insert new section below</a> -@if-empty-section-start@ <a href="easr?f=@f@&v=@v@&s=@s@#l@s@">Delete whole section</a>@if-empty-section-end@ -</td></tr> -</table> -</td></tr> diff --git a/external/privoxy/templates/edit-actions-list-url b/external/privoxy/templates/edit-actions-list-url deleted file mode 100644 index 08c1ea4..0000000 --- a/external/privoxy/templates/edit-actions-list-url +++ /dev/null @@ -1,95 +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.11 2006/07/18 14:49:14 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.10.2.1 2003/12/17 16:35:17 oes -# Work around new & silly MSIE behaviour where the request resulting from -# changing window.location.href doesn't reveal the referrer anymore -# -# Revision 1.10 2002/05/21 19:13:14 oes -# Added client-side JavaScript versions of edit and add URL forms -# -# Revision 1.9 2002/05/12 15:45:33 jongfoster -# Applying [Patch 552094] New templates for edit-actions-list -# This cleans up the templates by: -# - Removing the (confusing) alternating color scheme. -# - Making everything left-justified. -# -# Revision 1.8 2002/04/26 12:58:11 oes -# Central "button" link style in cgi-style.css -# -# Revision 1.7 2002/03/26 22:29:56 swa -# we have a new homepage! -# -# Revision 1.6 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.5 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.4 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.3 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# sectionid -# urls -# -############################################################################# -# -# ** Important note: ** -# -# It is *extremely* important to keep this file small. That's why all the -# identifiers in the HTML are short and cryptic. Currently, the main -# edit-actions page is ~300k. Before it was optimized, it was ~550k. -# -############################################################################# -<tr class="url" valign="top"> -<td class="indentbuttons"><a name="l@p@" -href="ear?f=@f@&v=@v@&p=@p@" onclick="return rm_p(this, @p@,'@url@');">Remove</a> <a -href="eau?f=@f@&v=@v@&p=@p@" onclick="return e_p(this, @p@,'@url@');">Edit</a> @url-html@</td> -</tr> diff --git a/external/privoxy/templates/edit-actions-remove-url-form b/external/privoxy/templates/edit-actions-remove-url-form deleted file mode 100644 index 17b9b22..0000000 --- a/external/privoxy/templates/edit-actions-remove-url-form +++ /dev/null @@ -1,196 +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.17 2007/01/23 16:03:16 fabiankeil -# - Add favicon links. -# - Remove useless W3C validator links. -# -# Revision 1.16 2006/07/18 14:49:14 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.14.2.2 2002/08/23 02:22:53 hal9 -# Fix a perl brain fart with <li> in comments. -# -# Revision 1.14 2002/05/21 19:13:49 oes -# Added button style and jumptargets to "add" and "cancel" links -# -# Revision 1.13 2002/04/10 13:32:53 oes -# Made templates modular -# -# Revision 1.12 2002/04/08 17:08:14 oes -# Cosmetic: make status in title lowercase -# -# Revision 1.11 2002/04/05 16:01:30 oes -# Correct HTML, external Stylesheets, eye candy, some fixes -# -# Revision 1.10 2002/03/26 22:29:56 swa -# we have a new homepage! -# -# 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 -# jumptarget - append to eal URL to jump to relevant section -# -############################################################################# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> - - <title>Privoxy@@my-hostname@: Remove URL Pattern</title> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Remove URL Pattern</h2> - <p>Are you sure you want to delete this URL pattern? The pattern is:</p> - <p class="important">@u@</p> - <p> - <a class="cmd" href="edit-actions-remove-url?f=@f@&v=@v@&p=@p@">OK</a> - - <a class="cmd" href="edit-actions-list?f=@f@@jumptarget@">Cancel</a> - </p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> -</body> - -</html> diff --git a/external/privoxy/templates/edit-actions-url-form b/external/privoxy/templates/edit-actions-url-form deleted file mode 100644 index 0b91035..0000000 --- a/external/privoxy/templates/edit-actions-url-form +++ /dev/null @@ -1,219 +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.18 2007/12/08 14:38:55 fabiankeil -# - Use the shiny new CSS "pattern" class. -# - s@URL Pattern@URL or TAG Pattern@ -# - Use the standard favicon as this ain't no error page. -# -# Revision 1.17 2007/01/23 16:03:16 fabiankeil -# - Add favicon links. -# - Remove useless W3C validator links. -# -# Revision 1.16 2006/07/18 14:49:14 david__schmidt -# Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) -# with what was really the latest development (the v_3_0_branch branch) -# -# Revision 1.14.2.2 2002/08/23 02:22:53 hal9 -# Fix a perl brain fart with <li> in comments. -# -# Revision 1.14 2002/05/21 19:14:10 oes -# Added button style and jumptarget "cancel" link -# -# Revision 1.13 2002/04/10 13:32:53 oes -# Made templates modular -# -# Revision 1.12 2002/04/08 17:08:14 oes -# Cosmetic: make status in title lowercase -# -# Revision 1.11 2002/04/05 16:01:32 oes -# Correct HTML, external Stylesheets, eye candy, some fixes -# -# Revision 1.10 2002/03/26 22:29:56 swa -# we have a new homepage! -# -# 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 -# jumptarget - append to eal URL to jump to relevant section -# -############################################################################# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico"> - - <title>Privoxy@@my-hostname@: Edit URL Pattern</title> - - <script type="text/javascript"> -<!-- -function validate(text) -{ - if (text=="") - { - alert("You need to type a pattern in order to continue!"); - return false; - } - - return true; -} -//--> - </script> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Edit URL or TAG Pattern</h2> - <form method="GET" action="edit-actions-url" - onSubmit="return validate(u.value);"> - <p> - <input type="hidden" name="f" value="@f@"> - <input type="hidden" name="v" value="@v@"> - <input type="hidden" name="p" value="@p@"> - <input type="text" name="u" value="@u@" size="78" class="pattern"><br> - <input type="submit" value="Submit"> - <input type="reset" value="Reset"> - <a class="cmd" href="edit-actions-list?f=@f@@jumptarget@">Cancel</a> - </p> - </form> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> -</body> - -</html> diff --git a/external/privoxy/templates/forwarding-failed b/external/privoxy/templates/forwarding-failed deleted file mode 100644 index fca5c8c..0000000 --- a/external/privoxy/templates/forwarding-failed +++ /dev/null @@ -1,167 +0,0 @@ -########################################################## -# -# Forwarding-failed template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written in plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# gateway -# The IP or hostname of the forwarding server -# 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 -# error-message: -# The failure reason. -# forwarding-type: -# The type of the forwarding request: "socks4-", "socks4a-" -# or (in the future) "" for direct connections to the forwarder. -# -# -# 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. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>503 - Forwarding failure (Privoxy@@my-hostname@)</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> - <style type="text/css"> -#include cgi-style.css - </style> -</head> - -<body> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="status"> - 503 - </td> - <td class="title" style="width: 100%"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning" colspan="2"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning" colspan=2> - <h2>Forwarding failure</h2> - <p>Privoxy was unable to <b>@forwarding-type@forward</b> your request - <a title="Repeat the request" - href="@protocol@@hostport@@path@"><b>@protocol@@hostport@@path@</b></a> - through <b>@gateway@</b>: - <strong>@error-message@</strong></p> - </p> - <p>Just <a title="Repeat the request" href="@protocol@@hostport@@path@">try again</a> to - see if this is a temporary problem, or check your <a title="Privoxy's show-status page" - href="@default-cgi@show-status">forwarding settings</a> - and make sure that all forwarding servers are working correctly and - listening where they are supposed to be listening. - </p> - </td> - </tr> - - <tr> - <td class="box" colspan="2"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info" colspan="2"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info" colspan="2"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/mod-local-help b/external/privoxy/templates/mod-local-help deleted file mode 100644 index 21d6596..0000000 --- a/external/privoxy/templates/mod-local-help +++ /dev/null @@ -1,12 +0,0 @@ - <h2>Local Privoxy support:</h2> - -<!-- @if-have-proxy-info-start --> - <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.</p> -<!-- if-have-proxy-info-end@ --> - -<!-- @if-have-adminaddr-info-start --> - <p>Address e-mail questions about this service to - <a href="mailto:@admin-address@"><code>@admin-address@</code></a>, - who will be glad to help you. - </p> -<!-- if-have-adminaddr-info-end@ --> diff --git a/external/privoxy/templates/mod-support-and-service b/external/privoxy/templates/mod-support-and-service deleted file mode 100644 index 9868761..0000000 --- a/external/privoxy/templates/mod-support-and-service +++ /dev/null @@ -1,61 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/mod-support-and-service,v $ -# -# Purpose : Template that is included from most of Privoxy's CGI pages -# to show the user how to get help or report problems. -# -# -# Copyright : Written by and Copyright (C) 2002-2007 members of -# the SourceForge Privoxy team. http://www.privoxy.org/ -# -# This template is free software; you can redistribute it -# and/or modify it 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. -# -# Revisions : -# $Log: mod-support-and-service,v $ -# Revision 1.11 2008/01/02 18:06:58 fabiankeil -# Instead of linking to the "Contacting the developers ..." section -# in the FAQ, use the one from the User Manual. The latter can be -# delivered by Privoxy and thus possibly loads faster. -# -# Revision 1.10 2007/03/17 11:31:36 fabiankeil -# - Add revision log and copyright header. -# - Reword instructions and link to the FAQ -# in an attempt to reduce the number of -# incomplete reports. -# -############################################################################## - <h2>Support and Service:</h2> - <p> - The Privoxy Team values your feedback. To provide you with the best support, - we ask that you: - </p> - <ul> - <li> - use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">Support Tracker</a> - if you need help. - </li> - <li> - submit ads and configuration related problems with the actions files through the - <a href="http://sourceforge.net/tracker/?group_id=11118&atid=460288">Actionsfile Feedback Tracker</a>. - </li> - <li> - submit bugs only through the - <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">Bug Tracker</a>. - Please make sure that the bug has not been submitted yet. - </li> - <li> - submit feature requests only through the - <a href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">Feature - Request Tracker</a>. - </li> - <li> - read the <a title="Contacting the developers, Bug Reporting and Feature Requests" - href="@user-manual@contact.html">instructions in the User Manual</a> - to make sure your request contains all the information we need. - </li> - </ul> diff --git a/external/privoxy/templates/mod-title b/external/privoxy/templates/mod-title deleted file mode 100644 index de73eba..0000000 --- a/external/privoxy/templates/mod-title +++ /dev/null @@ -1,4 +0,0 @@ - <h1> - This is <a href="@homepage@">Privoxy</a> @version@ on @my-hostname@ (@my-ip-address@), port @my-port@<!-- @if-can-toggle-start -->, - @if-enabled-display-then@enabled@else-not-enabled-display@disabled@endif-enabled-display@<!-- if-can-toggle-end@ --> - </h1> diff --git a/external/privoxy/templates/mod-unstable-warning b/external/privoxy/templates/mod-unstable-warning deleted file mode 100644 index dd77c29..0000000 --- a/external/privoxy/templates/mod-unstable-warning +++ /dev/null @@ -1,7 +0,0 @@ - <h2>Warning:</h2> - <p> - <strong>This Privoxy version is based on <em class="warning">@code-status@</em> code and - not intended for production systems! - <br>Use at your own risk. See the <a title="GNU General Public License version 2" - href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html%22%3Elicense</a> for details.</strong> - </p> diff --git a/external/privoxy/templates/no-such-domain b/external/privoxy/templates/no-such-domain deleted file mode 100644 index 08cf5da..0000000 --- a/external/privoxy/templates/no-such-domain +++ /dev/null @@ -1,158 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the proxy's administrator, as configured -# in the 'config' file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# host: -# The host part of the request that lead to this problem -# 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 -# proxy-info-url: -# The URL to local online Privoxy documentation, if define in the -# 'config' file -# -# 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. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>404 - No such Domain (Privoxy@@my-hostname@)</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> - <style type="text/css"> -#include cgi-style.css - </style> -</head> - -<body> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="status"> - 404 - </td> - <td class="title" style="width: 100%"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning" colspan="2"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning" colspan="2"> - <h2>No such domain</h2> - <p>Your request for <a href="@protocol@@hostport@@path@"><b>@protocol@@hostport@@path@</b></a> - could not be fulfilled, because the domain name <b>@host@</b> could not be resolved. - </p> - <p>This is often a temporary failure, so you might just - <a href="@protocol@@hostport@@path@">try again</a>. - </p> - </td> - </tr> - - <tr> - <td class="box" colspan="2"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info" colspan="2"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info" colspan="2"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/show-request b/external/privoxy/templates/show-request deleted file mode 100644 index 30a2529..0000000 --- a/external/privoxy/templates/show-request +++ /dev/null @@ -1,154 +0,0 @@ -########################################################## -# -# Show-Request-CGI Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# client-request: -# The request and headers that the client sent. -# processed-request: -# What we would have rewritten this request to, if this had not -# been intercepted. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy@@my-hostname@</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Show-Request</h2> - <p> - 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. - </p> - - <h3>Original Client Request:</h3> - <pre>@client-request@</pre> - - <h3>Processed Request:</h3> - <pre>@processed-request@</pre> - - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/show-status b/external/privoxy/templates/show-status deleted file mode 100644 index f71e2de..0000000 --- a/external/privoxy/templates/show-status +++ /dev/null @@ -1,343 +0,0 @@ -########################################################## -# -# Show-Status-CGI Output template for Privoxy. -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach Privoxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the Privoxy administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of Privoxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The Privoxy version number -# code-status: -# The Privoxy development status: "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 which 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 Privoxy release -# 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 Privoxy's online documentation 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 -# have-stats: -# There have been previous requests and statistics have -# been collected. In this case, the following symbols -# are available: -# requests-received: -# The number of requests received so far -# requests-blocked: -# The number of request blocked so far -# percent-blocked: -# The percentage of blocked requests -# have-no-stats: -# There haven't any statistics been collected yet -# pcrs-support: -# Privoxy was compiled with pcrs support -# trust-support: -# Privoxy was compiled with trust support -# actions-filenames: -# The path to the actions files. -# re-filter-filenames: -# The path to the re_filter files. Only available if -# pcrs-support is set -# trust-filename: -# The path to the trust file. Only available if -# trust-support is set -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy@@my-hostname@: Proxy Status</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> -</head> - -<body> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>The following files are in use:</h2> - <table summary="Action, filter and trust files in use." class="transparent"> - <tr> - <th colspan="2"><a href="@user-manual@@actions-help-prefix@ACTIONS-FILE">Actions Files:</a></th> - </tr> - @actions-filenames@ - <tr> - <th colspan="2"><a href="@user-manual@filter-file.html">Filter Files:</a></th> - </tr> - @re-filter-filenames@ -<!-- @if-trust-support-start --> - <tr> - <th colspan="2"><a href="@user-manual@config.html#TRUSTFILE">Trust File:</a></th> - </tr> - <tr> - <td> - @trust-filename@ - </td> - <td class="buttons"> - <!-- @if-have-trustfile-start --> - <a href="show-status?file=trust">View</a> - <!-- if-have-trustfile-end@ --> - </td> - </tr> -<!-- if-trust-support-end@ --> - </table> -<!-- @if-cgi-editor-is-disabled-start --> - <p> - The CGI editor is currently disabled, thus no edit buttons are shown.<br> - Please have a look at the - <a href="@user-manual@config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions documentation</a> - to learn how to enable it and what the risks are. - </p> -<!-- if-cgi-editor-is-disabled-end@ --> - </td> - </tr> - - <tr> - <td class="box"> - <h2>Privoxy was <a href="@user-manual@startup.html#CMDOPTIONS">invoked</a> as follows:</h2> - <p>@invocation@</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>The following options were given in the <a href="@user-manual@config.html">config file</a>:</h2> - <p>@options@</p> - </td> - </tr> - -<!-- @if-statistics-start --> - <tr> - <td class="box"> - <h2>Blocking Statistics:</h2> - <p> - <!-- @if-have-stats-start --> - @requests-blocked@ out of @requests-received@ requests have been blocked, - which equals a block rate of @percent-blocked@%. -<!-- if-have-stats-end@ --> -<!-- @if-have-no-stats-start --> - There haven't been any requests so far. -<!-- if-have-no-stats-end@ --> - </p> - </td> - </tr> -<!-- if-statistics-end@ --> - - <tr> - <td class="box"> - <h2>Conditional #defines:</h2> - <table summary="The state of some ./configure options and what they do." border="1" style="margin-left: 10px"> - <tr> - <th>#define</th> <th>Enabled?</th> <th>Effects when enabled</th> - </tr> - <tr> - <td><code>FEATURE_ACL</code></td> - <td>@if-FEATURE_ACL-then@ Yes @else-not-FEATURE_ACL@ No @endif-FEATURE_ACL@</td> - <td>Allows the use of an ACL to control access to Privoxy by IP address.</td> - </tr> - <tr> - <td><code>FEATURE_CGI_EDIT_ACTIONS</code></td> - <td>@if-FEATURE_CGI_EDIT_ACTIONS-then@ Yes @else-not-FEATURE_CGI_EDIT_ACTIONS@ No @endif-FEATURE_CGI_EDIT_ACTIONS@</td> - <td>Allows the use of the @if-FEATURE_CGI_EDIT_ACTIONS-then@<a - href="@default-cgi@edit-actions">@else-not-FEATURE_CGI_EDIT_ACTIONS@ - @endif-FEATURE_CGI_EDIT_ACTIONS@web-based actions file - editor@if-FEATURE_CGI_EDIT_ACTIONS-then@</a>@else-not-FEATURE_CGI_EDIT_ACTIONS@@endif-FEATURE_CGI_EDIT_ACTIONS@.</td> - </tr> - <tr> - <td><code>FEATURE_CONNECTION_KEEP_ALIVE</code></td> - <td>@if-FEATURE_CONNECTION_KEEP_ALIVE-then@ Yes @else-not-FEATURE_CONNECTION_KEEP_ALIVE@ No @endif-FEATURE_CONNECTION_KEEP_ALIVE@</td> - <td> - Allows to reuse outgoing connections if the server supports it. - Requires the keep-alive-timeout config directive to be set. - </td> - </tr> - <tr> - <td><code>FEATURE_FAST_REDIRECTS</code></td> - <td>@if-FEATURE_FAST_REDIRECTS-then@ Yes @else-not-FEATURE_FAST_REDIRECTS@ No @endif-FEATURE_FAST_REDIRECTS@</td> - <td>Allows the +fast-redirects action, to bypass redirect and logging scripts.</td> - </tr> - <tr> - <td><code>FEATURE_FORCE_LOAD</code></td> - <td>@if-FEATURE_FORCE_LOAD-then@ Yes @else-not-FEATURE_FORCE_LOAD@ No @endif-FEATURE_FORCE_LOAD@</td> - <td>Allows bypassing all filtering for a single page using the prefix - <q><code>@FORCE_PREFIX@</code></q>.</td> - </tr> - <tr> - <td><code>FEATURE_GRACEFUL_TERMINATION</code></td> - <td>@if-FEATURE_GRACEFUL_TERMINATION-then@ Yes @else-not-FEATURE_GRACEFUL_TERMINATION@ No @endif-FEATURE_GRACEFUL_TERMINATION@</td> - <td>Allows to shutdown Privoxy through the web interface.</td> - </tr> - <tr> - <td><code>FEATURE_IMAGE_BLOCKING</code></td> - <td>@if-FEATURE_IMAGE_BLOCKING-then@ Yes @else-not-FEATURE_IMAGE_BLOCKING@ No @endif-FEATURE_IMAGE_BLOCKING@</td> - <td>Allows the +handle-as-image action, to send <q>blocked</q> images instead of HTML.</td> - </tr> - <tr> - <td><code>FEATURE_IMAGE_DETECT_MSIE</code></td> - <td>@if-FEATURE_IMAGE_DETECT_MSIE-then@ Yes @else-not-FEATURE_IMAGE_DETECT_MSIE@ No @endif-FEATURE_IMAGE_DETECT_MSIE@</td> - <td>Enables automatic detection of image and HTML requests from - Microsoft Internet Explorer users, overriding the setting of - +image in the actions file.</td> - </tr> - <tr> - <td><code>FEATURE_NO_GIFS</code></td> - <td>@if-FEATURE_NO_GIFS-then@ Yes @else-not-FEATURE_NO_GIFS@ No @endif-FEATURE_NO_GIFS@</td> - <td>Use PNG instead of GIF for the built-in images.</td> - </tr> - <tr> - <td><code>FEATURE_PTHREAD</code></td> - <td>@if-FEATURE_PTHREAD-then@ Yes @else-not-FEATURE_PTHREAD@ No @endif-FEATURE_PTHREAD@</td> - <td>Use POSIX threads rather than native threads</td> - </tr> - <tr> - <td><code>FEATURE_STATISTICS</code></td> - <td>@if-FEATURE_STATISTICS-then@ Yes @else-not-FEATURE_STATISTICS@ No @endif-FEATURE_STATISTICS@</td> - <td>Enables the statistics function.</td> - </tr> - <tr> - <td><code>FEATURE_TOGGLE</code></td> - <td>@if-FEATURE_TOGGLE-then@ Yes @else-not-FEATURE_TOGGLE@ No @endif-FEATURE_TOGGLE@</td> - <td>Allow Privoxy to be <q>disabled</q> so it is just a normal non-blocking non-anonymizing proxy.</td> - </tr> - <tr> - <td><code>FEATURE_TRUST</code></td> - <td>@if-FEATURE_TRUST-then@ Yes @else-not-FEATURE_TRUST@ No @endif-FEATURE_TRUST@</td> - <td>Allows the use of trust files.</td> - </tr> - <tr> - <td><code>FEATURE_ZLIB</code></td> - <td>@if-FEATURE_ZLIB-then@ Yes @else-not-FEATURE_ZLIB@ No @endif-FEATURE_ZLIB@</td> - <td>Allows to decompress gzip and zlib compressed documents for filtering. - Requires external zlib library and hasn't been tested on all platforms.</td> - </tr> - <tr> - <td><code>STATIC_PCRE</code></td> - <td>@if-STATIC_PCRE-then@ Yes @else-not-STATIC_PCRE@ No @endif-STATIC_PCRE@</td> - <td>Use the supplied statically-linked PCRE library. This is set automatically - by <code>./configure</code> if you do not have the libpcre installed.</td> - </tr> - <tr> - <td><code>STATIC_PCRS</code></td> - <td>@if-STATIC_PCRS-then@ Yes @else-not-STATIC_PCRS@ No @endif-STATIC_PCRS@</td> - <td>Use the supplied statically-linked PCRS library. This is set automatically - by <code>./configure</code> if you do not have the libpcrs installed.</td> - </tr> - </table> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/show-status-file b/external/privoxy/templates/show-status-file deleted file mode 100644 index 4fa9333..0000000 --- a/external/privoxy/templates/show-status-file +++ /dev/null @@ -1,146 +0,0 @@ -########################################################## -# -# Show-Status-CGI Output template for Privoxy. -# (Variant for the show-file mode) -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# file-description: -# A descriptive name for the file being shown -# contents: -# The contents of the file being shown -# filepath -# The complete filename of the file being shown -# -# -# 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. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy@@my-hostname@: Contents of @file-description@</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Contents of @file-description@ @filepath@</h2> - <pre>@contents@</pre> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/show-url-info b/external/privoxy/templates/show-url-info deleted file mode 100644 index a5013f5..0000000 --- a/external/privoxy/templates/show-url-info +++ /dev/null @@ -1,340 +0,0 @@ -######################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/show-url-info,v $ -# -# Purpose : Template for Privoxy's show-url-info CGI page. -# -# Copyright : Written by and Copyright (C) 2001-2007 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# 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: show-url-info,v $ -# Revision 1.29 2009/01/01 17:36:41 ler762 -# remove non-standard <nobr> tags -# -# Revision 1.28 2009/01/01 14:51:21 ler762 -# keep the input field and 'go' button on the same line. -# -# Revision 1.27 2008/05/26 17:30:58 fabiankeil -# Provide an OpenSearch Description to access the -# show-url-info page through "search engine plugins". -# -# Revision 1.26 2008/05/05 10:03:06 fabiankeil -# If the provided URL isn't valid, don't show the -# cgi-editor-is-disabled and filters-might-be-ineffective -# sections. -# -# Revision 1.25 2008/04/26 10:34:18 fabiankeil -# If zlib support is unavailable and there are content filters active -# but the prevent-compression action is disabled, include a warning -# on the show-url-info page that compression might prevent filtering. -# -# Revision 1.24 2008/02/10 17:26:52 fabiankeil -# Reduce superfluous white space by not marking -# up the final results list as paragraph. -# -# Revision 1.23 2008/02/01 06:04:31 fabiankeil -# If edit buttons on the show-url-info CGI page are hidden, explain why. -# -# Revision 1.22 2007/12/08 14:29:06 fabiankeil -# Use CSS to let the URL and pattern input fields scale with -# the browser width and try to prevent vertical scroll bars -# if the width is less than 80 characters. Closes #1843596, -# thanks to Gerry Murphy and Lee. -# -# Revision 1.21 2007/11/15 19:11:11 fabiankeil -# Reword HTTPS URL information. -# -# Revision 1.20 2007/07/21 12:19:50 fabiankeil -# If show-url-info is called with an URL that Privoxy -# would reject as invalid, don't show unresolved forwarding -# variables, "final matches" or claim the site's secure. -# -# Revision 1.19 2007/02/10 16:55:22 fabiankeil -# - Show forwarding settings on the show-url-info page -# - Fix some HTML syntax errors. -# -# -######################################################################### -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach Privoxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the Privoxy administrator, as configured -# in the config file -# default-cgi: -# The URL for Privoxy's "main menu" builtin CGI page -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# Privoxy's version number -# code-status: -# Privoxy's development status: "alpha", "beta", or "stable". -# homepage: -# The Privoxy web site. -# -# 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. -# url-given: -# The CGI was called with a url parameter. In that case, the -# following symbols are available: -# url: -# The given URL -# default: -# The system default for actions -# matches: -# The list of all matches in the actions file that this URL -# produced, along with the actions that were triggered by -# these matches -# final: -# The actions that are associated with the URL at the end of -# the matching process -# no-forwarder: Requests to url will be made directly. -# http-forwarder: -# Requests to url will be made through a HTTP proxy -# forward-host: -# The IP address or its hostname -# forward-port. -# The proxy port -# socks-forwarder: -# Requests to url will be made through a socks proxy -# socks-type: -# The socks type: socks4 or socks4a -# gateway-host: -# The IP address or its hostname -# gateway-port: -# The proxy port. -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy@@my-hostname@ URL Info</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> - <link rel="search" type="application/opensearchdescription+xml" title="Privoxy URL Info" href="/url-info-osd.xml"> -</head> - -<body> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - -<!-- @if-url-given-start --> - <tr> - <td class="box"> -<!-- @if-valid-url-start --> - <h2>Forwarding settings:</h2> - <p> - Requests for <a href="@url@">@url@</a> will be <!-- - -# "Interesting" formatting to prevent white space at the end of the sentence. - - @if-no-forwarder-start --> - - made <b>directly</b>, no forwarding settings apply<!-- - - if-no-forwarder-end@--><!-- - @if-http-forwarder-start --><!-- @if-socks-forwarder-start --> - - first <!-- - - if-socks-forwarder-end@ --><!-- if-http-forwarder-end@ --><!-- - @if-socks-forwarder-start --> - - forwarded through <b>@socks-type@-proxy @gateway-host@:@gateway-port@</b><!-- - - if-socks-forwarder-end@ --><!-- - @if-http-forwarder-start --><!-- @if-socks-forwarder-start --> - - and then <!-- - - if-socks-forwarder-end@ --><!-- if-http-forwarder-end@ --><!-- - @if-http-forwarder-start --> - - forwarded through <b>HTTP-proxy @forward-host@:@forward-port@</b><!-- - - if-http-forwarder-end@ -->. - </td> - </tr> - <tr> - <td class="box"> -<!-- @if-https-start --> - <h2>NOTE:</h2> - <p>This is a HTTPS URL, so the part after the "/" is ignored - as Privoxy doesn't see the path for real HTTPS requests either.</p> -<!-- if-https-end@ --> -<!-- if-valid-url-end@ --> - <h2>Matches for <a href="@url@">@url@</a>:</h2> - @matches@ -<!-- @if-valid-url-start --> -<!-- @if-cgi-editor-is-disabled-start --> - <p> - The CGI editor is currently disabled, thus no edit buttons are shown.<br> - Please have a look at the - <a href="@user-manual@config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions documentation</a> - to learn how to enable it and what the risks are. - </p> -<!-- if-cgi-editor-is-disabled-end@ --> -<!-- @if-valid-url-end --> - </td> - </tr> -<!-- @if-valid-url-start --> -<!-- @if-filters-might-be-ineffective-start --> - <tr> - <td class="warning"> - <h2>Warning:</h2> - <p> - This Privoxy version has been build without zlib support, - <strong>content filters will not work if the server sends compressed content.</strong> - Consider enabling the <a title="prevent-compression documentation" - href="@user-manual@actions-file.html#PREVENT-COMPRESSION">prevent-compression</a> - action for this URL or rebuild Privoxy with zlib support. - </p> - </td> - </tr> -<!-- if-filters-might-be-ineffective-end@ --> - <tr> - <td class="box"> - <h2>Final results:</h2> - <b>@final@</b> - </td> - </tr> -<!-- if-valid-url-end@ --> -<!-- if-url-given-end@ --> - -<!-- @if-privoxy-is-toggled-off-start --> - - <tr> - <td class="warning"> - <h2>Warning:</h2> - <p> - <strong>Privoxy is currently toggled off. Matching actions will not apply - unless you <a href="@default-cgi@toggle?set=enable">toggle Privoxy on</a> first.</strong> - </p> - </td> - </tr> -<!-- if-privoxy-is-toggled-off-end@ --> - - <tr> - <td class="box"> - <h2>Look up the actions for a -<!-- @if-url-given-start -->new<!-- if-url-given-end@ --> - URL:</h2> - <form method="GET" action="@default-cgi@show-url-info"> - <p> - <input type="text" name="url" size="80" value="@url@" class="url"> - <input type="submit" value="Go"> - </p> - </form> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/show-version b/external/privoxy/templates/show-version deleted file mode 100644 index 9bdbbba..0000000 --- a/external/privoxy/templates/show-version +++ /dev/null @@ -1,159 +0,0 @@ -########################################################## -# -# Show-Status-CGI Output template for Privoxy. -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# redirect-url: -# The URL to a script that will redirect to the Privoxy -# documentation for a given item -# invocation: -# The command line with whitch Privoxy was invoked -# options: -# The options read from the configfile, linked to their -# explanations, plus warnings if parsing acl or forward -# statements produced errors. -# sourceversions: -# A HTML-formatted list of the individual source file cvs versions -# defines: -# A HTML-formatted list of all conditional #defines used when -# Privoxy was compiled -# -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# sourceversions -# The versions. -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>Privoxy@@my-hostname@: Detailed proxy version information</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Source code versions:</h2> - <p><i>(Note: This information is only relevant if you checked out Privoxy from CVS - and compiled it yourself. If you downloaded a binary, .exe, RPM, or a .tgz file, - then when you ask for support just mention the version number <b>@version@</b> - and the type of download you got.)</i> - </p> - <pre>@sourceversions@</pre> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/toggle b/external/privoxy/templates/toggle deleted file mode 100644 index 3d63eb1..0000000 --- a/external/privoxy/templates/toggle +++ /dev/null @@ -1,180 +0,0 @@ -########################################################## -# -# Toggle Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@ -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> - -<head> - <title>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> -</head> - -<body> - - <table cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="title"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="box"> - <h2>Privoxy is @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</h2> - <p>When enabled, Privoxy performs its magic - blocking - adverts, filtering cookies, regex-filtering, etc.</p> - <p>When disabled, Privoxy behaves as a normal HTTP proxy, - and will not affect your web browsing.</p> - <p><a href="@default-cgi@toggle?set=@if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@">Click - here</a> to @if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@ Privoxy.</p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>Bookmarklets</h2> - <p>Here are some bookmarklets to allow you to easily access a - "mini" version of this page. They are known to work with MS - Internet Explorer, Netscape and Mozilla, but should work equally - well in other browsers which support JavaScript. They are designed - to run directly from your bookmarks - <b>not</b> by clicking the - links below (although that will work for testing). - </p> - <p>To save them, right-click the link and choose - "Add to Favorites" (IE) or "Add Bookmark" (Netscape). You - will get a warning that the bookmark "may not be safe" - just - click OK. Then you can run the Bookmarklet directly from your - favourites/bookmarks. For even faster access, you can put - them on the "Links" bar (IE) or the "Personal Toolbar" - (Netscape), and run them with a single click. - </p> - - <ul> - <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=enabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Enable</a></li> - <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=disabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Disable</a></li> - <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=toggle','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Toggle Privoxy</a> - (Toggles between enabled and disabled)</li> - <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - View Status</a></li> - </ul> - - <p> - <b>Credit:</b> The site which gave us the general idea for these - bookmarklets is <a href="http://www.bookmarklets.com/">www.bookmarklets.com</a>. - They have <a href="http://www.bookmarklets.com/about/">more information</a> about them. - </p> - </td> - </tr> - - <tr> - <td class="box"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> - diff --git a/external/privoxy/templates/toggle-mini b/external/privoxy/templates/toggle-mini deleted file mode 100644 index 3b5d5c9..0000000 --- a/external/privoxy/templates/toggle-mini +++ /dev/null @@ -1,91 +0,0 @@ -########################################################## -# -# Toggle Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@ -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> - -<head> - <title>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="stylesheet" type="text/css" href="@default-cgi@send-stylesheet"> - <link rel="shortcut icon" href="@default-cgi@favicon.ico" type="image/x-icon"> -</head> - -<body> - <p class="whiteframed"> - <a href="@default-cgi@" target="_blank">Privoxy</a> is - <b>@if-enabled-display-then@enabled@else-not-enabled-display@disabled@endif-enabled-display@</b>. - <br><a href="@default-cgi@toggle?mini=y&set=@if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@" - >@if-enabled-display-then@[Disable]@else-not-enabled-display@[Enable]@endif-enabled-display@</a> | - <a href="javascript:window.close();">[Close]</a> - </p> -</body> -</html> diff --git a/external/privoxy/templates/untrusted b/external/privoxy/templates/untrusted deleted file mode 100644 index bd4015a..0000000 --- a/external/privoxy/templates/untrusted +++ /dev/null @@ -1,191 +0,0 @@ -########################################################## -# -# "Untrusted" Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition <name> -# is not given. Simply enclose the block between the two -# strings @if-<name>start and if-<name>-end@. The strings -# should be placed in HTML comments (<!-- -->), so the -# html structure won't be messed when the magic happens. -# -# USABLE SYMBOLS IN THIS TEMPLATE: -# -------------------------------- -# -# my-ip-addr: -# The IP-address that the client used to reach this proxy -# my-hostname: -# The hostname associated with my-ip-addr -# admin-address: -# The email address of the pxoxy's administrator, as configured -# in the config file -# default-cgi: -# The URL for the "main menu" builtin CGI of this proxy -# menu: -# List of <li> elements linking to the other available CGIs -# version: -# The version number of the proxy software -# code-status: -# The development status of the proxy software: "alpha", "beta", -# or "stable". -# homepage: -# The URL of the SourceForge ijbswa project, who maintains this -# software. -# -# 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 -# referrer: -# The referrer of the request that lead to this problem -# trusted-referrers: -# An HTML-formatted list of referrers that are marked as trusted in -# the trustfile -# -# -# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: -# ------------------------------------------------------------------ -# -# unstable: -# This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol -# have-proxy-info: -# A URL for online documentation about this proxy has been -# specified and is available through the "proxy-info-url" -# symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. -# force-support: -# Privoxy has been compiled with support for forced loading -# of blocked content. In that case, the symbol "force-prefix" is -# avaiable, which translates to the FORCE_PREFIX -# have-trust-info: -# There were URLs with info on the trust policy defined in the config -# file. In this case the list of URLs is available through the -# "trust-info" symbol. -# -# -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> - -<head> - <title>Untrusted request (Privoxy@@my-hostname@)</title> - <meta http-equiv="Content-Style-Type" content="text/css"> - <meta http-equiv="Content-Script-Type" content="text/javascript"> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <meta name="robots" content="noindex,nofollow"> - <link rel="shortcut icon" href="@default-cgi@error-favicon.ico"> - <style type="text/css"> -#include cgi-style.css - </style> -</head> - -<body> - - <table summary="" cellpadding="20" cellspacing="10" border="0" width="100%"> - <tr> - <td class="status"> - UNTRUSTED - </td> - <td class="title" style="width: 100%"> - -#include mod-title - - </td> - </tr> - -<!-- @if-unstable-start --> -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - <tr> - <td class="warning" colspan="2"> - -#include mod-unstable-warning - - </td> - </tr> -<!-- if-unstable-end@ --> - - <tr> - <td class="warning" colspan="2"> - <h2>Request for untrusted URL</h2> - <p>Your request for <b>@protocol@@hostport@@path@</b> was blocked, - because neither the request URL itself, nor its referrer - (<b>@referrer@</b>) were trusted. - </p> -<!-- @if-force-support-start --> - <p>(You can <a href="@protocol@@hostport@@force-prefix@@path@">go there anyway</a>.)</p> -<!-- if-force-support-end@ --> - </td> - </tr> - - <tr> - <td class="box" colspan="2"> - <h2>The following referrers are trusted:</h2> - <ul> - @trusted-referrers@ - </ul> - </td> - </tr> - -<!-- @if-have-trust-info-start --> - <tr> - <td class="box" colspan="2"> - <h2>More information on the trust policy:</h2> - <p>You can learn more about what this means and what you may be able to do about it by - reading the following documents: - </p> - <ol> - @trust-info@ - </ol> - </td> - </tr> -<!-- if-have-trust-info-end@ --> - - <tr> - <td class="box" colspan="2"> - <h2>More Privoxy:</h2> - <ul>@menu@<li><a href="@user-manual@">Documentation</a></li></ul> - </td> - </tr> - - <tr> - <td class="info" colspan="2"> - -#include mod-support-and-service - - </td> - </tr> - -<!-- @if-have-help-info-start --> - <tr> - <td class="info" colspan="2"> - -#include mod-local-help - - </td> - </tr> -<!-- if-have-help-info-end@ --> - - </table> - -</body> -</html> diff --git a/external/privoxy/templates/url-info-osd.xml b/external/privoxy/templates/url-info-osd.xml deleted file mode 100644 index 3fbaaf1..0000000 --- a/external/privoxy/templates/url-info-osd.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> -<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> - <ShortName>Privoxy URL Info</ShortName> - <Description> - Enter a URL to see which Privoxy actions apply. - Only works while the browser is configured to use Privoxy. - </Description> - <InputEncoding>ISO-8859-1</InputEncoding> - <OutputEncoding>ISO-8859-1</OutputEncoding> - <Developer>Privoxy Team</Developer> - <Contact>ijbswa-developers@lists.sourceforge.net</Contact> - <Image width="16" height="16" type="image/x-icon">@default-cgi@favicon.ico</Image> - <Url type="text/html" method="GET" template="@default-cgi@show-url-info?url={searchTerms}"/> -</OpenSearchDescription> diff --git a/external/privoxy/tools/privoxy-log-parser.pl b/external/privoxy/tools/privoxy-log-parser.pl deleted file mode 100755 index 29839a4..0000000 --- a/external/privoxy/tools/privoxy-log-parser.pl +++ /dev/null @@ -1,2064 +0,0 @@ -#!/usr/bin/perl - -################################################################################ -# privoxy-log-parser -# -# A parser for Privoxy log messages. For incomplete documentation run -# perldoc privoxy-log-parser(.pl), for fancy screenshots see: -# -# http://www.fabiankeil.de/sourcecode/privoxy-log-parser/ -# -# $Id: privoxy-log-parser.pl,v 1.23 2009/03/14 15:31:58 fabiankeil Exp $ -# -# TODO: -# - LOG_LEVEL_CGI, LOG_LEVEL_ERROR, LOG_LEVEL_WRITE content highlighting -# - create fancy statistics -# - grep through Privoxy sources to find unsupported log messages -# - hunt down substitutions that match content from variables which -# can contain stuff like ()?'[] -# - replace $h{'foo'} with h('foo') where possible -# - hunt down XXX comments instead of just creating them -# - add example log lines for every regex and mark them up for -# regression testing -# - Handle incomplete input without Perl warning about undefined variables. -# - Use generic highlighting function that takes a regex and the -# hash key as input. -# -# Copyright (c) 2007-2009 Fabian Keil fk@fabiankeil.de -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -################################################################################ - -use strict; -use warnings; -use Getopt::Long; - -use constant { - PRIVOXY_LOG_PARSER_VERSION => '0.5', - # Feel free to mess with these ... - DEFAULT_BACKGROUND => 'black', # Choose registered colour (like 'black') - DEFAULT_TEXT_COLOUR => 'white', # Choose registered colour (like 'black') - HEADER_DEFAULT_COLOUR => 'yellow', - REGISTER_HEADERS_WITH_THE_SAME_COLOUR => 1, - - CLI_OPTION_DEFAULT_TO_HTML_OUTPUT => 0, - CLI_OPTION_TITLE => 'Privoxy-Log-Parser in da house', - CLI_OPTION_NO_EMBEDDED_CSS => 0, - CLI_OPTION_NO_MSECS => 0, - CLI_OPTION_NO_SYNTAX_HIGHLIGHTING => 0, - CLI_OPTION_ERROR_LOG_FILE => '/var/log/privoxy-log.log', - CLI_OPTION_SHOW_INEFFECTIVE_FILTERS => 0, - CLI_OPTION_ACCEPT_UNKNOWN_MESSAGES => 0, - CLI_OPTION_STATISTIC => 0, - - SUPPRESS_SUCCEEDED_FILTER_ADDITIONS => 1, - SHOW_SCAN_INTRO => 0, - SHOW_FILTER_READIN_IN => 0, - SUPPRESS_EMPTY_LINES => 1, - SUPPRESS_SUCCESSFUL_CONNECTIONS => 1, - SUPPRESS_ACCEPTED_CONNECTIONS => 1, - SUPPRESS_GIF_NOT_CHANGED => 1, - SUPPRESS_NEED_TO_DE_CHUNK_FIRST => 1, - - DEBUG_HEADER_REGISTERING => 0, - DEBUG_HEADER_HIGHLIGHTING => 0, - DEBUG_TICKS => 0, - DEBUG_PAINT_IT => 0, - DEBUG_SUPPRESS_LOG_MESSAGES => 0, - - PUNISH_MISSING_LOG_KNOWLEDGE_WITH_DEATH => 0, - PUNISH_MISSING_HIGHLIGHT_KNOWLEDGE_WITH_DEATH => 1, - - LOG_UNPARSED_LINES_TO_EXTRA_FILE => 0, - - # You better leave these alone unless you know what you're doing. - COLOUR_RESET => "\033[0;0m", - ESCAPE => "\033[", -}; - -sub prepare_our_stuff () { - - # Syntax Higlight hash - our @all_colours = ( - 'red', 'green', 'brown', 'blue', 'purple', 'cyan', - 'light_gray', 'light_red', 'light_green', 'yellow', - 'light_blue', 'pink', 'light_cyan', 'white' - ); - - our %h = ( - # LOG_LEVEL - Info => 'blue', - Header => 'green', - Filter => 'purple', # XXX: Used? - 'Re-Filter' => 'purple', - Connect => 'brown', - Request => 'light_cyan', - CGI => 'light_green', - Redirect => 'cyan', - Error => 'light_red', - Crunch => 'cyan', - 'Fatal error' => 'light_red', - 'Gif-Deanimate' => 'blue', - Force => 'red', - Writing => 'light_green', - # ---------------------- - URL => 'yellow', - path => 'brown', - request_ => 'brown', # host+path but no protocol - 'ip-address' => 'yellow', - Number => 'yellow', - Standard => 'reset', - Truncation => 'light_red', - Status => 'brown', - Timestamp => 'brown', - Crunching => 'light_red', - crunched => 'light_red', - 'Request-Line' => 'pink', - method => 'purple', - destination => 'yellow', - 'http-version' => 'pink', - 'crunch-pattern' => 'pink', - not => 'brown', - file => 'brown', - signal => 'yellow', - version => 'green', - 'program-name' => 'cyan', - port => 'red', - host => 'red', - warning => 'light_red', - debug => 'light_red', - filter => 'green', - tag => 'green', - tagger => 'green', - 'status-message' => 'light_cyan', - 'status-code' => 'yellow', - 'invalid-request' => 'light_red', - 'hits' => 'yellow', - error => 'light_red', - 'rewritten-URL' => 'light_red', - 'pcrs-delimiter' => 'light_red', - 'ignored' => 'light_red', - 'action-bits-update' => 'light_red', - 'configuration-line' => 'red', - 'content-type' => 'yellow', - ); - - our %h_colours = %h; - - # Header colours need their own hash so the keys can be accessed properly - our %header_colours = ( - # Prefilled with headers that should not appear with default header colours - Cookie => 'light_red', - 'Set-Cookie' => 'light_red', - Warning => 'light_red', - Default => HEADER_DEFAULT_COLOUR, - ); - - # Crunch reasons need their own hash as well - our %reason_colours = ( - 'Unsupported HTTP feature' => 'light_red', - Blocked => 'light_red', - Untrusted => 'light_red', - Redirected => 'green', - 'CGI Call' => 'white', - 'DNS failure' => 'red', - 'Forwarding failed' => 'light_red', - 'Connection failure' => 'light_red', - 'Out of memory (may mask other reasons)' => 'light_red', - 'No reason recorded' => 'light_red', - ); - - our @time_colours = ('white', 'light_gray'); - - # Translate highlight strings into highlight code - prepare_highlight_hash(%header_colours); - prepare_highlight_hash(%reason_colours); - prepare_highlight_hash(%h); - prepare_colour_array(@all_colours); - prepare_colour_array(@time_colours); - init_css_colours(); -} - -sub paint_it ($) { -############################################################### -# Takes a colour string and returns an ANSI escape sequence -# (unless --no-syntax-highlighting is used). -# XXX: The Rolling Stones reference has to go. -############################################################### - - my $colour = shift @_; - - return "" if cli_option_is_set('no-syntax-highlighting'); - - my %light = ( - black => 0, - red => 0, - green => 0, - brown => 0, - blue => 0, - purple => 0, - cyan => 0, - light_gray => 0, - gray => 0, - dark_gray => 1, - light_red => 1, - light_green => 1, - yellow => 1, - light_blue => 1, - pink => 1, - light_cyan => 1, - white => 1, - ); - - my %text = ( - black => 30, - red => 31, - green => 32, - brown => 33, - blue => 34, - purple => 35, - cyan => 36, - gray => 37, - light_gray => 37, - dark_gray => 30, - light_red => 31, - light_green => 32, - yellow => 33, - light_blue => 34, - pink => 35, - light_cyan => 36, - white => 37, - ); - - my $bg_code = get_background(); - my $colour_code; - our $default = default_colours(); - - if (defined($text{$colour})) { - $colour_code = ESCAPE; - $colour_code .= $text{$colour}; - $colour_code .= ";"; - $colour_code .= $light{$colour} ? "1" : "2"; - $colour_code .= ";"; - $colour_code .= $bg_code; - $colour_code .= "m"; - debug_message $colour . " is '" . $colour_code . $colour . $default . "'" if DEBUG_PAINT_IT; - - } elsif ($colour =~ /reset/) { - - $colour_code = default_colours(); - - } else { - - die "What's $colour supposed to mean?\n"; - } - - return $colour_code; -} - -sub get_semantic_html_markup ($) { -############################################################### -# Takes a string and returns a span element -############################################################### - - my $type = shift @_; - my $code; - - if ($type =~ /Standard/) { - $code = '</span>'; - } else { - $type = lc($type); - $code = '<span title="' . $type . '" class="' . $type . '">'; - } - - return $code; -} - -sub cli_option_is_set ($) { - - our %cli_options; - my $cli_option = shift; - - die "Unknown CLI option: $cli_option" unless defined $cli_options{$cli_option}; - - return $cli_options{$cli_option}; -} - -sub get_html_title () { - - our %cli_options; - return $cli_options{'title'}; - -} - -sub init_css_colours() { - - our %css_colours = ( - black => "000", - red => "F00", - green => "0F0", - brown => "C90", - blue => "0F0", - purple => "F06", # XXX: wrong - cyan => "F09", # XXX: wrong - light_gray => "999", - gray => "333", - dark_gray => "222", - light_red => "F33", - light_green => "33F", - yellow => "FF0", - light_blue => "30F", - pink => "F0F", - light_cyan => "66F", - white => "FFF", - ); -} - -sub get_css_colour ($) { - - our %css_colours; - my $colour = shift; - - die "What's $colour supposed to mean?\n" unless defined($css_colours{$colour}); - - return '#' . $css_colours{$colour}; -} - -sub get_css_line ($) { - - our %h_colours; - - my $class = shift; - my $css_line; - - $css_line .= '.' . lc($class) . ' {'; # XXX: lc() shouldn't be necessary - die "What's $class supposed to mean?\n" unless defined($h_colours{$class}); - $css_line .= 'color:' . get_css_colour($h_colours{$class}) . ';'; - $css_line .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';'; - $css_line .= '}' . "\n"; - - return $css_line; -} - -sub get_css_line_for_colour ($) { - - our %h_colours; - - my $colour = shift; - my $css_line; - - $css_line .= '.' . lc($colour) . ' {'; # XXX: lc() shouldn't be necessary - $css_line .= 'color:' . get_css_colour($colour) . ';'; - $css_line .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';'; - $css_line .= '}' . "\n"; - - return $css_line; -} - -# XXX: Wrong solution -sub get_missing_css_lines () { - - my $css_line; - - $css_line .= '.' . 'default' . ' {'; # XXX: lc() shouldn't be necessary - $css_line .= 'color:' . HEADER_DEFAULT_COLOUR . ';'; - $css_line .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';'; - $css_line .= '}' . "\n"; - - return $css_line; -} - -sub get_css () { - - our %h_colours; - our %css_colours; #XXX: Wrong solution - - my $css = ''; - - $css .= '.privoxy-log {'; - $css .= 'color:' . get_css_colour(DEFAULT_TEXT_COLOUR) . ';'; - $css .= 'background-color:' . get_css_colour(DEFAULT_BACKGROUND) . ';'; - $css .= '}' . "\n"; - - foreach my $key (keys %h_colours) { - - next if ($h_colours{$key} =~ m/reset/); #XXX: Wrong solution. - $css .= get_css_line($key); - - } - - foreach my $colour (keys %css_colours) { - - $css .= get_css_line_for_colour($colour); - - } - - $css .= get_missing_css_lines(); #XXX: Wrong solution - - return $css; -} - -sub print_intro () { - - my $intro = ''; - - if (cli_option_is_set('html-output')) { - - my $title = get_html_title(); - - $intro .= '<html><head>'; - $intro .= '<title>' . $title . '</title>'; - $intro .= '<style>' . get_css() . '</style>' unless cli_option_is_set('no-embedded-css'); - $intro .= '</head><body>'; - $intro .= '<h1>' . $title . '</h1><p class="privoxy-log">'; - - print $intro; - } -} - -sub print_outro () { - - my $outro = ''; - - if (cli_option_is_set('html-output')) { - - $outro = '</p></body></html>'; - print $outro; - - } -} - -sub get_line_end () { - - my $line_end = "\n"; - - $line_end = '<br>' . $line_end if cli_option_is_set('html-output'); - - return $line_end; -} - -sub get_colour_html_markup ($) { -############################################################### -# Takes a colour string a span element. XXX: WHAT? -# XXX: This function shouldn't be necessary, the -# markup should always be semantically correct. -############################################################### - - my $type = shift @_; - my $code; - - if ($type =~ /Standard/) { - $code = '</span>'; - } else { - $code = '<span class="' . lc($type) . '">'; - } - - return $code; -} - -sub default_colours () { - # XXX: Properly - our $bg_code; - return reset_colours(); -} - -sub show_colours () { - # XXX: Implement -} - -sub reset_colours () { - return ESCAPE . "0m"; -} - -sub set_background ($){ - - my $colour = shift; - our $bg_code; - my %backgrounds = ( - black => "40", - red => "41", - green => "42", - brown => "43", - blue => "44", - magenta => "45", - cyan => "46", - white => "47", - default => "49", - ); - - if (defined($backgrounds{$colour})) { - $bg_code = $backgrounds{$colour}; - } else { - die "Invalid background colour: " . $colour; - } -} - -sub get_background (){ - return our $bg_code; -} - -sub prepare_highlight_hash ($) { - my $ref = shift; - - if (!cli_option_is_set('html-output')) { - - foreach my $key (keys %$ref) { - $$ref{$key} = paint_it($$ref{$key}); - } - - } else { - - foreach my $key (keys %$ref) { - $$ref{$key} = get_semantic_html_markup($key); - } - - } -} - -sub prepare_colour_array ($) { - my $ref = shift; - - if (!cli_option_is_set('html-output')) { - - foreach my $i (0 ... @$ref - 1) { - $$ref[$i] = paint_it($$ref[$i]); - } - - } else { - - foreach my $i (0 ... @$ref - 1) { - $$ref[$i] = get_colour_html_markup($$ref[$i]); - } - - } -} - -sub found_unknown_content ($) { - - my $unknown = shift; - my $message; - - our %req; - our $t; - - return if cli_option_is_set('accept-unknown-messages'); - - return if ($unknown =~ /[too long, truncated]$/); - - $message = "found_unknown_content: Don't know how to highlight: "; - # Break line so the log file can later be parsed as Privoxy log file again - $message .= '"' . $unknown . '"' . " in:\n"; - $message .= $req{$t}{'log-message'}; - debug_message($message); - log_parse_error($req{$t}{'log-message'}); - - die "Unworthy content parser" if PUNISH_MISSING_LOG_KNOWLEDGE_WITH_DEATH; -} - -sub log_parse_error ($) { - - my $message = shift; - - if (LOG_UNPARSED_LINES_TO_EXTRA_FILE) { - open(ERRORLOG, ">>" . ERROR_LOG_FILE) || die "Writing " . ERROR_LOG_FILE . " failed"; - print ERRORLOG $message; - close(ERRORLOG); - } -} - -sub debug_message (@) { - my @message = @_; - our %h; - - print $h{'debug'} . "@message" . $h{'Standard'} . "\n"; -} - -################################################################################ -# highlighter functions that aren't loglevel-specific -################################################################################ - -sub h ($) { - - # Get highlight marker - our %h; - my $highlight = shift; # XXX: Stupid name; - my $result = ''; - my $message; - - if (defined($highlight)) { - - $result = $h{$highlight}; - - } else { - - $message = "h: Don't recognize highlighter $highlight."; - debug_message($message); - log_parser_error($message); - die "Unworthy highlighter function" if PUNISH_MISSING_HIGHLIGHT_KNOWLEDGE_WITH_DEATH; - } - - return $result; -} - -sub highlight_known_headers ($) { - - my $content = shift; - our %header_colours; - our %h; - my $headers = join ('|', keys %header_colours); - - debug_message("Searching $content for things to highlight.") if DEBUG_HEADER_HIGHLIGHTING; - - if ($content =~ m/(?<=\s)($headers):/) { - my $header = $1; - $content =~ s@(?<=[\s|'])($header)(?=:)@$header_colours{$header}$1$h{'Standard'}@ig; - debug_message("Highlighted $content") if DEBUG_HEADER_HIGHLIGHTING; - } - - return $content; -} - -sub highlight_matched_request_line ($$) { - - my $result = shift; # XXX: Stupid name; - my $regex = shift; - if ($result =~ m@(.*)($regex)(.*)@) { - $result = $1 . highlight_request_line($2) . $3 - } - return $result; -} - -sub highlight_request_line ($) { - - my $rl = shift; - my ($method, $url, $http_version); - our %h; - - #GET http://images.sourceforge.net/sfx/icon_warning.gif HTTP/1.1 - if ($rl =~ m/Invalid request/) { - - $rl = h('invalid-request') . $rl . h('Standard'); - - } elsif ($rl =~ m/^([-\w]+) (.*) (HTTP/\d.\d)/) { - - # XXX: might not match in case of HTTP method fuzzing. - # XXX: save these: ($method, $path, $http_version) = ($1, $2, $3); - $rl =~ s@^(\w+)@$h{'method'}$1$h{'Standard'}@; - if ($rl =~ /http:///) { - $rl = highlight_matched_url($rl, '[^\s]*(?=\sHTTP)'); - } else { - $rl = highlight_matched_pattern($rl, 'request_', '[^\s]*(?=\sHTTP)'); - } - - $rl =~ s@(HTTP/\d.\d)$@$h{'http-version'}$1$h{'Standard'}@; - - } elsif ($rl =~ m/... [too long, truncated]$/) { - - $rl =~ s@^(\w+)@$h{'method'}$1$h{'Standard'}@; - $rl = highlight_matched_url($rl, '[^\s]*(?=...)'); - - } elsif ($rl =~ m/^ $/) { - - $rl = h('error') . "No request line specified!" . h('Standard'); - - } else { - - debug_message ("Can't parse request line: $rl"); - - } - - return $rl; -} - -sub highlight_response_line ($) { - - my $rl = shift; - my ($http_version, $status_code, $status_message); - - #HTTP/1.1 200 OK - #ICY 200 OK - - # TODO: Mark different status codes differently - - if ($rl =~ m/((?:HTTP/\d.\d|ICY)) (\d+) (.*)/) { - ($http_version, $status_code, $status_message) = ($1, $2, $3); - } else { - debug_message ("Can't parse response line: $rl") and die 'Fix this'; - } - - # Rebuild highlighted - $rl= ""; - $rl .= h('http-version') . $http_version . h('Standard'); - $rl .= " "; - $rl .= h('status-code') . $status_code . h('Standard'); - $rl .= " "; - $rl .= h('status-message') . $status_message . h('Standard'); - - return $rl; -} - -sub highlight_matched_url ($$) { - - my $result = shift; # XXX: Stupid name; - my $regex = shift; - - #print "Got $result, regex ($regex)\n"; - - if ($result =~ m@(.*?)($regex)(.*)@) { - $result = $1 . highlight_url($2) . $3; - #print "Now the result is $result\n"; - } - - return $result; -} - -sub highlight_matched_host ($$) { - - my $result = shift; # XXX: Stupid name; - my $regex = shift; - - if ($result =~ m@(.*?)($regex)(.*)@) { - $result = $1 . h('host') . $2 . h('Standard') . $3; - } - - return $result; -} - -sub highlight_matched_pattern ($$$) { - - our %h; - my $result = shift; # XXX: Stupid name; - my $key = shift; - my $regex = shift; - - die "Unknown key $key" unless defined $h{$key}; - - if ($result =~ m@(.*?)($regex)(.*)@) { - $result = $1 . h($key) . $2 . h('Standard') . $3; - } - - return $result; -} - -sub highlight_matched_path ($$) { - - my $result = shift; # XXX: Stupid name; - my $regex = shift; - - if ($result =~ m@(.*?)($regex)(.*)@) { - $result = $1 . h('path') . $2 . h('Standard') . $3; - } - - return $result; -} - -sub highlight_url ($) { - - my $url = shift; - - if (cli_option_is_set('html-output')) { - - $url = '<a href="' . $url . '">' . $url . '</a>'; - - } else { - - $url = h('URL') . $url . h('Standard'); - - } - - return $url; -} - -################################################################################ -# loglevel-specific highlighter functions -################################################################################ - -sub handle_loglevel_header ($) { - - my $content = shift; - my $c = $content; - our $t; - our %req; - our %h; - our %header_colours; - our @all_colours; - our $header_colour_index; - our $no_special_header_highlighting; - - # Register new headers - # scan: Accept: image/png,image/*;q=0.8,*/*;q=0.5 - if ($c =~ m/^scan: ((?>[^:]+)):/) { - my $header = $1; - if (!defined($header_colours{$header}) and $header =~ /^[\d\w-]*$/) { - debug_message "Registering previously unknown header $1" if DEBUG_HEADER_REGISTERING; - - if (REGISTER_HEADERS_WITH_THE_SAME_COLOUR) { - $header_colours{$header} = $header_colours{'Default'}; - } else { - $header_colours{$header} = $all_colours[$header_colour_index % @all_colours]; - $header_colour_index++; - } - } - } - - if ($c =~ m/^scan: ((\w*) (.*) (HTTP/\d.\d))/) { - - # Client request line - # Save for statistics (XXX: Not implemented yet) - $req{$t}{'method'} = $2; - $req{$t}{'destination'} = $3; - $req{$t}{'http-version'} = $4; - - $content = highlight_request_line($1); - - } elsif ($c =~ m/^(scan: )((?:HTTP/\d.\d|ICY) (\d+) (.*))/) { - - # Server response line - $req{$t}{'response_line'} = $2; - $req{$t}{'status_code'} = $3; - $req{$t}{'status_message'} = $4; - $content = $1 . highlight_response_line($req{$t}{'response_line'}); - - } elsif ($c =~ m/^Crunching (?:server|client) header: .* (contains: ([^)]*))/) { - - # Crunching server header: Set-Cookie: trac_form_token=d5308c34e16d15e9e301a456; (contains: Cookie:) - $content =~ s@(?<=contains: )($1)@$h{'crunch-pattern'}$1$h{'Standard'}@; - $content =~ s@(Crunching)@$h{$1}$1$h{'Standard'}@; - - } elsif ($c =~ m/^New host is: ([^\s]*)./) { - - # New host is: trac.vidalia-project.net. Crunching Referer: http://www.vidalia-project.net/ - $c = highlight_matched_host($c, '(?<=New host is: )[^\s]+'); - $content = highlight_matched_url($c, '(?<=Crunching Referer: )[^\s]+'); - - } elsif ($c =~ m/^Text mode enabled by force. (Take cover)!/) { - - # Text mode enabled by force. Take cover! - $content =~ s@($1)@$h{'warning'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^(New HTTP Request-Line: )(.*)/) { - - # New HTTP Request-Line: GET http://www.privoxy.org/ HTTP/1.1 - $content = $1 . highlight_request_line($2); - - } elsif ($c =~ m/^Adjust(ed)? Content-Length to \d+/) { - - # Adjusted Content-Length to 2132 - # Adjust Content-Length to 33533 - $content =~ s@(?<=Content-Length to )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $content = highlight_known_headers($content); - - } elsif ($c =~ m/^Destination extracted from "Host:" header. New request URL:/) { - - # Destination extracted from "Host:" header. New request URL: http://www.cccmz.de/~ridcully/blog/ - $content = highlight_matched_url($content, '(?<=New request URL: ).*'); - - } elsif ($c =~ m/^Couldn't parse:/) { - - # XXX: These should probable be logged with LOG_LEVEL_ERROR - # Couldn't parse: If-Modified-Since: Wed, 21 Mar 2007 16:34:50 GMT (crunching!) - # Couldn't parse: at, 24 Mar 2007 13:46:21 GMT in If-Modified-Since: Sat, 24 Mar 2007 13:46:21 GMT (crunching!) - $content =~ s@^(Couldn't parse)@$h{'error'}$1$h{'Standard'}@; - - } elsif ($c =~ /^Tagger '([^']*)' added tag '([^']*)'/ or - $c =~ m/^Adding tag '([^']*)' created by header tagger '([^']*)'/) { - - # Adding tag 'GET request' created by header tagger 'method-man' (XXX: no longer used) - # Tagger 'revalidation' added tag 'REVALIDATION-REQUEST'. No action bit update necessary. - # Tagger 'revalidation' added tag 'REVALIDATION-REQUEST'. Action bits updated accordingly. - - # XXX: Save tag and tagger - - $content =~ s@(?<=^Tagger ')([^']*)@$h{'tagger'}$1$h{'Standard'}@; - $content =~ s@(?<=added tag ')([^']*)@$h{'tag'}$1$h{'Standard'}@; - $content =~ s@(?<=Action bits )(updated)@$h{'action-bits-update'}$1$h{'Standard'}@; - $no_special_header_highlighting = 1; - - } elsif ($c =~ /^Tagger '([^']*)' didn['']t add tag '([^']*)'/) { - - # Tagger 'revalidation' didn't add tag 'REVALIDATION-REQUEST'. Tag already present - # XXX: Save tag and tagger - - $content =~ s@(?<=^Tagger ')([^']*)@$h{'tag'}$1$h{'Standard'}@; - $content =~ s@(?<=didn['']t add tag ')([^']*)@$h{'tagger'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^(?:scan:|Randomiz|addh:|Adding:|Removing:|Referer:|Modified:|Accept-Language header|[Cc]ookie)/ - or $c =~ m/^(Text mode is already enabled|Denied request with NULL byte|Replaced:|add-unique:)/ - or $c =~ m/^(Crunched (incoming|outgoing) cookie|Suppressed offer|Accepted the client)/ - or $c =~ m/^(addh-unique|Referer forged to)/ - or $c =~ m/^Downgraded answer to HTTP/1.0/ - or $c =~ m/^Parameter: +hide-referrer{[^}]*} is a bad idea, but I don't care./ - or $c =~ m/^Referer (?:overwritten|replaced) with: Referer: / #XXX: should this be highlighted? - or $c =~ m/^Referer crunched!/ - or $c =~ m/^crunched x-forwarded-for!/ - or $c =~ m/^crunched From!/ - or $c =~ m/^ modified$/ - or $c =~ m/^Content filtering is enabled. Crunching:/ - or $c =~ m/^force-text-mode overruled the client/ - or $c =~ m/^Server time in the future./ - or $c =~ m/^content-disposition header crunched and replaced with:/i - or $c =~ m/^Reducing white space in / - or $c =~ m/^Ignoring single quote in / - or $c =~ m/^Converting tab to space in / - or $c =~ m/A HTTP/1.1 response without/ - or $c =~ m/Disabled filter mode on behalf of the client/ - ) - { - # XXX: Some of these may need highlighting - - # Modified: User-Agent: Mozilla/5.0 (X11; U; SunOS i86pc; pl-PL; rv:1.8.1.1) Gecko/20070214 Firefox/2.0.0.1 - # Accept-Language header crunched and replaced with: Accept-Language: pl-pl - # cookie 'Set-Cookie: eZSessionCookie=07bfec287c197440d299f81580593c3d; \ - # expires=Thursday, 12-Apr-07 15:16:18 GMT; path=/' send by \ - # http://wirres.net/article/articleview/4265/1/6/ appears to be using time format 1 (XXX: gone with the wind) - # Cookie rewritten to a temporary one: Set-Cookie: NSC_gffe-iuuq-mc-wtfswfs=8efb33a53660;path=/ - # Text mode is already enabled - # Denied request with NULL byte(s) turned into line break(s) - # Replaced: 'Connection: Yo, home to Bel Air' with 'Connection: close' - # addh-unique: Host: people.freebsd.org - # Suppressed offer to compress content - # Crunched incoming cookie -- yum! - # Accepted the client's request to fetch without filtering. - # Crunched outgoing cookie: Cookie: PREF=ID=6cf0abd347b30262:TM=1173357617:LM=1173357617:S=jZypyyJ7LPiwFi1_ - # addh-unique: Host: subkeys.pgp.net:11371 - # Referer forged to: Referer: http://10.0.0.1/ - # Downgraded answer to HTTP/1.0 - # Parameter: +hide-referrer{pille-palle} is a bad idea, but I don't care. - # Referer overwritten with: Referer: pille-palle - # Referer replaced with: Referer: pille-palle - # crunched x-forwarded-for! - # crunched From! - # modified # XXX: pretty stupid log message - # Content filtering is enabled. Crunching: 'Range: 1234-5678' to prevent range-mismatch problems - # force-text-mode overruled the client's request to fetch without filtering! - # Server time in the future. - # content-disposition header crunched and replaced with: content-disposition: filename=baz - # Content-Disposition header crunched and replaced with: content-disposition: filename=baz - # Reducing white space in 'X-LWS-Test: "This is quoted" this is not "this is " but " this again is not' - # Ignoring single quote in 'X-LWS-Test: "This is quoted" this is not "this is " but " this again is not' - # Converting tab to space in 'X-LWS-Test: "This is quoted" this is not "this is " but "\ - # this again is not' - # A HTTP/1.1 response without Connection header implies keep-alive. - # Disabled filter mode on behalf of the client. - - } elsif ($c =~ m/^scanning headers for:/) { - - return '' unless SHOW_SCAN_INTRO; - - } elsif ($c =~ m/^[Cc]runch(ing|ed)|crumble crunched:/) { - # crunched User-Agent! - # Crunching: Content-Encoding: gzip - - $content =~ s@(Crunching|crunched)@$h{$1}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Offending request data with NULL bytes turned into '°' characters:/) { - - # Offending request data with NULL bytes turned into '°' characters: °°n°°(°°° - - $content = h('warning') . $content . h('Standard'); - - } elsif ($c =~ m/^(Transforming ")(.*?)(" to ")(.*?)(")/) { - - # Transforming "Proxy-Authenticate: Basic realm="Correos Proxy Server"" to\ - # "Proxy-Authenticate: Basic realm="Correos Proxy Server"" - - $content =~ s@(?<=^Transforming ")(.*)(?=" to)@$h{'Header'}$1$h{'Standard'}@; - $content =~ s@(?<=to ")(.*)(?=")@$h{'Header'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Removing empty header/) { - - # Removing empty header - # Ignore for now - - } elsif ($c =~ m/^Content-Type: .* not replaced/) { - - # Content-Type: application/octet-stream not replaced. It doesn't look like text.\ - # Enable force-text-mode if you know what you're doing. - # XXX: Could highlight more here. - $content =~ s@(?<=^Content-Type: )(.*)(?= not replaced)@$h{'content-type'}$1$h{'Standard'}@; - - } else { - - found_unknown_content($content); - } - - # Highlight headers - unless ($c =~ m/^Transforming/) { - $content = highlight_known_headers($content) unless $no_special_header_highlighting; - } - - return $content; -} - -sub handle_loglevel_re_filter ($) { - - my $content = shift; - my $c = $content; - my $key; - our $t; - our %req; - our %h; - our %header_colours; - our @all_colours; - our $header_colour_index; - - if ($c =~ /.{3}$/ - and $c =~ m/^(?:re_)?filtering '?(.*?)'? (size (\d*)) with (?:filter )?'?([^\s]*?)'? ?.{3}$/) { - - # Used by Privoxy 3.0.5 and 3.0.6: - # XXX: Fill in ... - # Used by Privoxy 3.0.7: - # filtering 'Connection: close' (size 17) with 'generic-content-ads' ... - - $req{$t}{'filtered_header'} = $1; - $req{$t}{'old_header_size'} = $2; - $req{$t}{'header_filter_name'} = $3; - - unless (cli_option_is_set('show-ineffective-filters') or - $req{$t}{'header_filter_name'} =~ m/^privoxy-filter-test$/) { - return ''; - } - $content =~ s@(?<=(size )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $content =~ s@($req{$t}{'header_filter_name'})@$h{'filter'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^ ?... ?produced (\d*) hits (new size (\d*))./) { - - # ...produced 0 hits (new size 23). - #... produced 1 hits (new size 54). - - $req{$t}{'header_filter_hits'} = $1; - $req{$t}{'new_header_size'} = $2; - - unless (cli_option_is_set('show-ineffective-filters') or - (defined($req{$t}{'header_filter_name'}) and - $req{$t}{'header_filter_name'} =~ m/^privoxy-filter-test$/)) { - - if ($req{$t}{'header_filter_hits'} == 0 and - not (defined($req{$t}{'header_filter_name'}) and - $req{$t}{'header_filter_name'} =~ m/^privoxy-filter-test$/)) { - return ''; - } - # Reformat including information from the intro - $c = "'" . h('filter') . $req{$t}{'header_filter_name'} . h('Standard') . "'"; - $c .= " hit "; - # XXX: Hide behind constant, it may be interesting if LOG_LEVEL_HEADER isn't enabled as well. - # $c .= $req{$t}{'filtered_header'} . " "; - $c .= h('Number') . $req{$t}{'header_filter_hits'}. h('Standard'); - $c .= ($req{$t}{'header_filter_hits'} == 1) ? " time, " : " times, "; - - if ($req{$t}{'old_header_size'} != $req{$t}{'new_header_size'}) { - - $c .= "changing size from "; - $c .= h('Number') . $req{$t}{'old_header_size'} . h('Standard'); - $c .= " to "; - $c .= h('Number') . $req{$t}{'new_header_size'} . h('Standard'); - $c .= "."; - - } else { - - $c .= "keeping the size at " . $req{$t}{'old_header_size'}; - - } - - # Highlight from last line (XXX: What?) - # $c =~ s@(?<=produced )(\d+)@$h{'Number'}$1$h{'Standard'}@; - # $c =~ s@($req{$t}{'header_filter_name'})@$h{'filter'}$1$h{'Standard'}@; - - } else { - - # XXX: Untested - $c =~ s@(?<=produced )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=new size )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } - $content = $c; - - } elsif ($c =~ m/^(Tagger|Filter) ([^\s]*) has empty joblist. Nothing to do./) { - - # Filter privoxy-filter-test has empty joblist. Nothing to do. - # Tagger variable-test has empty joblist. Nothing to do. - - $content =~ s@(?<=$1 )([^\s]*)@$h{'filter'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^(?:re_)?filtering ([^\s]+) (size (\d+)) with (?:filter )?'?([^\s]+?)'? produced (\d+) hits (new size (\d+))/) { - - # XXX: only the second version gets highlighted properly. - # re_filtering www.lfk.de/favicon.ico (size 209) with filter untrackable-hulk produced 0 hits (new size 209). - # filtering aci.blogg.de/ (size 37988) with 'blogg.de' produced 3 hits (new size 38057) - $req{$t}{'content_source'} = $1; - $req{$t}{'content_size'} = $2; - $req{$t}{'content_filter'} = $3; - $req{$t}{'content_hits'} = $4; - $req{$t}{'new_content_size'} = $5; - $req{$t}{'content_size_change'} = $req{$t}{'new_content_size'} - $req{$t}{'content_size'}; - #return '' if ($req{$t}{'content_hits'} == 0 && !cli_option_is_set('show-ineffective-filters')); - if ($req{$t}{'content_hits'} == 0 and - not (cli_option_is_set('show-ineffective-filters') - or ($req{$t}{'content_filter'} =~ m/^privoxy-filter-test$/))) { - return ''; - } - - $c =~ s@(?<=(size )(\d+))(?= with)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=(new size )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=produced )(\d+)(?= hits)@$h{'Number'}$1$h{'Standard'}@; - - $c =~ s@([^\s]+?)('? produced)@$h{'filter'}$1$h{'Standard'}$2@; - $c = highlight_matched_host($c, '(?<=filtering )[^\s]+'); - - $c =~ s@.$@ @; - $c .= "(" . $h{'Number'}; - $c .= "+" if ($req{$t}{'content_size_change'} >= 0); - $c .= $req{$t}{'content_size_change'} . $h{'Standard'} . ")"; - $content = $c; - - } elsif ($c =~ m/^De-chunking successful. Shrunk from (\d+) to (\d+)/) { - - $req{$t}{'chunked-size'} = $1; - $req{$t}{'dechunked-size'} = $2; - $req{$t}{'dechunk-change'} = $req{$t}{'dechunked-size'} - $req{$t}{'chunked-size'}; - - $content .= " (" . h('Number') . $req{$t}{'dechunk-change'} . h('Standard') . ")"; - - $content =~ s@(?<=from )($req{$t}{'chunked-size'})@$h{'Number'}$1$h{'Standard'}@; - $content =~ s@(?<=to )($req{$t}{'dechunked-size'})@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Decompression successful. Old size: (\d+), new size: (\d+)./) { - - # Decompression successful. Old size: 670, new size: 1166. - - $req{$t}{'size-compressed'} = $1; - $req{$t}{'size-decompressed'} = $2; - $req{$t}{'decompression-gain'} = $req{$t}{'size-decompressed'} - $req{$t}{'size-compressed'}; - - $content =~ s@(?<=Old size: )($req{$t}{'size-compressed'})@$h{'Number'}$1$h{'Standard'}@; - $content =~ s@(?<=new size: )($req{$t}{'size-decompressed'})@$h{'Number'}$1$h{'Standard'}@; - - # XXX: Create sub get_percentage() - if ($req{$t}{'size-decompressed'}) { - $req{$t}{'decompression-gain-percent'} = - $req{$t}{'decompression-gain'} / $req{$t}{'size-decompressed'} * 100; - - $content .= " (saved: "; - #$content .= h('Number') . $req{$t}{'decompression-gain'} . h('Standard'); - #$content .= "/"; - $content .= h('Number') . sprintf("%.2f%%", $req{$t}{'decompression-gain-percent'}) . h('Standard'); - $content .= ")"; - } - - } elsif ($c =~ m/^(Need to de-chunk first)/) { - - # Need to de-chunk first - return '' if SUPPRESS_NEED_TO_DE_CHUNK_FIRST; - - } elsif ($c =~ m/^(Adding (?:dynamic )?re_filter job)/) { - - return '' if (SUPPRESS_SUCCEEDED_FILTER_ADDITIONS && m/succeeded/); - - # Adding re_filter job ... - # Adding dynamic re_filter job s@^(?:\w*)\s+.*\s+HTTP/\d.\d\s*@IP-ADDRESS: $origin@D\ - # to filter client-ip-address succeeded. - - } elsif ($c =~ m/^Reading in filter/) { - - return '' unless SHOW_FILTER_READIN_IN; - - } else { - - found_unknown_content($content); - - } - - return $content; -} - -sub handle_loglevel_redirect ($) { - - my $c = shift; - our $t; - our %req; - our %h; - - if ($c =~ m/^Decoding "([^""]*)"/) { - - $req{$t}{'original-destination'} = $1; - $c = highlight_matched_path($c, '(?<=Decoding ")[^"]*'); - $c =~ s@"@@g; - - } elsif ($c =~ m/^Checking/) { - - # Checking /_ylt=A0geu.Z76BRGR9k/**http://search.yahoo.com/search?p=view+odb+presentation+on+freebsd%5C - # &ei=UTF-8&xargs=0&pstart=1&fr=moz2&b=11 for redirects. - - # TODO: Change colour if really url-decoded - $req{$t}{'decoded-original-destination'} = $1; - $c = highlight_matched_path($c, '(?<=Checking ")[^"]*'); - $c =~ s@"@@g; - - } elsif ($c =~ m/^pcrs command "([^""]*)" changed "([^""]*)" to "([^""]*)" ((\d+) hits?)/) { - - # pcrs command "s@&from=rss@@" changed "http://it.slashdot.org/article.pl?sid=07/03/02/1657247&from=rss%22%5C - # to "http://it.slashdot.org/article.pl?sid=07/03/02/1657247" (1 hit). - - my ($pcrs_command, $url_before, $url_after, $hits) = ($1, $2, $3, $4); # XXX: save these? - - $c =~ s@(?<=pcrs command )"([^""]*)"@$h{'filter'}$1$h{'Standard'}@; - $c = highlight_matched_url($c, '(?<=changed ")[^""]*'); - $c =~ s@(?<=changed )"([^""]*)"@$1@; # Remove quotes - $c = highlight_matched_url($c, '(?<=to ")[^""]*'); - $c =~ s@(?<=to )"([^""]*)"@$1@; # Remove quotes - $c =~ s@(\d+)(?= hits?)@$h{'hits'}$1$h{'Standard'}@; - - } elsif ($c =~ m/(^New URL is: )(.*)/) { - - # New URL is: http://it.slashdot.org/article.pl?sid=07/03/04/1511210 - # XXX: Use URL highlighter - # XXX: Save? - $c = $1 . h('rewritten-URL') . $2 . h('Standard'); - - } elsif ($c =~ m/No pcrs command recognized, assuming that/) { - # No pcrs command recognized, assuming that "http://config.privoxy.org/user-manual/favicon.png%22%5C - # is already properly formatted. - # XXX: assume the same? - $c = highlight_matched_url($c, '(?<=assuming that ")[^"]*'); - - } else { - - found_unknown_content($c); - - } - - return $c; -} - -sub handle_loglevel_gif_deanimate ($) { - - my $content = shift; - our $t; - our %req; - our %h; - - if ($content =~ m/Success! GIF shrunk from (\d+) bytes to (\d+)./) { - - my $bytes_from = $1; - my $bytes_to = $2; - # Gif-Deanimate: Success! GIF shrunk from 205 bytes to 133. - $content =~ s@$bytes_from@$h{'Number'}$bytes_from$h{'Standard'}@; - # XXX: Do we need g in case of ($1 == $2)? - $content =~ s@$bytes_to@$h{'Number'}$bytes_to$h{'Standard'}@; - - } elsif ($content =~ m/GIF (not) changed/) { - - # Gif-Deanimate: GIF not changed. - return '' if SUPPRESS_GIF_NOT_CHANGED; - $content =~ s@($1)@$h{'not'}$1$h{'Standard'}@; - - } elsif ($content =~ m/^failed! (gif parsing)/) { - - # failed! (gif parsing) - # XXX: Replace this error message with something less stupid - $content =~ s@(failed!)@$h{'error'}$1$h{'Standard'}@; - - } elsif ($content =~ m/^Need to de-chunk first/) { - - # Need to de-chunk first - return '' if SUPPRESS_NEED_TO_DE_CHUNK_FIRST; - - } elsif ($content =~ m/^(?:No GIF header found|failed while parsing)/) { - - # No GIF header found (XXX: Did I ever commit this?) - # failed while parsing 195 134747048 (XXX: never commited) - - # Ignore these for now - - } else { - - found_unknown_content($content); - - } - - return $content; -} - -sub handle_loglevel_request ($) { - - my $content = shift; - our $t; - our %req; - our %h; - our %reason_colours; - - if ($content =~ m/crunch! /) { - - # config.privoxy.org/send-stylesheet crunch! (CGI Call) - - # Highlight crunch reasons - foreach my $reason (keys %reason_colours) { - $content =~ s@(($reason))@$reason_colours{$reason}($1)$h{'Standard'}@g; - } - # Highlight request URL domain and ditch 'crunch!' - $content = highlight_matched_pattern($content, 'request_', '[^ ]*(?= crunch!)'); - $content =~ s@ crunch!@@; - - } elsif ($content =~ m/[too long, truncated]$/) { - - # config.privoxy.org/edit-actions-submit?f=3&v=1176116716&s=7&Submit=Submit[...]&filter... [too long, truncated] - $content = highlight_matched_pattern($content, 'request_', '^.*(?=... [too long, truncated]$)'); - - } elsif ($content =~ m/(.*)/) { # XXX: Pretty stupid - - # trac.vidalia-project.net/wiki/Volunteer?format=txt - $content = h('request_') . $content . h('Standard'); - - } else { # XXX: Nop - - found_unknown_content($content); - - } - - return $content; -} - -sub handle_loglevel_crunch ($) { - - my $content = shift; - our %h; - our %reason_colours; - - # Highlight crunch reason - foreach my $reason (keys %reason_colours) { - $content =~ s@($reason)@$reason_colours{$reason}$1$h{'Standard'}@g; - } - - if ($content =~ m/[too long, truncated]$/) { - - # Blocked: config.privoxy.org/edit-actions-submit?f=3&v=1176116716&s=7&Submit=Submit\ - # [...]&filter... [too long, truncated] - $content = highlight_matched_pattern($content, 'request_', '^.*(?=... [too long, truncated]$)'); - - } else { - - # Blocked: http://ads.example.org/ - $content = highlight_matched_pattern($content, 'request_', '(?<=: ).*'); - } - - return $content; -} - -sub handle_loglevel_connect ($) { - - my $c = shift; - our $t; - our %req; - our %h; - - if ($c =~ m/^via [^\s]+ to: [^\s]+/) { - - # Connect: via 10.0.0.1:8123 to: www.example.org.noconnect - - $c = highlight_matched_host($c, '(?<=via )[^\s]+'); - $c = highlight_matched_host($c, '(?<=to: )[^\s]+'); - - } elsif ($c =~ m/^connect to: .* failed: .*/) { - - # connect to: www.example.org.noconnect failed: Operation not permitted - - $c = highlight_matched_host($c, '(?<=connect to: )[^\s]+'); - - $c =~ s@(?<=failed: )(.*)@$h{'error'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^to ([^\s]*) successful$/) { - - # Connect: to www.nzherald.co.nz successful - - return '' if SUPPRESS_SUCCESSFUL_CONNECTIONS; - $c = highlight_matched_host($c, '(?<=to )[^\s]+'); - - } elsif ($c =~ m/^to ([^\s]*)$/) { - - # Connect: to lists.sourceforge.net:443 - - $c = highlight_matched_host($c, '(?<=to )[^\s]+'); - - } elsif ($c =~ m/^accepted connection from .*/ or - $c =~ m/^OK/) { - - # accepted connection from 10.0.0.1 - # Privoxy 3.0.6 and earlier just say: - # OK - return '' if SUPPRESS_ACCEPTED_CONNECTIONS; - $c = highlight_matched_host($c, '(?<=connection from ).*'); - - } elsif ($c =~ m/^write header to: .* failed:/) { - - # write header to: 10.0.0.1 failed: Broken pipe - - $c = highlight_matched_host($c, '(?<=write header to: )[^\s]*'); - $c =~ s@(?<=failed: )(.*)@$h{'Error'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^write header to client failed:/) { - - # write header to client failed: Broken pipe - # XXX: Stil in use? - $c =~ s@(?<=failed: )(.*)@$h{'Error'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^socks4_connect:/) { - - # socks4_connect: SOCKS request rejected or failed. - $c =~ s@(?<=socks4_connect: )(.*)@$h{'Error'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Listening for new connections/ or - $c =~ m/^accept connection/) { - # XXX: Highlight? - # Privoxy versions above 3.0.6 say: - # Listening for new connections ... - # earlier versions say: - # accept connection ... - return ''; - - } elsif ($c =~ m/^accept failed:/) { - - $c =~ s@(?<=accept failed: )(.*)@$h{'Error'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Overriding forwarding settings/) { - - # Overriding forwarding settings based on 'forward 10.0.0.1:8123' - $c =~ s@(?<=based on ')(.*)(?=')@$h{'configuration-line'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Denying suspicious CONNECT request from/) { - - # Denying suspicious CONNECT request from 10.0.0.1 - $c = highlight_matched_host($c, '(?<=from )[^\s]+'); # XXX: not an URL - - } elsif ($c =~ m/^socks5_connect:/) { - - $c =~ s@(?<=socks5_connect: )(.*)@$h{'error'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Created new connection to/) { - - # Created new connection to www.privoxy.org:80 on socket 11. - $c = highlight_matched_host($c, '(?<=connection to )[^\s]+'); - $c =~ s@(?<=on socket )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^^Found reusable socket/) { - - # Found reusable socket 9 for www.privoxy.org:80 in slot 0. - $c =~ s@(?<=Found reusable socket )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c = highlight_matched_host($c, '(?<=for )[^\s]+'); - $c =~ s@(?<=in slot )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Marking open socket/) { - - # Marking open socket 9 for www.privoxy.org:80 in slot 0 as unused. - $c =~ s@(?<=Marking open socket )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c = highlight_matched_host($c, '(?<=for )[^\s]+'); - $c =~ s@(?<=in slot )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^No reusable/) { - - # No reusable socket for addons.mozilla.org:443 found. Opening a new one. - $c = highlight_matched_host($c, '(?<=for )[^\s]+'); - - } elsif ($c =~ m/^(Remembering|Forgetting) socket/) { - - # Remembering socket 13 for www.privoxy.org:80 in slot 0. - # Forgetting socket 38 for www.privoxy.org:80 in slot 5. - $c =~ s@(?<=socket )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c = highlight_matched_host($c, '(?<=for )[^\s]+'); - $c =~ s@(?<=in slot )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Socket/) { - - # Socket 16 already forgotten or never remembered. - $c =~ s@(?<=Socket )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^The connection to/) { - - # The connection to www.privoxy.org:80 in slot 6 timed out. Closing socket 19. Timeout is: 61. - # The connection to 10.0.0.1:80 in slot 0 is no longer usable. Closing socket 4. - $c = highlight_matched_host($c, '(?<=connection to )[^\s]+'); - $c =~ s@(?<=in slot )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=Closing socket )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=Timeout is: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Waiting for/) { - - # Waiting for 1 connections to timeout. - $c =~ s@(?<=^Waiting for )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Initialized/) { - - # Initialized 20 socket slots. - $c =~ s@(?<=Initialized )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Done reading from server/) { - - # Done reading from server. Expected content length: 24892. \ - # Actual content length: 24892. Most recently received: 4412. - $c =~ s@(?<=Expected content length: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=Actual content length: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=received: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Continuing buffering headers/) { - - # Continuing buffering headers. byte_count: 19. header_offset: 517. len: 536. - $c =~ s@(?<=byte_count: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=header_offset: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=len: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Received \d+ bytes while/) { - - # Received 206 bytes while expecting 12103. - $c =~ s@(?<=Received )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=expecting )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Connection from/) { - - # Connection from 81.163.28.218 dropped due to ACL - $c =~ s@(?<=^Connection from )((?:\d+.?){4})@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Looks like we rea/ or - $c =~ m/^Unsetting keep-alive flag/ or - $c =~ m/^No connections to wait/) { - - # Looks like we reached the end of the last chunk. We better stop reading. - # Looks like we read the end of the last chunk together with the server \ - # headers. We better stop reading. - # Unsetting keep-alive flag. - # No connections to wait for left. - - } else { - - found_unknown_content($c); - - } - - return $c; -} - - -sub handle_loglevel_info ($) { - - my $c = shift; - our $t; - our %req; - our %h; - - if ($c =~ m/^Rewrite detected:/) { - - # Rewrite detected: GET http://10.0.0.2:88/blah.txt HTTP/1.1 - $c = highlight_matched_request_line($c, '(?<=^Rewrite detected: ).*'); - - } elsif ($c =~ m/^Decompress(ing deflated|ion didn)/ or - $c =~ m/^Compressed content detected/ or - $c =~ m/^Tagger/ - ) { - # Decompressing deflated iob: 117 - # Decompression didn't result in any content. - # Compressed content detected, content filtering disabled. Consider recompiling Privoxy\ - # with zlib support or enable the prevent-compression action. - # Tagger 'complete-url' created empty tag. Ignored. - - # Ignored for now - - } elsif ($c =~ m/^(Re)?loading configuration file /) { - - # loading configuration file '/usr/local/etc/privoxy/config': - # Reloading configuration file '/usr/local/etc/privoxy/config' - $c =~ s@(?<=loading configuration file ')([^']*)@$h{'file'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^exiting by signal/) { - - # exiting by signal 15 .. bye - $c =~ s@(?<=exiting by signal )(\d+)@$h{'signal'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Privoxy version/) { - - # Privoxy version 3.0.7 - $c =~ s@(?<=^Privoxy version )(\d+.\d+.\d+)$@$h{'version'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Program name: /) { - - # Program name: /usr/local/sbin/privoxy - $c =~ s@(?<=Program name: )(.*)@$h{'program-name'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Listening on port /) { - - # Listening on port 8118 on IP address 10.0.0.1 - $c =~ s@(?<=Listening on port )(\d+)@$h{'port'}$1$h{'Standard'}@; - $c =~ s@(?<=on IP address )(.*)@$h{'ip-address'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^(Re-)Open(?:ing)? logfile/) { - - # (Re-)Open logfile /var/log/privoxy/privoxy.log - $c =~ s@(?<=Open logfile )(.*)@$h{'file'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^(Request from|Malformed server response detected)/) { - - # Request from 10.0.0.1 denied. limit-connect{,} doesn't allow CONNECT requests to port 443. - # Request from 10.0.0.1 marked for blocking. limit-connect{,} doesn't allow CONNECT requests to port 443. - # Malformed server response detected. Downgrading to HTTP/1.0 impossible. - - $c =~ s@(?<=Request from )([^\s]*)@$h{'ip-address'}$1$h{'Standard'}@; - $c =~ s@(denied|blocking)@$h{'warning'}$1$h{'Standard'}@; - $c =~ s@(CONNECT)@$h{'method'}$1$h{'Standard'}@; - $c =~ s@(?<=to port )(\d+)@$h{'port'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Status code/) { - - # Status code 304 implies no body. - $c =~ s@(?<=Status code )(\d+)@$h{'status-code'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Method/) { - - # Method HEAD implies no body. - $c =~ s@(?<=Method )([^\s]+)@$h{'method'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^Buffer limit reached while extending /) { - - # Buffer limit reached while extending the buffer (iob). Needed: 4197470. Limit: 4194304 - $c =~ s@(?<=Needed: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - $c =~ s@(?<=Limit: )(\d+)@$h{'Number'}$1$h{'Standard'}@; - - } elsif ($c =~ m/^No logfile configured/ or - $c =~ m/^Malformerd HTTP headers detected and MS IIS5 hack enabled/ or - $c =~ m/^Invalid "chunked" transfer/ or - $c =~ m/^Support for/ or - $c =~ m/^Flushing header and buffers/ - ) { - - # No logfile configured. Please enable it before reporting any problems. - # Malformerd HTTP headers detected and MS IIS5 hack enabled. Expect an invalid \ - # response or even no response at all. - # No logfile configured. Logging disabled. - # Invalid "chunked" transfer encoding detected and ignored. - # Support for 'Connection: keep-alive' is experimental, incomplete and\ - # known not to work properly in some situations. - # Flushing header and buffers. Stepping back from filtering. - - } else { - - found_unknown_content($c); - - } - - return $c; -} - -sub handle_loglevel_cgi ($) { - - my $c = shift; - our $t; - our %req; - our %h; - - if ($c =~ m/^Granting access to/) { - - #Granting access to http://config.privoxy.org/send-stylesheet, referrer http://p.p/ is trustworthy. - - } elsif ($c =~ m/^Substituting: s(.)/) { - - # Substituting: s/@else-not-FEATURE_ZLIB@.*@endif-FEATURE_ZLIB@//sigTU - # XXX: prone to span several lines - - my $delimiter = $1; - #$c =~ s@(?<=failed: )(.*)@$h{'error'}$1$h{'Standard'}@; - $c =~ s@(?!<=\)($delimiter)@$h{'pcrs-delimiter'}$1$h{'Standard'}@g; # XXX: Too aggressive - #$c =~ s@(?!<=\)($1)@$h{'pcrs-delimiter'}$1$h{'Standard'}@g; - } - - return $c; -} - -sub handle_loglevel_force ($) { - - my $c = shift; - our $t; - our %req; - our %h; - - if ($c =~ m/^Ignored force prefix in request:/) { - - # Ignored force prefix in request: "GET http://10.0.0.1/PRIVOXY-FORCE/block HTTP/1.1" - $c =~ s@^(Ignored)@$h{'ignored'}$1$h{'Standard'}@; - $c = highlight_matched_request_line($c, '(?<=request: ")[^"]*'); - - } elsif ($c =~ m/^Enforcing request:/) { - - # Enforcing request: "GET http://10.0.0.1/block HTTP/1.1". - $c = highlight_matched_request_line($c, '(?<=request: ")[^"]*'); - - } else { - - found_unknown_content($c); - - } - - return $c; -} - -sub handle_loglevel_ignore ($) { - return shift; -} - -################################################################################ -# Functions that actually print stuff -################################################################################ - -sub print_clf_message () { - - our ($ip, $timestamp, $request_line, $status_code, $size); - our %h; - my $output = ''; - - return if DEBUG_SUPPRESS_LOG_MESSAGES; - - # Rebuild highlighted - $output .= $h{'Number'} . $ip . $h{'Standard'}; - $output .= " - - "; - $output .= "[" . $h{'Timestamp'} . $timestamp . $h{'Standard'} . "]"; - $output .= " "; - $output .= """ . highlight_request_line("$request_line") . """; - $output .= " "; - $output .= $h{'Status'} . $status_code . $h{'Standard'}; - $output .= " "; - $output .= $h{'Number'} . $size . $h{'Standard'}; - $output .= get_line_end(); - - print $output; -} - -sub print_non_clf_message ($) { - - our %req; - our %thread_colours; - our %h; - our $t; - our $time_colour_index; - our @time_colours; - my $output; - my $content = shift; - my ($day, $time_stamp, $msecs, $thread, $log_level) - = ($req{$t}{'day'}, $req{$t}{'time-stamp'}, $req{$t}{'msecs'}, $t, $req{$t}{'log-level'} ); - - return if DEBUG_SUPPRESS_LOG_MESSAGES; - - $output .= $h{"Standard"} unless cli_option_is_set('html-output'); - # $output .= "$day "; - $output .= $time_colours[$time_colour_index % 2]; - - $output .= $time_stamp; - $output .= ".$msecs" unless cli_option_is_set('no-msecs'); - $output .= $h{"Standard"}; - $output .= " "; - $output .= $thread_colours{$thread} if (defined($thread_colours{$thread})); - $output .= $thread; - $output .= $h{"Standard"} . " "; - $output .= $h{$log_level} if (defined($h{$log_level})); - $output .= $log_level; - $output .= $h{"Standard"} . ": "; - $output .= "$content"; - $output .= get_line_end(); - - print $output; -} - -sub parse_loop () { - - our $t; - our %req; # request data from previous lines - our %h; - our %thread_colours; - our @all_colours; - our @time_colours; - our $thread_colour_index = 0; - our $header_colour_index = 0; - our $time_colour_index = 0; - - my ($day, $time_stamp, $thread, $log_level, $content, $c, $msecs); - my $last_msecs = 0; - my $last_thread = 0; - my $last_timestamp = 0; - my $output; - my $filters_that_did_nothing; - my $key; - my $time_colour; - our $no_special_header_highlighting; - $time_colour = paint_it('white'); - my %log_level_count; - - my %log_level_handlers = ( - 'Re-Filter' => &handle_loglevel_re_filter, - 'Header' => &handle_loglevel_header, - 'Connect' => &handle_loglevel_connect, - 'Redirect' => &handle_loglevel_redirect, - 'Request' => &handle_loglevel_request, - 'Crunch' => &handle_loglevel_crunch, - 'Gif-Deanimate' => &handle_loglevel_gif_deanimate, - 'Info' => &handle_loglevel_info, - 'CGI' => &handle_loglevel_cgi, - 'Force' => &handle_loglevel_force, - 'Error' => &handle_loglevel_ignore, - 'Fatal error' => &handle_loglevel_ignore, - 'Writing' => &handle_loglevel_ignore, - ); - - while (<>) { - - $output = ''; - - if (m/^(\w{3} \d{2}) (\d\d:\d\d:\d\d).?(\d+)? (?:Privoxy()?([^)\s]*)[)]? ([\w -]*): (.*)$/) { - # XXX: Put in req hash? - $day = $1; - $time_stamp = $2; - $msecs = $3 ? $3 : 0; # Only the cool kids have micro second resolution - $log_level = $5; - $content = $c = $6; - $thread = $t = $4; - - $req{$t}{'day'} = $day; - $req{$t}{'time-stamp'} = $time_stamp; - $req{$t}{'msecs'} = $msecs; # Only the cool kids have micro second resolution; - $req{$t}{'log-level'} = $log_level; - $req{$t}{'content'} = $content; - $req{$t}{'log-message'} = $_; - $no_special_header_highlighting = 0; - - $log_level_count{$log_level}++; - - if (defined($log_level_handlers{$log_level})) { - - $content = $log_level_handlers{$log_level}($content); - - } else { - - die "No handler found for log level "$log_level"\n"; - - } - - # Highlight Truncations - if (m/... [(too long, truncated)/) { - $content =~ s@($1)@$h{'Truncation'}$1$h{'Standard'}@g; - } - - next unless $content; - - # Register threads to keep the colour constant - if (!defined($thread_colours{$thread})) { - $thread_colours{$thread} = $all_colours[$thread_colour_index % @all_colours]; - $thread_colour_index++; - } - - # Switch timestamp colour if timestamps differ - if ($msecs != $last_msecs || !($time_stamp =~ m/$last_timestamp/)) { - debug_message("Tick tack!") if DEBUG_TICKS; - $time_colour = $time_colours[$time_colour_index % 2]; - $time_colour_index++ - } - - $last_msecs = $msecs; - $last_thread = $thread; - $last_timestamp = $time_stamp; - - print_non_clf_message($content); - - } elsif (m/^(\d+.\d+.\d+.\d+) - - [(.*)] "(.*)" (\d+) (\d+)/) { - - # LOG_LEVEL_CLF lines look like this - # 61.152.239.32 - - [04/Mar/2007:18:28:23 +0100] "GET \ - # http://ad.yieldmanager.com/imp?z=1&Z=120x600&s=109339&u=http%3A%... - # HTTP/1.1" 403 1730 - our ($ip, $timestamp, $request_line, $status_code, $size) = ($1, $2, $3, $4, $5); - - print_clf_message(); - - } else { - - # Some Privoxy log messages span more than one line, - # usually to dump lots of content that doesn't need any syntax highlighting. - # XXX: add mechanism to forward these lines to the right handler anyway. - chomp(); - unless (DEBUG_SUPPRESS_LOG_MESSAGES or (SUPPRESS_EMPTY_LINES and m/^\s+$/)) { - print and print get_line_end(); # unless (SUPPRESS_EMPTY_LINES and m/^\s+$/); - } - } - } - - if (cli_option_is_set('statistic')) { - foreach (keys %log_level_count) { - print $_ . ": " . $log_level_count{$_} . " "; - } - } -} - -sub VersionMessage { - my $version_message; - - $version_message .= 'Privoxy-Log-Parser ' . PRIVOXY_LOG_PARSER_VERSION . "\n"; - $version_message .= 'Copyright (C) 2007-2009 Fabian Keil fk@fabiankeil.de' . "\n"; - $version_message .= 'http://www.fabiankeil.de/sourcecode/privoxy-log-parser/' . "\n"; - - print $version_message; -} - -sub get_cli_options () { - - our %cli_options = ( - 'html-output' => CLI_OPTION_DEFAULT_TO_HTML_OUTPUT, - 'title' => CLI_OPTION_TITLE, - 'no-syntax-highlighting' => CLI_OPTION_NO_SYNTAX_HIGHLIGHTING, - 'no-embedded-css' => CLI_OPTION_NO_EMBEDDED_CSS, - 'no-msecs' => CLI_OPTION_NO_MSECS, - 'show-ineffective-filters' => CLI_OPTION_SHOW_INEFFECTIVE_FILTERS, - 'accept-unknown-messages' => CLI_OPTION_ACCEPT_UNKNOWN_MESSAGES, - 'statistic' => CLI_OPTION_STATISTIC, - ); - - GetOptions ( - 'html-output' => $cli_options{'html-output'}, - 'title' => $cli_options{'title'}, - 'no-syntax-highlighting' => $cli_options{'no-syntax-highlighting'}, - 'no-embedded-css' => $cli_options{'no-embedded-css'}, - 'no-msecs' => $cli_options{'no-msecs'}, - 'show-ineffective-filters' => $cli_options{'show-ineffective-filters'}, - 'accept-unknown-messages' => $cli_options{'accept-unknown-messages'}, - 'statistic' => $cli_options{'statistic'}, - 'version' => sub { VersionMessage && exit(0) } - ); -} - - - -################################################################################ -# main -################################################################################ -sub main () { - - get_cli_options(); - set_background(DEFAULT_BACKGROUND); - prepare_our_stuff(); - - print_intro(); - - parse_loop(); - - print_outro(); -} - -main(); - -=head1 NAME - -B<privoxy-log-parser> - A parser and syntax-highlighter for Privoxy log messages - -=head1 SYNOPSIS - -B<privoxy-log-parser> [B<--accept-unknown-messages>] [B<--html-output>] -[B<--no-msecs>] [B<--no-syntax-higlighting>] [B<--show-ineffective-filters>] -[B<--version>] - -=head1 DESCRIPTION - -B<privoxy-log-parser> reads Privoxy log messages and - -- syntax-highlights recognized lines, - -- reformats some of them for easier comprehension, - -- filters out less useful messages, and - -- (in some cases) calculates additional information, - like the compression ratio or how a filter affected - the content size. - -With B<privoxy-log-parser> you should be able to increase Privoxy's log level -without getting confused by the resulting amount of output. For example for -"debug 64" B<privoxy-log-parser> will (by default) only show messages that -affect the content. If a filter doesn't cause any hits, B<privoxy-log-parser> -will hide the "filter foo caused 0 hits" message. - -=head1 OPTIONS - -[B<--accept-unknown-messages>] Don't print warnings in case of unknown messages, -just don't highlight them. - -[B<--html-output>] Use HTML and CSS for the syntax highlighting. If this option is -omitted, ANSI escape sequences are used unless B<--no-syntax-highlighting> is active. -This option is only intended to make embedding log excerpts in web pages easier. -It does not excape any input! - -[B<--no-msecs>] Don't expect milisecond resolution - -[B<--no-syntax-highlighting>] Disable syntax-highlighting. Useful when -the filtered output is piped into less in which case the ANSI control -codes don't work, or if the terminal itself doesn't support the control -codes. - -[B<--show-ineffective-filters>] Don't suppress log lines for filters -that didn't modify the content. - -[B<--version>] Print version and exit. - -=head1 EXAMPLES - -To monitor a log file: - -tail -F /usr/jails/privoxy-jail/var/log/privoxy/privoxy.log | B<privoxy-log-parser> - -Replace '-F' with '-f' if your tail implementation lacks '-F' support -or if the log won't get rotated anyway. The log file location depends -on your system (Doh!). - -To monitor Privoxy without having it write to a log file: - -privoxy --no-daemon /usr/jails/privoxy-jail/usr/local/etc/privoxy/config 2>&1 | B<privoxy-log-parser> - -Again, the config file location depends on your system. Output redirection -depends on your shell, the above works with bourne shells. - -To read a processed Privoxy log file from top to bottom, letting the content -scroll by slightly faster than you can read: - -B<privoxy-log-parser> < /usr/jails/privoxy-jail/var/log/privoxy/privoxy.log - -This is probably only useful to fill screens in the background of haxor movies. - -=head1 CAVEATS - -Syntax highlighting with ANSI escape sequences will look strange -if your background color isn't black. - -Some messages aren't recognized yet and will not be fully highlighted. - -B<privoxy-log-parser> is developed with Privoxy 3.0.7 or later in mind, -using earlier Privoxy versions will probably result in an increased amount -of unrecognized log lines. - -Privoxy's log files tend to be rather large. If you use HTML -highlighting some browsers can't handle them, get confused and -will eventually crash because of segmentation faults or unexpected -exceptions. This is a problem in the browser and not B<privoxy-log-parser>'s -fault. - -=head1 BUGS - -Many settings can't be controlled through command line options yet. - -=head1 SEE ALSO - -privoxy(1) - -=head1 AUTHOR - -Fabian Keil fk@fabiankeil.de - -=cut diff --git a/external/privoxy/tools/privoxy-regression-test.pl b/external/privoxy/tools/privoxy-regression-test.pl deleted file mode 100755 index c7269b7..0000000 --- a/external/privoxy/tools/privoxy-regression-test.pl +++ /dev/null @@ -1,1754 +0,0 @@ -#!/usr/bin/perl - -############################################################################ -# -# Privoxy-Regression-Test -# -# A regression test "framework" for Privoxy. For documentation see: -# perldoc privoxy-regression-test.pl -# -# $Id: privoxy-regression-test.pl,v 1.34 2009/02/27 18:35:22 fabiankeil Exp $ -# -# Wish list: -# -# - Update documentation -# - Validate HTTP times. -# - Implement a HTTP_VERSION directive or allow to -# specify whole request lines. -# - Support filter regression tests. -# - Document magic Expect Header values -# - Internal fuzz support? -# -# Copyright (c) 2007-2009 Fabian Keil fk@fabiankeil.de -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# -############################################################################ - -use warnings; -use strict; -use Getopt::Long; - -use constant { - PRT_VERSION => 'Privoxy-Regression-Test 0.3', - - CURL => 'curl', - - # CLI option defaults - CLI_RETRIES => 1, - CLI_LOOPS => 1, - CLI_MAX_TIME => 5, - CLI_MIN_LEVEL => 0, - # XXX: why limit at all? - CLI_MAX_LEVEL => 100, - CLI_FORKS => 0, - - PRIVOXY_CGI_URL => 'http://p.p/', - FELLATIO_URL => 'http://127.0.0.1:8080/', - LEADING_LOG_DATE => 1, - LEADING_LOG_TIME => 1, - - DEBUG_LEVEL_FILE_LOADING => 0, - DEBUG_LEVEL_PAGE_FETCHING => 0, - DEBUG_LEVEL_VERBOSE_FAILURE => 1, - # XXX: Only partly implemented and mostly useless. - DEBUG_LEVEL_VERBOSE_SUCCESS => 0, - DEBUG_LEVEL_STATUS => 1, - - VERBOSE_TEST_DESCRIPTION => 1, - - # Internal use, don't modify - # Available debug bits: - LL_ERROR => 1, - LL_VERBOSE_FAILURE => 2, - LL_PAGE_FETCHING => 4, - LL_FILE_LOADING => 8, - LL_VERBOSE_SUCCESS => 16, - LL_STATUS => 32, - LL_SOFT_ERROR => 64, - - CLIENT_HEADER_TEST => 1, - SERVER_HEADER_TEST => 2, - DUMB_FETCH_TEST => 3, - METHOD_TEST => 4, - STICKY_ACTIONS_TEST => 5, - TRUSTED_CGI_REQUEST => 6, - BLOCK_TEST => 7, -}; - -sub init_our_variables () { - - our $leading_log_time = LEADING_LOG_TIME; - our $leading_log_date = LEADING_LOG_DATE; - - our $privoxy_cgi_url = PRIVOXY_CGI_URL; - - our $verbose_test_description = VERBOSE_TEST_DESCRIPTION; - - our $log_level = get_default_log_level(); - -} - -sub get_default_log_level () { - - my $log_level = 0; - - $log_level |= LL_FILE_LOADING if DEBUG_LEVEL_FILE_LOADING; - $log_level |= LL_PAGE_FETCHING if DEBUG_LEVEL_PAGE_FETCHING; - $log_level |= LL_VERBOSE_FAILURE if DEBUG_LEVEL_VERBOSE_FAILURE; - $log_level |= LL_VERBOSE_SUCCESS if DEBUG_LEVEL_VERBOSE_SUCCESS; - $log_level |= LL_STATUS if DEBUG_LEVEL_STATUS; - - # These are intended to be always on. - $log_level |= LL_SOFT_ERROR; - $log_level |= LL_ERROR; - - return $log_level; -} - -############################################################################ -# -# File loading functions -# -############################################################################ - -sub parse_tag ($) { - - my $tag = shift; - - # Remove anchors - $tag =~ s@[$^]@@g; - # Unescape brackets and dots - $tag =~ s@\(?=[{}().+])@@g; - - # log_message("Parsed tag: " . $tag); - - check_for_forbidden_characters($tag); - - return $tag; -} - -sub check_for_forbidden_characters ($) { - - my $tag = shift; # XXX: also used to check values though. - my $allowed = '[-=\dA-Za-z~{}:./();\s,+@"_%?&*^]'; - - unless ($tag =~ m/^$allowed*$/) { - my $forbidden = $tag; - $forbidden =~ s@^$allowed*(.).*@$1@; - - l(LL_ERROR, "'" . $tag . "' contains character '" . $forbidden. "' which is unacceptable."); - } -} - -sub load_regressions_tests () { - - our $privoxy_cgi_url; - our @privoxy_config; - our %privoxy_features; - my @actionfiles; - my $curl_url = ''; - my $file_number = 0; - my $feature; - - $curl_url .= $privoxy_cgi_url; - $curl_url .= 'show-status'; - - l(LL_STATUS, "Asking Privoxy for the number of action files available ..."); - - foreach (@{get_cgi_page_or_else($curl_url)}) { - - chomp; - if (/<td>(.*?)</td><td class="buttons"><a href="/show-status?file=actions&index=(\d+)">/) { - - my $url = $privoxy_cgi_url . 'show-status?file=actions&index=' . $2; - $actionfiles[$file_number++] = $url; - - } elsif (m@config.html#.*">([^<]*)</a>\s+(.*)<br>@) { - - my $directive = $1 . " " . $2; - push (@privoxy_config, $directive); - - } elsif (m@<td><code>([^<]*)</code></td>@) { - - $feature = $1; - - } elsif (m@<td> (Yes|No) </td>@) { - - $privoxy_features{$feature} = $1 if defined $feature; - $feature = undef; - } - } - - l(LL_FILE_LOADING, "Recognized " . @actionfiles . " actions files"); - - load_action_files(@actionfiles); -} - -sub token_starts_new_test ($) { - - my $token = shift; - my @new_test_directives = ('set header', 'fetch test', - 'trusted cgi request', 'request header', 'method test', - 'blocked url', 'url'); - - foreach my $new_test_directive (@new_test_directives) { - return 1 if $new_test_directive eq $token; - } - - return 0; -} - -sub tokenize ($) { - - my ($token, $value) = (undef, undef); - - # Remove leading and trailing white space. - s@^\s*@@; - s@\s*$@@; - - # Reverse HTML-encoding - # XXX: Seriously imcomplete. - s@"@"@g; - s@&@&@g; - - # Tokenize - if (/^#\s*([^=:]*?)\s*[=]\s*(.+?)\s*$/) { - - $token = $1; - $value = $2; - - $token =~ s@\s\s+@ @g; - $token =~ tr/[A-Z]/[a-z]/; - - } elsif (/^TAG\s*:(.*)$/) { - - $token = 'tag'; - $value = $1; - } - - return ($token, $value); -} - -sub enlist_new_test ($$$$$$) { - - my ($regression_tests, $token, $value, $si, $ri, $number) = @_; - my $type; - - if ($token eq 'set header') { - - l(LL_FILE_LOADING, "Header to set: " . $value); - $type = CLIENT_HEADER_TEST; - - } elsif ($token eq 'request header') { - - l(LL_FILE_LOADING, "Header to request: " . $value); - $type = SERVER_HEADER_TEST; - $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - - } elsif ($token eq 'trusted cgi request') { - - l(LL_FILE_LOADING, "CGI URL to test in a dumb way: " . $value); - $type = TRUSTED_CGI_REQUEST; - $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - - } elsif ($token eq 'fetch test') { - - l(LL_FILE_LOADING, "URL to test in a dumb way: " . $value); - $type = DUMB_FETCH_TEST; - $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - - } elsif ($token eq 'method test') { - - l(LL_FILE_LOADING, "Method to test: " . $value); - $type = METHOD_TEST; - $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - - } elsif ($token eq 'blocked url') { - - l(LL_FILE_LOADING, "URL to block-test: " . $value); - $type = BLOCK_TEST; - - } elsif ($token eq 'url') { - - l(LL_FILE_LOADING, "Sticky URL to test: " . $value); - $type = STICKY_ACTIONS_TEST; - - } else { - - die "Incomplete '" . $token . "' support detected."; - } - - $$regression_tests[$si][$ri]{'type'} = $type; - $$regression_tests[$si][$ri]{'level'} = $type; - - check_for_forbidden_characters($value); - - $$regression_tests[$si][$ri]{'data'} = $value; - - # For function that only get passed single tests - $$regression_tests[$si][$ri]{'section-id'} = $si; - $$regression_tests[$si][$ri]{'regression-test-id'} = $ri; - $$regression_tests[$si][$ri]{'number'} = $number - 1; - l(LL_FILE_LOADING, - "Regression test " . $number . " (section:" . $si . "):"); -} - -sub load_action_files ($) { - - # initialized here - our %actions; - our @regression_tests; - - my $actionfiles_ref = shift; - my @actionfiles = @{$actionfiles_ref}; - - my $si = 0; # Section index - my $ri = -1; # Regression test index - my $count = 0; - - my $ignored = 0; - - l(LL_STATUS, "Gathering regression tests from " . - @actionfiles . " action file(s) delivered by Privoxy."); - - for my $file_number (0 .. @actionfiles - 1) { - - my $curl_url = ' "' . $actionfiles[$file_number] . '"'; - my $actionfile = undef; - my $sticky_actions = undef; - - foreach (@{get_cgi_page_or_else($curl_url)}) { - - my $no_checks = 0; - chomp; - - if (/<h2>Contents of Actions File (.*?)</) { - $actionfile = $1; - next; - } - next unless defined $actionfile; - - last if (/</pre>/); - - my ($token, $value) = tokenize($_); - - next unless defined $token; - - # Load regression tests - - if (token_starts_new_test($token)) { - - # Beginning of new regression test. - $ri++; - $count++; - enlist_new_test(@regression_tests, $token, $value, $si, $ri, $count); - } - - if ($token =~ /level\s+(\d+)/i) { - - my $level = $1; - register_dependency($level, $value); - } - - if ($token eq 'sticky actions') { - - # Will be used by each following Sticky URL. - $sticky_actions = $value; - if ($sticky_actions =~ /{[^}]*\s/) { - l(LL_ERROR, - "'Sticky Actions' with whitespace inside the " . - "action parameters are currently unsupported."); - } - } - - if ($si == -1 || $ri == -1) { - # No beginning of a test detected yet, - # so we don't care about any other test - # attributes. - next; - } - - if ($token eq 'expect header') { - - l(LL_FILE_LOADING, "Detected expectation: " . $value); - $regression_tests[$si][$ri]{'expect-header'} = $value; - - } elsif ($token eq 'tag') { - - next if ($ri == -1); - - my $tag = parse_tag($value); - - # We already checked in parse_tag() after filtering - $no_checks = 1; - - l(LL_FILE_LOADING, "Detected TAG: " . $tag); - - # Save tag for all tests in this section - do { - $regression_tests[$si][$ri]{'tag'} = $tag; - } while ($ri-- > 0); - - $si++; - $ri = -1; - - } elsif ($token eq 'ignore' && $value =~ /Yes/i) { - - l(LL_FILE_LOADING, "Ignoring section: " . test_content_as_string($regression_tests[$si][$ri])); - $regression_tests[$si][$ri]{'ignore'} = 1; - $ignored++; - - } elsif ($token eq 'expect status code') { - - l(LL_FILE_LOADING, "Expecting status code: " . $value); - $regression_tests[$si][$ri]{'expected-status-code'} = $value; - - } elsif ($token eq 'level') { # XXX: stupid name - - $value =~ s@(\d+).*@$1@; - l(LL_FILE_LOADING, "Level: " . $value); - $regression_tests[$si][$ri]{'level'} = $value; - - } elsif ($token eq 'method') { - - l(LL_FILE_LOADING, "Method: " . $value); - $regression_tests[$si][$ri]{'method'} = $value; - - } elsif ($token eq 'url') { - - if (defined $sticky_actions) { - die "WTF? Attempted to overwrite Sticky Actions" - if defined ($regression_tests[$si][$ri]{'sticky-actions'}); - - l(LL_FILE_LOADING, "Sticky actions: " . $sticky_actions); - $regression_tests[$si][$ri]{'sticky-actions'} = $sticky_actions; - } else { - l(LL_ERROR, "Sticky URL without Sticky Actions: $value"); - } - - } else { - - # We don't use it, so we don't need - $no_checks = 1; - } - # XXX: Neccessary? - check_for_forbidden_characters($value) unless $no_checks; - check_for_forbidden_characters($token); - } - } - - l(LL_FILE_LOADING, "Done loading " . $count . " regression tests." - . " Of which " . $ignored. " will be ignored)\n"); -} - -############################################################################ -# -# Regression test executing functions -# -############################################################################ - -sub execute_regression_tests () { - - our @regression_tests; - my $loops = get_cli_option('loops'); - my $all_tests = 0; - my $all_failures = 0; - my $all_successes = 0; - - unless (@regression_tests) { - - l(LL_STATUS, "No regression tests found."); - return; - } - - l(LL_STATUS, "Executing regression tests ..."); - - while ($loops-- > 0) { - - my $successes = 0; - my $tests = 0; - my $failures; - my $skipped = 0; - - for my $s (0 .. @regression_tests - 1) { - - my $r = 0; - - while (defined $regression_tests[$s][$r]) { - - die "Section id mismatch" if ($s != $regression_tests[$s][$r]{'section-id'}); - die "Regression test id mismatch" if ($r != $regression_tests[$s][$r]{'regression-test-id'}); - - my $number = $regression_tests[$s][$r]{'number'}; - my $skip_reason = undef; - - if ($regression_tests[$s][$r]{'ignore'}) { - - $skip_reason = "Ignore flag is set"; - - } elsif (cli_option_is_set('test-number') - and get_cli_option('test-number') != $number) { - - $skip_reason = "Only executing test " . get_cli_option('test-number'); - - } else { - - $skip_reason = level_is_unacceptable($regression_tests[$s][$r]{'level'}); - } - - if (defined $skip_reason) { - - my $message = "Skipping test " . $number . ": " . $skip_reason . "."; - log_message($message) if (cli_option_is_set('verbose') or - cli_option_is_set('show-skipped-tests')); - $skipped++; - - } else { - - my $result = execute_regression_test($regression_tests[$s][$r]); - - log_result($regression_tests[$s][$r], $result, $tests); - - $successes += $result; - $tests++; - } - $r++; - } - } - $failures = $tests - $successes; - - log_message("Executed " . $tests . " regression tests. " . - 'Skipped ' . $skipped . '. ' . - $successes . " successes, " . $failures . " failures."); - - $all_tests += $tests; - $all_failures += $failures; - $all_successes += $successes; - - } - - if (get_cli_option('loops') > 1) { - log_message("Total: Executed " . $all_tests . " regression tests. " . - $all_successes . " successes, " . $all_failures . " failures."); - } -} - -sub level_is_unacceptable ($) { - my $level = shift; - my $min_level = get_cli_option('min-level'); - my $max_level = get_cli_option('max-level'); - my $required_level = cli_option_is_set('level') ? - get_cli_option('level') : $level; - my $reason = undef; - - if ($required_level != $level) { - - $reason = "Level doesn't match (" . $level . - " != " . $required_level . ")" - - } elsif ($level < $min_level) { - - $reason = "Level to low (" . $level . " < " . $min_level . ")"; - - } elsif ($level > $max_level) { - - $reason = "Level to high (" . $level . " > " . $max_level . ")"; - - } else { - - $reason = dependency_unsatisfied($level); - } - - return $reason; -} - -sub dependency_unsatisfied ($) { - - my $level = shift; - our %dependencies; - our @privoxy_config; - our %privoxy_features; - - my $dependency_problem = undef; - - if (defined ($dependencies{$level}{'config line'})) { - - my $dependency = $dependencies{$level}{'config line'}; - $dependency_problem = "depends on config line matching: '" . $dependency . "'"; - - foreach (@privoxy_config) { - - $dependency_problem = undef if (/$dependency/); - last; # XXX: this looks ... interesting. - } - - } elsif (defined ($dependencies{$level}{'feature status'})) { - - my $dependency = $dependencies{$level}{'feature status'}; - my ($feature, $status) = $dependency =~ /([^\s]*)\s+(Yes|No)/; - - unless (defined($privoxy_features{$feature}) - and ($privoxy_features{$feature} eq $status)) - { - $dependency_problem = "depends on '" . $feature . - "' being set to '" . $status . "'"; - } - } - - return $dependency_problem; -} - -sub register_dependency ($$) { - - my $level = shift; - my $dependency = shift; - our %dependencies; - - if ($dependency =~ /config line\s+(.*)/) { - - $dependencies{$level}{'config line'} = $1; - - } elsif ($dependency =~ /feature status\s+(.*)/) { - - $dependencies{$level}{'feature status'} = $1; - - } -} - -# XXX: somewhat misleading name -sub execute_regression_test ($) { - - my $test_ref = shift; - my %test = %{$test_ref}; - my $result = 0; - - if ($test{'type'} == CLIENT_HEADER_TEST) { - - $result = execute_client_header_regression_test($test_ref); - - } elsif ($test{'type'} == SERVER_HEADER_TEST) { - - $result = execute_server_header_regression_test($test_ref); - - } elsif ($test{'type'} == DUMB_FETCH_TEST - or $test{'type'} == TRUSTED_CGI_REQUEST) { - - $result = execute_dumb_fetch_test($test_ref); - - } elsif ($test{'type'} == METHOD_TEST) { - - $result = execute_method_test($test_ref); - - } elsif ($test{'type'} == BLOCK_TEST) { - - $result = execute_block_test($test_ref); - - } elsif ($test{'type'} == STICKY_ACTIONS_TEST) { - - $result = execute_sticky_actions_test($test_ref); - - } else { - - die "Unsupported test type detected: " . $test{'type'}; - } - - return $result; -} - -sub execute_method_test ($) { - - my $test_ref = shift; - my %test = %{$test_ref}; - my $buffer_ref; - my $status_code; - my $method = $test{'data'}; - - my $curl_parameters = ''; - my $expected_status_code = $test{'expected-status-code'}; - - $curl_parameters .= '--request ' . $method . ' '; - # Don't complain about the 'missing' body - $curl_parameters .= '--head ' if ($method =~ /^HEAD$/i); - - $curl_parameters .= PRIVOXY_CGI_URL; - - $buffer_ref = get_page_with_curl($curl_parameters); - $status_code = get_status_code($buffer_ref); - - return check_status_code_result($status_code, $expected_status_code); -} - -sub execute_dumb_fetch_test ($) { - - my $test_ref = shift; - my %test = %{$test_ref}; - my $buffer_ref; - my $status_code; - - my $curl_parameters = ''; - my $expected_status_code = $test{'expected-status-code'}; - - if (defined $test{method}) { - $curl_parameters .= '--request ' . $test{method} . ' '; - } - if ($test{type} == TRUSTED_CGI_REQUEST) { - $curl_parameters .= '--referer ' . PRIVOXY_CGI_URL . ' '; - } - - $curl_parameters .= $test{'data'}; - - $buffer_ref = get_page_with_curl($curl_parameters); - $status_code = get_status_code($buffer_ref); - - return check_status_code_result($status_code, $expected_status_code); -} - -sub execute_block_test ($) { - - my $test = shift; - my $url = $test->{'data'}; - my $final_results = get_final_results($url); - - return defined $final_results->{'+block'}; -} - -sub execute_sticky_actions_test ($) { - - my $test = shift; - my $url = $test->{'data'}; - my $verified_actions = 0; - # XXX: splitting currently doesn't work for actions whose parameters contain spaces. - my @sticky_actions = split(/\s+/, $test->{'sticky-actions'}); - my $final_results = get_final_results($url); - - foreach my $sticky_action (@sticky_actions) { - if (defined $final_results->{$sticky_action}) { - # Exact match - $verified_actions++; - }elsif ($sticky_action =~ /-.*{/ and - not defined $final_results->{$sticky_action}) { - # Disabled multi actions aren't explicitly listed as - # disabled and thus have to be checked by verifying - # that they aren't enabled. - $verified_actions++; - } else { - l(LL_VERBOSE_FAILURE, - "Ooops. '$sticky_action' is not among the final results."); - } - } - - return $verified_actions == @sticky_actions; -} - -sub get_final_results ($) { - - my $url = shift; - my $curl_parameters = ''; - my %final_results = (); - my $final_results_reached = 0; - - die "Unacceptable characters in $url" if $url =~ m@[\'"]@; - # XXX: should be URL-encoded properly - $url =~ s@%@%25@g; - $url =~ s@\s@%20@g; - $url =~ s@&@%26@g; - $url =~ s@:@%3A@g; - $url =~ s@/@%2F@g; - - $curl_parameters .= quote(PRIVOXY_CGI_URL . 'show-url-info?url=' . $url); - - foreach (@{get_cgi_page_or_else($curl_parameters)}) { - - $final_results_reached = 1 if (m@<h2>Final results:</h2>@); - - next unless ($final_results_reached); - last if (m@</td>@); - - if (m@<br>([-+])<a.*>([^>]*)</a>(?: ({.*}))?@) { - my $action = $1.$2; - my $parameter = $3; - - if (defined $parameter) { - # In case the caller needs to check - # the action and its parameter - $final_results{$action . $parameter} = 1; - } - # In case the action doesn't have parameters - # or the caller doesn't care for the parameter. - $final_results{$action} = 1; - } - } - - return %final_results; -} - -sub check_status_code_result ($$) { - - my $status_code = shift; - my $expected_status_code = shift; - my $result = 0; - - unless (defined $status_code) { - - # XXX: should probably be caught earlier. - l(LL_VERBOSE_FAILURE, - "Ooops. We expected status code " . $expected_status_code . ", but didn't get any status code at all."); - - } elsif ($expected_status_code == $status_code) { - - $result = 1; - l(LL_VERBOSE_SUCCESS, - "Yay. We expected status code " . $expected_status_code . ", and received: " . $status_code . '.'); - - } elsif (cli_option_is_set('fuzzer-feeding') and $status_code == 123) { - - l(LL_VERBOSE_FAILURE, - "Oh well. Status code lost while fuzzing. Can't check if it was " . $expected_status_code . '.'); - - } else { - - l(LL_VERBOSE_FAILURE, - "Ooops. We expected status code " . $expected_status_code . ", but received: " . $status_code . '.'); - } - - return $result; -} - -sub execute_client_header_regression_test ($) { - - my $test_ref = shift; - my $buffer_ref; - my $header; - - $buffer_ref = get_show_request_with_curl($test_ref); - - $header = get_header($buffer_ref, $test_ref); - - return check_header_result($test_ref, $header); -} - -sub execute_server_header_regression_test ($) { - - my $test_ref = shift; - my $buffer_ref; - my $header; - - $buffer_ref = get_head_with_curl($test_ref); - - $header = get_server_header($buffer_ref, $test_ref); - - return check_header_result($test_ref, $header); -} - -sub interpret_result ($) { - my $success = shift; - return $success ? "Success" : "Failure"; -} - -sub check_header_result ($$) { - - my $test_ref = shift; - my $header = shift; - - my %test = %{$test_ref}; - my $expect_header = $test{'expect-header'}; - my $success = 0; - - if ($expect_header eq 'NO CHANGE') { - - if (defined($header) and $header eq $test{'data'}) { - - $success = 1; - - } else { - - $header = "REMOVAL" unless defined $header; - l(LL_VERBOSE_FAILURE, - "Ooops. Got: " . $header . " while expecting: " . $expect_header); - } - - } elsif ($expect_header eq 'REMOVAL') { - - if (defined($header) and $header eq $test{'data'}) { - - l(LL_VERBOSE_FAILURE, - "Ooops. Expected removal but: " . $header . " is still there."); - - } else { - - # XXX: Use more reliable check here and make sure - # the header has a different name. - $success = 1; - } - - } elsif ($expect_header eq 'SOME CHANGE') { - - if (defined($header) and not $header eq $test{'data'}) { - - $success = 1; - - } else { - - $header = "REMOVAL" unless defined $header; - l(LL_VERBOSE_FAILURE, - "Ooops. Got: " . $header . " while expecting: SOME CHANGE"); - } - - - } else { - - if (defined($header) and $header eq $expect_header) { - - $success = 1; - - } else { - - $header = "'No matching header'" unless defined $header; # XXX: No header detected to be precise - l(LL_VERBOSE_FAILURE, - "Ooops. Got: " . $header . " while expecting: " . $expect_header); - } - } - return $success; -} - -sub get_header_name ($) { - - my $header = shift; - - $header =~ s@(.*?: ).*@$1@; - - return $header; -} - -sub get_header ($$) { - - our $filtered_request = ''; - - my $buffer_ref = shift; - my $test_ref = shift; - - my %test = %{$test_ref}; - my @buffer = @{$buffer_ref}; - - my $expect_header = $test{'expect-header'}; - - die "get_header called with no expect header" unless defined $expect_header; - - my $line; - my $processed_request_reached = 0; - my $read_header = 0; - my $processed_request = ''; - my $header; - my $header_to_get; - - if ($expect_header eq 'REMOVAL' - or $expect_header eq 'NO CHANGE' - or $expect_header eq 'SOME CHANGE') { - - $expect_header = $test{'data'}; - - } - - $header_to_get = get_header_name($expect_header); - - foreach (@buffer) { - - # Skip everything before the Processed request - if (/Processed Request/) { - $processed_request_reached = 1; - next; - } - next unless $processed_request_reached; - - # End loop after the Processed request - last if (/</pre>/); - - # Ditch tags and leading/trailing white space. - s@^\s*<.*?>@@g; - s@\s*$@@g; - - # Decode characters we care about. - s@"@"@g; - - $filtered_request .= "\n" . $_; - - if (/^$header_to_get/) { - $read_header = 1; - $header = $_; - last; - } - } - - return $header; -} - -sub get_server_header ($$) { - - my $buffer_ref = shift; - my $test_ref = shift; - - my %test = %{$test_ref}; - my @buffer = @{$buffer_ref}; - - my $expect_header = $test{'expect-header'}; - my $header; - my $header_to_get; - - # XXX: Should be caught before starting to test. - l(LL_ERROR, "No expect header for test " . $test{'number'}) - unless defined $expect_header; - - if ($expect_header eq 'REMOVAL' - or $expect_header eq 'NO CHANGE' - or $expect_header eq 'SOME CHANGE') { - - $expect_header = $test{'data'}; - } - - $header_to_get = get_header_name($expect_header); - - foreach (@buffer) { - - # XXX: should probably verify that the request - # was actually answered by Fellatio. - if (/^$header_to_get/) { - $header = $_; - $header =~ s@\s*$@@g; - last; - } - } - - return $header; -} - -sub get_status_code ($) { - - my $buffer_ref = shift; - my @buffer = @{$buffer_ref}; - - foreach (@buffer) { - - if (/^HTTP/\d.\d (\d{3})/) { - - return $1; - - } else { - - return '123' if cli_option_is_set('fuzzer-feeding'); - chomp; - l(LL_ERROR, 'Unexpected buffer line: "' . $_ . '"'); - } - } -} - -sub get_test_keys () { - return ('tag', 'data', 'expect-header', 'ignore'); -} - -# XXX: incomplete -sub test_content_as_string ($) { - - my $test_ref = shift; - my %test = %{$test_ref}; - - my $s = "\n\t"; - - foreach my $key (get_test_keys()) { - $test{$key} = 'Not set' unless (defined $test{$key}); - } - - $s .= 'Tag: ' . $test{'tag'}; - $s .= "\n\t"; - $s .= 'Set header: ' . $test{'data'}; # XXX: adjust for other test types - $s .= "\n\t"; - $s .= 'Expected header: ' . $test{'expect-header'}; - $s .= "\n\t"; - $s .= 'Ignore: ' . $test{'ignore'}; - - return $s; -} - -sub fuzz_header($) { - my $header = shift; - my $white_space = int(rand(2)) - 1 ? " " : "\t"; - - $white_space = $white_space x (1 + int(rand(5))); - - # Only fuzz white space before the first quoted token. - # (Privoxy doesn't touch white space inside quoted tokens - # and modifying it would cause the tests to fail). - $header =~ s@(^[^"]*?)\s@$1$white_space@g; - - return $header; -} - -############################################################################ -# -# HTTP fetch functions -# -############################################################################ - -sub check_for_curl () { - my $curl = CURL; - l(LL_ERROR, "No curl found.") unless (`which $curl`); -} - -sub get_cgi_page_or_else ($) { - - my $cgi_url = shift; - my $content_ref = get_page_with_curl($cgi_url); - my $status_code = get_status_code($content_ref); - - if (200 != $status_code) { - - my $log_message = "Failed to fetch Privoxy CGI Page. " . - "Received status code ". $status_code . - " while only 200 is acceptable."; - - if (cli_option_is_set('fuzzer-feeding')) { - - $log_message .= " Ignored due to fuzzer feeding."; - l(LL_SOFT_ERROR, $log_message) - - } else { - - l(LL_ERROR, $log_message); - } - } - - return $content_ref; -} - -# XXX: misleading name -sub get_show_request_with_curl ($) { - - our $privoxy_cgi_url; - my $test_ref = shift; - my %test = %{$test_ref}; - - my $curl_parameters = ' '; - my $header = $test{'data'}; - - if (cli_option_is_set('header-fuzzing')) { - $header = fuzz_header($header); - } - - # Enable the action to test - $curl_parameters .= '-H 'X-Privoxy-Control: ' . $test{'tag'} . '' '; - # The header to filter - $curl_parameters .= '-H '' . $header . '' '; - - $curl_parameters .= ' '; - $curl_parameters .= $privoxy_cgi_url; - $curl_parameters .= 'show-request'; - - return get_cgi_page_or_else($curl_parameters); -} - -sub get_head_with_curl ($) { - - our $fellatio_url = FELLATIO_URL; - my $test_ref = shift; - my %test = %{$test_ref}; - - my $curl_parameters = ' '; - - # Enable the action to test - $curl_parameters .= '-H 'X-Privoxy-Control: ' . $test{'tag'} . '' '; - # The header to filter - $curl_parameters .= '-H 'X-Gimme-Head-With: ' . $test{'data'} . '' '; - $curl_parameters .= '--head '; - - $curl_parameters .= ' '; - $curl_parameters .= $fellatio_url; - - return get_page_with_curl($curl_parameters); -} - -sub get_page_with_curl ($) { - - our $proxy; - - my $parameters = shift; - my @buffer; - my $curl_line = CURL; - my $retries_left = get_cli_option('retries') + 1; - my $failure_reason; - - $curl_line .= ' --proxy ' . $proxy if (defined $proxy); - - # We want to see the HTTP status code - $curl_line .= " --include "; - # Let Privoxy emit two log messages less. - $curl_line .= ' -H 'Proxy-Connection:' ' unless $parameters =~ /Proxy-Connection:/; - $curl_line .= ' -H 'Connection: close' ' unless $parameters =~ /Connection:/; - # We don't care about fetch statistic. - $curl_line .= " -s "; - # We do care about the failure reason if any. - $curl_line .= " -S "; - # We want to advertise ourselves - $curl_line .= " --user-agent '" . PRT_VERSION . "' "; - # We aren't too patient - $curl_line .= " --max-time '" . get_cli_option('max-time') . "' "; - - $curl_line .= $parameters; - # XXX: still necessary? - $curl_line .= ' 2>&1'; - - l(LL_PAGE_FETCHING, "Executing: " . $curl_line); - - do { - @buffer = `$curl_line`; - - if ($?) { - $failure_reason = array_as_string(@buffer); - chomp $failure_reason; - l(LL_SOFT_ERROR, "Fetch failure: '" . $failure_reason . $! ."'"); - } - } while ($? && --$retries_left); - - unless ($retries_left) { - l(LL_ERROR, - "Running curl failed " . get_cli_option('retries') . - " times in a row. Last error: '" . $failure_reason . "'."); - } - - return @buffer; -} - - -############################################################################ -# -# Log functions -# -############################################################################ - -sub array_as_string ($) { - my $array_ref = shift; - my $string = ''; - - foreach (@{$array_ref}) { - $string .= $_; - } - - return $string; -} - -sub show_test ($) { - my $test_ref = shift; - log_message('Test is:' . test_content_as_string($test_ref)); -} - -# Conditional log -sub l ($$) { - our $log_level; - my $this_level = shift; - my $message = shift; - - return unless ($log_level & $this_level); - - if (LL_ERROR & $this_level) { - $message = 'Oh noes. ' . $message . ' Fatal error. Exiting.'; - } - - log_message($message); - - if (LL_ERROR & $this_level) { - exit; - } -} - -sub log_message ($) { - - my $message = shift; - - our $logfile; - our $no_logging; - our $leading_log_date; - our $leading_log_time; - - my $time_stamp = ''; - my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime time; - - if ($leading_log_date || $leading_log_time) { - - if ($leading_log_date) { - $year += 1900; - $mon += 1; - $time_stamp = sprintf("%i/%.2i/%.2i", $year, $mon, $mday); - } - - if ($leading_log_time) { - $time_stamp .= ' ' if $leading_log_date; - $time_stamp.= sprintf("%.2i:%.2i:%.2i", $hour, $min, $sec); - } - - $message = $time_stamp . ": " . $message; - } - - printf(STDERR "%s\n", $message); -} - -sub log_result ($$) { - - our $verbose_test_description; - our $filtered_request; - - my $test_ref = shift; - my $result = shift; - my $number = shift; - - my %test = %{$test_ref}; - my $message = ''; - - $message .= interpret_result($result); - $message .= " for test "; - $message .= $number; - $message .= '/'; - $message .= $test{'number'}; - $message .= '/'; - $message .= $test{'section-id'}; - $message .= '/'; - $message .= $test{'regression-test-id'}; - $message .= '.'; - - if ($verbose_test_description) { - - if ($test{'type'} == CLIENT_HEADER_TEST) { - - $message .= ' Header '; - $message .= quote($test{'data'}); - $message .= ' and tag '; - $message .= quote($test{'tag'}); - - } elsif ($test{'type'} == SERVER_HEADER_TEST) { - - $message .= ' Request Header '; - $message .= quote($test{'data'}); - $message .= ' and tag '; - $message .= quote($test{'tag'}); - - } elsif ($test{'type'} == DUMB_FETCH_TEST) { - - $message .= ' URL '; - $message .= quote($test{'data'}); - $message .= ' and expected status code '; - $message .= quote($test{'expected-status-code'}); - - } elsif ($test{'type'} == TRUSTED_CGI_REQUEST) { - - $message .= ' CGI URL '; - $message .= quote($test{'data'}); - $message .= ' and expected status code '; - $message .= quote($test{'expected-status-code'}); - - } elsif ($test{'type'} == METHOD_TEST) { - - $message .= ' HTTP method '; - $message .= quote($test{'data'}); - $message .= ' and expected status code '; - $message .= quote($test{'expected-status-code'}); - - } elsif ($test{'type'} == BLOCK_TEST) { - - $message .= ' Supposedly-blocked URL: '; - $message .= quote($test{'data'}); - - } elsif ($test{'type'} == STICKY_ACTIONS_TEST) { - - $message .= ' Sticky Actions: '; - $message .= quote($test{'sticky-actions'}); - $message .= ' and URL: '; - $message .= quote($test{'data'}); - - } else { - - die "Incomplete support for test type " . $test{'type'} . " detected."; - } - } - - log_message($message) if (!$result or cli_option_is_set('verbose')); -} - -sub quote ($) { - my $s = shift; - return ''' . $s . '''; -} - -sub print_version () { - printf PRT_VERSION . "\n" . 'Copyright (C) 2007-2009 Fabian Keil fk@fabiankeil.de' . "\n"; -} - -sub help () { - - our %cli_options; - - print_version(); - - print << " EOF" - -Options and their default values if they have any: - [--debug $cli_options{'debug'}] - [--forks $cli_options{'forks'}] - [--fuzzer-address] - [--fuzzer-feeding] - [--help] - [--header-fuzzing] - [--level] - [--loops $cli_options{'loops'}] - [--max-level $cli_options{'max-level'}] - [--max-time $cli_options{'max-time'}] - [--min-level $cli_options{'min-level'}] - [--privoxy-address] - [--retries $cli_options{'retries'}] - [--show-skipped-tests] - [--test-number] - [--verbose] - [--version] -see "perldoc $0" for more information - EOF - ; - exit(0); -} - -sub init_cli_options () { - - our %cli_options; - our $log_level; - - $cli_options{'debug'} = $log_level; - $cli_options{'forks'} = CLI_FORKS; - $cli_options{'loops'} = CLI_LOOPS; - $cli_options{'max-level'} = CLI_MAX_LEVEL; - $cli_options{'max-time'} = CLI_MAX_TIME; - $cli_options{'min-level'} = CLI_MIN_LEVEL; - $cli_options{'retries'} = CLI_RETRIES; -} - -sub parse_cli_options () { - - our %cli_options; - our $log_level; - - init_cli_options(); - - GetOptions ( - 'debug=s' => $cli_options{'debug'}, - 'forks=s' => $cli_options{'forks'}, - 'fuzzer-address=s' => $cli_options{'fuzzer-address'}, - 'fuzzer-feeding' => $cli_options{'fuzzer-feeding'}, - 'header-fuzzing' => $cli_options{'header-fuzzing'}, - 'help' => sub {help}, - 'level=s' => $cli_options{'level'}, - 'loops=s' => $cli_options{'loops'}, - 'max-level=s' => $cli_options{'max-level'}, - 'max-time=s' => $cli_options{'max-time'}, - 'min-level=s' => $cli_options{'min-level'}, - 'privoxy-address=s' => $cli_options{'privoxy-address'}, - 'retries=s' => $cli_options{'retries'}, - 'show-skipped-tests' => $cli_options{'show-skipped-tests'}, - 'test-number=s' => $cli_options{'test-number'}, - 'verbose' => $cli_options{'verbose'}, - 'version' => sub {print_version && exit(0)} - ); - $log_level |= $cli_options{'debug'}; -} - -sub cli_option_is_set ($) { - - our %cli_options; - my $cli_option = shift; - - return defined $cli_options{$cli_option}; -} - -sub get_cli_option ($) { - - our %cli_options; - my $cli_option = shift; - - die "Unknown CLI option: $cli_option" unless defined $cli_options{$cli_option}; - - return $cli_options{$cli_option}; -} - -sub init_proxy_settings($) { - - my $choice = shift; - our $proxy = undef; - - if (($choice eq 'fuzz-proxy') and cli_option_is_set('fuzzer-address')) { - $proxy = get_cli_option('fuzzer-address'); - } - - if ((not defined $proxy) or ($choice eq 'vanilla-proxy')) { - - if (cli_option_is_set('privoxy-address')) { - $proxy .= get_cli_option('privoxy-address'); - } - - } -} - -sub start_forks($) { - my $forks = shift; - - l(LL_ERROR, "Invalid --fork value: " . $forks . ".") if ($forks < 0); - - foreach my $fork (1 .. $forks) { - log_message("Starting fork $fork"); - my $pid = fork(); - if (defined $pid && !$pid) { - return; - } - } -} - -sub main () { - - init_our_variables(); - parse_cli_options(); - check_for_curl(); - init_proxy_settings('vanilla-proxy'); - load_regressions_tests(); - init_proxy_settings('fuzz-proxy'); - start_forks(get_cli_option('forks')) if cli_option_is_set('forks'); - execute_regression_tests(); -} - -main(); - -=head1 NAME - -B<privoxy-regression-test> - A regression test "framework" for Privoxy. - -=head1 SYNOPSIS - -B<privoxy-regression-test> [B<--debug bitmask>] [B<--forks> forks] -[B<--fuzzer-feeding>] [B<--fuzzer-feeding>] [B<--help>] [B<--level level>] -[B<--loops count>] [B<--max-level max-level>] [B<--max-time max-time>] -[B<--min-level min-level>] B<--privoxy-address proxy-address> -[B<--retries retries>] [B<--test-number test-number>] -[B<--show-skipped-tests>] [B<--verbose>] -[B<--version>] - -=head1 DESCRIPTION - -Privoxy-Regression-Test is supposed to one day become -a regression test suite for Privoxy. It's not quite there -yet, however, and can currently only test header actions, -check the returned status code for requests to arbitrary -URLs and verify which actions are applied to them. - -Client header actions are tested by requesting -Bhttp://p.p/show-request and checking whether -or not Privoxy modified the original request as expected. - -The original request contains both the header the action-to-be-tested -acts upon and an additional tagger-triggering header that enables -the action to test. - -Applied actions are checked through Bhttp://p.p/show-url-info. - -=head1 CONFIGURATION FILE SYNTAX - -Privoxy-Regression-Test's configuration is embedded in -Privoxy action files and loaded through Privoxy's web interface. - -It makes testing a Privoxy version running on a remote system easier -and should prevent you from updating your tests without updating Privoxy's -configuration accordingly. - -A client-header-action test section looks like this: - - # Set Header = Referer: http://www.example.org.zwiebelsuppe.exit/ - # Expect Header = Referer: http://www.example.org/ - {+client-header-filter{hide-tor-exit-notation} -hide-referer} - TAG:^client-header-filter{hide-tor-exit-notation}$ - -The example above causes Privoxy-Regression-Test to set -the header B<Referer: http://www.example.org.zwiebelsuppe.exit/%3E -and to expect it to be modified to -B<Referer: http://www.example.org/%3E. - -When testing this section, Privoxy-Regression-Test will set the header -B<X-Privoxy-Control: client-header-filter{hide-tor-exit-notation}> -causing the B<privoxy-control> tagger to create the tag -B<client-header-filter{hide-tor-exit-notation}> which will finally -cause Privoxy to enable the action section. - -Note that the actions itself are only used by Privoxy, -Privoxy-Regression-Test ignores them and will be happy -as long as the expectations are satisfied. - -A fetch test looks like this: - - # Fetch Test = http://p.p/user-manual - # Expect Status Code = 302 - -It tells Privoxy-Regression-Test to request Bhttp://p.p/user-manual -and to expect a response with the HTTP status code B<302>. Obviously that's -not a very thorough test and mainly useful to get some code coverage -for Valgrind or to verify that the templates are installed correctly. - -If you want to test CGI pages that require a trusted -referer, you can use: - - # Trusted CGI Request = http://p.p/edit-actions - -It works like ordinary fetch tests, but sets the referer -header to a trusted value. - -If no explicit status code expectation is set, B<200> is used. - -To verify that a URL is blocked, use: - - # Blocked URL = http://www.example.com/blocked - -To verify that a specific set of actions is applied to an URL, use: - - # Sticky Actions = +block{foo} +handle-as-empty-document -handle-as-image - # URL = http://www.example.org/my-first-url - -The sticky actions will be checked for all URLs below it -until the next sticky actions directive. - -=head1 TEST LEVELS - -All tests have test levels to let the user -control which ones to execute (see I<OPTIONS> below). -Test levels are either set with the B<Level> directive, -or implicitly through the test type. - -Block tests default to level 7, fetch tests to level 6, -"Sticky Actions" tests default to level 5, tests for trusted CGI -requests to level 3 and client-header-action tests to level 1. - -=head1 OPTIONS - -B<--debug bitmask> Add the bitmask provided as integer -to the debug settings. - -B<--forks forks> Number of forks to start before executing -the regression tests. This is mainly useful for stress-testing. - -B<--fuzzer-address> Listening address used when executing -the regression tests. Useful to make sure that the requests -to load the regression tests don't fail due to fuzzing. - -B<--fuzzer-feeding> Ignore some errors that would otherwise -cause Privoxy-Regression-Test to abort the test because -they shouldn't happen in normal operation. This option is -intended to be used if Privoxy-Regression-Test is only -used to feed a fuzzer in which case there's a high chance -that Privoxy gets an invalid request and returns an error -message. - -B<--help> Shows available command line options. - -B<--header-fuzzing> Modifies linear white space in -headers in a way that should not affect the test result. - -B<--level level> Only execute tests with the specified B<level>. - -B<--loop count> Loop through the regression tests B<count> times. -Useful to feed a fuzzer, or when doing stress tests with -several Privoxy-Regression-Test instances running at the same -time. - -B<--max-level max-level> Only execute tests with a B<level> -below or equal to the numerical B<max-level>. - -B<--max-time max-time> Give Privoxy B<max-time> seconds -to return data. Increasing the default may make sense when -Privoxy is run through Valgrind, decreasing the default may -make sense when Privoxy-Regression-Test is used to feed -a fuzzer. - -B<--min-level min-level> Only execute tests with a B<level> -above or equal to the numerical B<min-level>. - -B<--privoxy-address proxy-address> Privoxy's listening address. -If it's not set, the value of the environment variable http_proxy -will be used. B<proxy-address> has to be specified in http_proxy -syntax. - -B<--retries retries> Retry B<retries> times. - -B<--test-number test-number> Only run the test with the specified -number. - -B<--show-skipped-tests> Log skipped tests even if verbose mode is off. - -B<--verbose> Log succesful and skipped tests. - -B<--version> Print version and exit. - -The second dash is optional, options can be shortened, -as long as there are no ambiguities. - -=head1 PRIVOXY CONFIGURATION - -Privoxy-Regression-Test is shipped with B<regression-tests.action> -which aims to test all official client-header modifying actions -and can be used to verify that the templates and the user manual -files are installed correctly. - -To use it, it has to be copied in Privoxy's configuration -directory, and afterwards referenced in Privoxy's configuration -file with the line: - - actionsfile regression-tests.action - -In general, its tests are supposed to work without changing -any other action files, unless you already added lots of -taggers yourself. If you are using taggers that cause problems, -you might have to temporary disable them for Privoxy's CGI pages. - -Some of the regression tests rely on Privoxy features that -may be disabled in your configuration. Tests with a level below -7 are supposed to work with all Privoxy configurations (provided -you didn't build with FEATURE_GRACEFUL_TERMINATION). - -Tests with level 9 require Privoxy to deliver the User Manual, -tests with level 12 require the CGI editor to be enabled. - -=head1 CAVEATS - -Expect the configuration file syntax to change with future releases. - -=head1 LIMITATIONS - -As Privoxy's B<show-request> page only shows client headers, -Privoxy-Regression-Test can't use it to test Privoxy actions -that modify server headers. - -As Privoxy-Regression-Test relies on Privoxy's tag feature to -control the actions to test, it currently only works with -Privoxy 3.0.7 or later. - -At the moment Privoxy-Regression-Test fetches Privoxy's -configuration page through I<curl>(1), therefore you have to -have I<curl> installed, otherwise you won't be able to run -Privoxy-Regression-Test in a meaningful way. - -=head1 SEE ALSO - -privoxy(1) curl(1) - -=head1 AUTHOR - -Fabian Keil fk@fabiankeil.de - -=cut diff --git a/external/privoxy/tools/url-pattern-translator.pl b/external/privoxy/tools/url-pattern-translator.pl deleted file mode 100755 index a575333..0000000 --- a/external/privoxy/tools/url-pattern-translator.pl +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/perl - -############################################################################ -# -# url-pattern-translator -# -# Filters Privoxy action files and changes old-school URL patterns to -# use extended regular expressions for the host as well. -# -# While it works good enough to satisfy the regression tests in -# default.action.master, it isn't perfect and you should double-check -# the output and keep backups of your old action files. -# -# Usage: -# -# url-pattern-translator.pl old.action > new.action -# -# Only convert your files once, or, as RoboCop used to say, -# there will be... trouble. -# -# $Id: url-pattern-translator.pl,v 1.3 2009/01/13 17:01:04 fabiankeil Exp $ -# -# Copyright (c) 2008 Fabian Keil fk@fabiankeil.de -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# -############################################################################ - -use strict; -use warnings; - -sub p ($) { - my $message = shift; - print $message . "\n"; -} - -sub convert_host_pattern ($) { - my $host_pattern = shift; - my $hp = $host_pattern; - - $hp =~ s@\s@@g; - - if ($hp =~ m@^.@) { - # Not left-anchored - # - # XXX: This is somewhat ugly and while it's - # the equivalent pattern in most cases - # . should be good enough. - $hp =~ s@^.@(^|.)@; - } else { - # left-anchored - $hp = '^' . $hp; - } - - # Match-all syntax has changed ... - $hp =~ s@*@.*@g; - - # Extended host patterns are right-anchored by default - $hp =~ s@.$@(..*)?@; - - # Literal dots have to be escaped - $hp =~ s@((?<!\).[^*])@\$1@g; - - # Match single character with a dot. - $hp =~ s@(?<!))?@.@g; - - return $hp; -} - -sub looks_interesting($) { - my $line = shift; - my $type_to_skip = undef; - - if (/^\s*#/) { - - $type_to_skip = "comment"; - - } elsif (/[{}]/ or /\$/) { - - $type_to_skip = "action settings"; - - } elsif (m@^\s*$@) { - - $type_to_skip = "whitespace"; - - } elsif (m@^\s*TAG:@) { - - $type_to_skip = "tag patttern"; - - } elsif (m@^[^/]*=@) { - - $type_to_skip = "macro or version definition"; - - } elsif (m@^\s*standard.@) { - - $type_to_skip = "predefined settings"; - - } - - #p("Skipping " . $type_to_skip . ": " . $_) if defined $type_to_skip; - - return not defined $type_to_skip; -} - -sub main () { - my $host = undef; - my $path = undef; - - while (<>) { - chomp; - - if (looks_interesting($_)) { - if (m@^([^/]+)(/.*)$@) { - $host = $1; - $path = $2; - $host = convert_host_pattern($host); - $_ = $host . $path; - } - elsif (m@^([^/]*)$@) { - $host = $1; - $host = convert_host_pattern($host); - $_ = $host; - } - } - p($_); - } -} - -main(); diff --git a/external/privoxy/trust b/external/privoxy/trust deleted file mode 100644 index 5767363..0000000 --- a/external/privoxy/trust +++ /dev/null @@ -1,85 +0,0 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/trust,v $ -# -# $Id: trust,v 1.6 2007/05/14 17:19:42 fabiankeil Exp $ -# -# Purpose : Trustfiles are an experimental feature and can be used -# to build "whitelists" (versus the usual "blacklists" -# techniques). -# -# 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 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 tracker: -# http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=brow... -# -# 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. -# -###################################################################### -# -# Sample Trustfile for Privoxy - -# For this file to have any effect, the line in the main config file beginning -# with "trustfile" must be uncommented, with the name of this file following the -# word "trustfile". - -# Trustfiles are an experimental feature used for building "whitelists" -# of "trusted" sites (versus the usual "blacklists" technique). For more -# detail, see http://www.privoxy.org/user-manual/config.html#TRUSTFILE. - -# List trusted domains here. The default is to block any URL that is NOT -# referenced. Access to trusted domains includes all paths within that -# domain. - -# Preceding a domain with a '+' character will designate that domain -# as a "trusted referrer", meaning any requests whose HTTP "Referer" headers -# contain an URL from that domain will be allowed, and the previously untrusted -# host will be dynamically added to this file. Thus, this builds a "white-list" -# of hosts the user is allowed to visit. - -# Note this means that the file will grow with use! - -# Also note that you can only trust referrers if you control the user's -# system and make sure that there are no programs available that allow -# to set arbitrary headers. - -# Preceding the domain with '~' character allows access to that domain only -# (including all paths within that domain), but does not allow access to links -# to other, outside domains. Sites that are added dynamically by trusted -# referrers will include the '~' character, and thus do not become trusted -# referrers themselves. - -# Example: to allow example.com and to white-list domains that appear to -# be reached through links from example.com, uncomment this line: - -# +example.com - -# The next two lines make sure that the user can access Privoxy's -# CGI pages, without automatically trusting their links. - -~config.privoxy.org -~p.p diff --git a/external/privoxy/urlmatch.c b/external/privoxy/urlmatch.c deleted file mode 100644 index 47b607c..0000000 --- a/external/privoxy/urlmatch.c +++ /dev/null @@ -1,1452 +0,0 @@ -const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.47 2009/03/02 19:18:10 fabiankeil 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-2009 - * the 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.47 2009/03/02 19:18:10 fabiankeil - * Streamline parse_http_request()'s prototype. As - * cparser pointed out it doesn't actually use csp. - * - * Revision 1.46 2009/02/11 19:31:32 fabiankeil - * Reject request lines that end with neither HTTP/1.0 nor HTTP/1.1. - * - * Revision 1.45 2008/06/21 21:19:18 fabiankeil - * Silence bogus compiler warning. - * - * Revision 1.44 2008/05/04 16:18:32 fabiankeil - * Provide parse_http_url() with a third parameter to specify - * whether or not URLs without protocol are acceptable. - * - * Revision 1.43 2008/05/04 13:30:55 fabiankeil - * Streamline parse_http_url()'s prototype. - * - * Revision 1.42 2008/05/04 13:24:16 fabiankeil - * If the method isn't CONNECT, reject URLs without protocol. - * - * Revision 1.41 2008/05/02 09:51:34 fabiankeil - * In parse_http_url(), don't muck around with values - * that are none of its business: require an initialized - * http structure and never unset http->ssl. - * - * Revision 1.40 2008/04/23 16:12:28 fabiankeil - * Free with freez(). - * - * Revision 1.39 2008/04/22 16:27:42 fabiankeil - * In parse_http_request(), remove a pointless - * temporary variable and free the buffer earlier. - * - * Revision 1.38 2008/04/18 05:17:18 fabiankeil - * Mark simplematch()'s parameters as immutable. - * - * Revision 1.37 2008/04/17 14:53:29 fabiankeil - * Move simplematch() into urlmatch.c as it's only - * used to match (old-school) domain patterns. - * - * Revision 1.36 2008/04/14 18:19:48 fabiankeil - * Remove now-pointless cast in create_url_spec(). - * - * Revision 1.35 2008/04/14 18:11:21 fabiankeil - * The compiler might not notice it, but the buffer passed to - * create_url_spec() is modified later on and thus shouldn't - * be declared immutable. - * - * Revision 1.34 2008/04/13 13:32:07 fabiankeil - * Factor URL pattern compilation out of create_url_spec(). - * - * Revision 1.33 2008/04/12 14:03:13 fabiankeil - * Remove an obvious comment and improve another one. - * - * Revision 1.32 2008/04/12 12:38:06 fabiankeil - * Factor out duplicated code to compile host, path and tag patterns. - * - * Revision 1.31 2008/04/10 14:41:04 fabiankeil - * Ditch url_spec's path member now that it's no longer used. - * - * Revision 1.30 2008/04/10 04:24:24 fabiankeil - * Stop duplicating the plain text representation of the path regex - * (and keeping the copy around). Once the regex is compiled it's no - * longer useful. - * - * Revision 1.29 2008/04/10 04:17:56 fabiankeil - * In url_match(), check the right member for NULL when determining - * whether there's a path regex to execute. Looking for a plain-text - * representation works as well, but it looks "interesting" and that - * member will be removed soonish anyway. - * - * Revision 1.28 2008/04/08 16:07:39 fabiankeil - * Make it harder to mistake url_match()'s - * second parameter for an url_spec. - * - * Revision 1.27 2008/04/08 15:44:33 fabiankeil - * Save a bit of memory (and a few cpu cycles) by not bothering to - * compile slash-only path regexes that don't affect the result. - * - * Revision 1.26 2008/04/07 16:57:18 fabiankeil - * - Use free_url_spec() more consistently. - * - Let it reset url->dcount just in case. - * - * Revision 1.25 2008/04/06 15:18:38 fabiankeil - * Oh well, rename the --enable-pcre-host-patterns option to - * --enable-extended-host-patterns as it's not really PCRE syntax. - * - * Revision 1.24 2008/04/06 14:54:26 fabiankeil - * Use PCRE syntax in host patterns when configured - * with --enable-pcre-host-patterns. - * - * Revision 1.23 2008/04/05 12:19:20 fabiankeil - * Factor compile_host_pattern() out of create_url_spec(). - * - * Revision 1.22 2008/03/30 15:02:32 fabiankeil - * SZitify unknown_method(). - * - * Revision 1.21 2007/12/24 16:34:23 fabiankeil - * Band-aid (and micro-optimization) that makes it less likely to run out of - * stack space with overly-complex path patterns. Probably masks the problem - * reported by Lee in #1856679. Hohoho. - * - * Revision 1.20 2007/09/02 15:31:20 fabiankeil - * Move match_portlist() from filter.c to urlmatch.c. - * It's used for url matching, not for filtering. - * - * Revision 1.19 2007/09/02 13:42:11 fabiankeil - * - Allow port lists in url patterns. - * - Ditch unused url_spec member pathlen. - * - * Revision 1.18 2007/07/30 16:42:21 fabiankeil - * Move the method check into unknown_method() - * and loop through the known methods instead - * of using a screen-long OR chain. - * - * Revision 1.17 2007/04/15 16:39:21 fabiankeil - * Introduce tags as alternative way to specify which - * actions apply to a request. At the moment tags can be - * created based on client and server headers. - * - * Revision 1.16 2007/02/13 13:59:24 fabiankeil - * Remove redundant log message. - * - * Revision 1.15 2007/01/28 16:11:23 fabiankeil - * Accept WebDAV methods for subversion - * in parse_http_request(). Closes FR 1581425. - * - * Revision 1.14 2007/01/06 14:23:56 fabiankeil - * Fix gcc43 warnings. Mark *csp as immutable - * for parse_http_url() and url_match(). - * Replace a sprintf call with snprintf. - * - * Revision 1.13 2006/12/06 19:50:54 fabiankeil - * parse_http_url() now handles intercepted - * HTTP request lines as well. Moved parts - * of parse_http_url()'s code into - * init_domain_components() so that it can - * be reused in chat(). - * - * Revision 1.12 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.10.2.7 2003/05/17 15:57:24 oes - * - parse_http_url now checks memory allocation failure for - * duplication of "*" URL and rejects "*something" URLs - * Closes bug #736344 - * - Added a comment to what might look like a bug in - * create_url_spec (see !bug #736931) - * - Comment cosmetics - * - * Revision 1.10.2.6 2003/05/07 12:39:48 oes - * Fix typo: Default port for https URLs is 443, not 143. - * Thanks to Scott Tregear for spotting this one. - * - * Revision 1.10.2.5 2003/02/28 13:09:29 oes - * Fixed a rare double free condition as per Bug #694713 - * - * Revision 1.10.2.4 2003/02/28 12:57:44 oes - * Moved freeing of http request structure to its owner - * as per Dan Price's observations in Bug #694713 - * - * Revision 1.10.2.3 2002/11/12 16:50:40 oes - * Fixed memory leak in parse_http_request() reported by Oliver Stoeneberg. Fixes bug #637073 - * - * Revision 1.10.2.2 2002/09/25 14:53:15 oes - * Added basic support for OPTIONS and TRACE HTTP methods: - * parse_http_url now recognizes the "*" URI as well as - * the OPTIONS and TRACE method keywords. - * - * Revision 1.10.2.1 2002/06/06 19:06:44 jongfoster - * Adding support for proprietary Microsoft WebDAV extensions - * - * Revision 1.10 2002/05/12 21:40:37 jongfoster - * - Removing some unused code - * - * Revision 1.9 2002/04/04 00:36:36 gliptak - * always use pcre for matching - * - * Revision 1.8 2002/04/03 23:32:47 jongfoster - * Fixing memory leak on error - * - * Revision 1.7 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 <stdio.h> -#include <sys/types.h> -#endif - -#include <stdlib.h> -#include <ctype.h> -#include <assert.h> -#include <string.h> - -#if !defined(_WIN32) && !defined(__OS2__) -#include <unistd.h> -#endif - -#include "project.h" -#include "urlmatch.h" -#include "ssplit.h" -#include "miscutil.h" -#include "errlog.h" - -const char urlmatch_h_rcs[] = URLMATCH_H_VERSION; - -enum regex_anchoring {NO_ANCHORING, LEFT_ANCHORED, RIGHT_ANCHORED}; -static jb_err compile_host_pattern(struct url_spec *url, const char *host_pattern); - -/********************************************************************* - * - * 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 : init_domain_components - * - * Description : Splits the domain name so we can compare it - * against wildcards. It used to be part of - * parse_http_url, but was separated because the - * same code is required in chat in case of - * intercepted requests. - * - * Parameters : - * 1 : http = pointer to the http structure to hold elements. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out of memory - * JB_ERR_PARSE on malformed command/URL - * or >100 domains deep. - * - *********************************************************************/ -jb_err init_domain_components(struct http_request *http) -{ - char *vec[BUFFER_SIZE]; - size_t size; - char *p; - - http->dbuffer = strdup(http->host); - if (NULL == http->dbuffer) - { - return JB_ERR_MEMORY; - } - - /* map to lower case */ - for (p = http->dbuffer; *p ; p++) - { - *p = (char)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 - */ - log_error(LOG_LEVEL_ERROR, "More than SZ(vec) components in domain or none at all."); - return JB_ERR_PARSE; - } - - /* save a copy of the pointers in dvec */ - size = (size_t)http->dcount * sizeof(*http->dvec); - - http->dvec = (char **)malloc(size); - if (NULL == http->dvec) - { - return JB_ERR_MEMORY; - } - - memcpy(http->dvec, vec, size); - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * 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. - * Must be initialized with valid values (like NULLs). - * 3 : require_protocol = Whether or not URLs without - * protocol are acceptable. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out of memory - * JB_ERR_PARSE on malformed command/URL - * or >100 domains deep. - * - *********************************************************************/ -jb_err parse_http_url(const char *url, struct http_request *http, int require_protocol) -{ - int host_available = 1; /* A proxy can dream. */ - - /* - * Save our initial URL - */ - http->url = strdup(url); - if (http->url == NULL) - { - return JB_ERR_MEMORY; - } - - - /* - * Check for * URI. If found, we're done. - */ - if (*http->url == '*') - { - if ( NULL == (http->path = strdup("*")) - || NULL == (http->hostport = strdup("")) ) - { - return JB_ERR_MEMORY; - } - if (http->url[1] != '\0') - { - return JB_ERR_PARSE; - } - return JB_ERR_OK; - } - - - /* - * 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; - } - else if (strncmpic(url_noproto, "https://", 8) == 0) - { - /* - * Should only happen when called from cgi_show_url_info(). - */ - url_noproto += 8; - http->ssl = 1; - } - else if (*url_noproto == '/') - { - /* - * Short request line without protocol and host. - * Most likely because the client's request - * was intercepted and redirected into Privoxy. - */ - http->host = NULL; - host_available = 0; - } - else if (require_protocol) - { - freez(buf); - return JB_ERR_PARSE; - } - - 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); - } - - freez(buf); - - if ( (http->path == NULL) - || (http->hostport == NULL)) - { - return JB_ERR_MEMORY; - } - } - - if (!host_available) - { - /* Without host, there is nothing left to do here */ - return JB_ERR_OK; - } - - /* - * Split hostport into user/password (ignored), host, port. - */ - { - char *buf; - char *host; - char *port; - - buf = strdup(http->hostport); - if (buf == NULL) - { - 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 ? 443 : 80); - } - - http->host = strdup(host); - - freez(buf); - - if (http->host == NULL) - { - return JB_ERR_MEMORY; - } - } - - /* - * Split domain name so we can compare it against wildcards - */ - return init_domain_components(http); - -} - - -/********************************************************************* - * - * Function : unknown_method - * - * Description : Checks whether a method is unknown. - * - * Parameters : - * 1 : method = points to a http method - * - * Returns : TRUE if it's unknown, FALSE otherwise. - * - *********************************************************************/ -static int unknown_method(const char *method) -{ - static const char *known_http_methods[] = { - /* Basic HTTP request type */ - "GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS", "TRACE", "CONNECT", - /* webDAV extensions (RFC2518) */ - "PROPFIND", "PROPPATCH", "MOVE", "COPY", "MKCOL", "LOCK", "UNLOCK", - /* - * Microsoft webDAV extension for Exchange 2000. See: - * http://lists.w3.org/Archives/Public/w3c-dist-auth/2002JanMar/0001.html - * http://msdn.microsoft.com/library/en-us/wss/wss/_webdav_methods.asp - */ - "BCOPY", "BMOVE", "BDELETE", "BPROPFIND", "BPROPPATCH", - /* - * Another Microsoft webDAV extension for Exchange 2000. See: - * http://systems.cs.colorado.edu/grunwald/MobileComputing/Papers/draft-cohen-g... - * http://lists.w3.org/Archives/Public/w3c-dist-auth/2002JanMar/0001.html - * http://msdn.microsoft.com/library/en-us/wss/wss/_webdav_methods.asp - */ - "SUBSCRIBE", "UNSUBSCRIBE", "NOTIFY", "POLL", - /* - * Yet another WebDAV extension, this time for - * Web Distributed Authoring and Versioning (RFC3253) - */ - "VERSION-CONTROL", "REPORT", "CHECKOUT", "CHECKIN", "UNCHECKOUT", - "MKWORKSPACE", "UPDATE", "LABEL", "MERGE", "BASELINE-CONTROL", "MKACTIVITY", - }; - int i; - - for (i = 0; i < SZ(known_http_methods); i++) - { - if (0 == strcmpic(method, known_http_methods[i])) - { - return FALSE; - } - } - - return TRUE; - -} - - -/********************************************************************* - * - * 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 - * - * 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) -{ - char *buf; - char *v[10]; /* XXX: Why 10? We should only need three. */ - int n; - jb_err err; - - 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) - { - freez(buf); - return JB_ERR_PARSE; - } - - /* - * Fail in case of unknown methods - * which we might not handle correctly. - * - * XXX: There should be a config option - * to forward requests with unknown methods - * anyway. Most of them don't need special - * steps. - */ - if (unknown_method(v[0])) - { - log_error(LOG_LEVEL_ERROR, "Unknown HTTP method detected: %s", v[0]); - freez(buf); - return JB_ERR_PARSE; - } - - if (strcmpic(v[2], "HTTP/1.1") && strcmpic(v[2], "HTTP/1.0")) - { - log_error(LOG_LEVEL_ERROR, "The only supported HTTP " - "versions are 1.0 and 1.1. This rules out: %s", v[2]); - freez(buf); - return JB_ERR_PARSE; - } - - http->ssl = !strcmpic(v[0], "CONNECT"); - - err = parse_http_url(v[1], http, !http->ssl); - if (err) - { - freez(buf); - return err; - } - - /* - * Copy the details into the structure - */ - http->cmd = strdup(req); - http->gpc = strdup(v[0]); - http->ver = strdup(v[2]); - - freez(buf); - - if ( (http->cmd == NULL) - || (http->gpc == NULL) - || (http->ver == NULL) ) - { - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : compile_pattern - * - * Description : Compiles a host, domain or TAG pattern. - * - * Parameters : - * 1 : pattern = The pattern to compile. - * 2 : anchoring = How the regex should be anchored. - * Can be either one of NO_ANCHORING, - * LEFT_ANCHORED or RIGHT_ANCHORED. - * 3 : url = In case of failures, the spec member is - * logged and the structure freed. - * 4 : regex = Where the compiled regex should be stored. - * - * Returns : JB_ERR_OK - Success - * JB_ERR_MEMORY - Out of memory - * JB_ERR_PARSE - Cannot parse regex - * - *********************************************************************/ -static jb_err compile_pattern(const char *pattern, enum regex_anchoring anchoring, - struct url_spec *url, regex_t **regex) -{ - int errcode; - char rebuf[BUFFER_SIZE]; - const char *fmt = NULL; - - assert(pattern); - assert(strlen(pattern) < sizeof(rebuf) - 2); - - if (pattern[0] == '\0') - { - *regex = NULL; - return JB_ERR_OK; - } - - switch (anchoring) - { - case NO_ANCHORING: - fmt = "%s"; - break; - case RIGHT_ANCHORED: - fmt = "%s$"; - break; - case LEFT_ANCHORED: - fmt = "^%s"; - break; - default: - log_error(LOG_LEVEL_FATAL, - "Invalid anchoring in compile_pattern %d", anchoring); - } - - *regex = zalloc(sizeof(**regex)); - if (NULL == *regex) - { - free_url_spec(url); - return JB_ERR_MEMORY; - } - - snprintf(rebuf, sizeof(rebuf), fmt, pattern); - - errcode = regcomp(*regex, rebuf, (REG_EXTENDED|REG_NOSUB|REG_ICASE)); - - if (errcode) - { - size_t errlen = regerror(errcode, *regex, 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 from %s: %s", - pattern, url->spec, rebuf); - free_url_spec(url); - - return JB_ERR_PARSE; - } - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : compile_url_pattern - * - * Description : Compiles the three parts of an URL pattern. - * - * Parameters : - * 1 : url = Target url_spec to be filled in. - * 2 : buf = The url pattern to compile. Will be messed up. - * - * Returns : JB_ERR_OK - Success - * JB_ERR_MEMORY - Out of memory - * JB_ERR_PARSE - Cannot parse regex - * - *********************************************************************/ -static jb_err compile_url_pattern(struct url_spec *url, char *buf) -{ - char *p; - - p = strchr(buf, '/'); - if (NULL != p) - { - /* - * Only compile the regex if it consists of more than - * a single slash, otherwise it wouldn't affect the result. - */ - if (p[1] != '\0') - { - /* - * XXX: does it make sense to compile the slash at the beginning? - */ - jb_err err = compile_pattern(p, LEFT_ANCHORED, url, &url->preg); - - if (JB_ERR_OK != err) - { - return err; - } - } - *p = '\0'; - } - - p = strchr(buf, ':'); - if (NULL != p) - { - *p++ = '\0'; - url->port_list = strdup(p); - if (NULL == url->port_list) - { - return JB_ERR_MEMORY; - } - } - else - { - url->port_list = NULL; - } - - if (buf[0] != '\0') - { - return compile_host_pattern(url, buf); - } - - return JB_ERR_OK; - -} - - -#ifdef FEATURE_EXTENDED_HOST_PATTERNS -/********************************************************************* - * - * Function : compile_host_pattern - * - * Description : Parses and compiles a host pattern.. - * - * Parameters : - * 1 : url = Target url_spec to be filled in. - * 2 : host_pattern = Host pattern to compile. - * - * Returns : JB_ERR_OK - Success - * JB_ERR_MEMORY - Out of memory - * JB_ERR_PARSE - Cannot parse regex - * - *********************************************************************/ -static jb_err compile_host_pattern(struct url_spec *url, const char *host_pattern) -{ - return compile_pattern(host_pattern, RIGHT_ANCHORED, url, &url->host_regex); -} - -#else - -/********************************************************************* - * - * Function : compile_host_pattern - * - * Description : Parses and "compiles" an old-school host pattern. - * - * Parameters : - * 1 : url = Target url_spec to be filled in. - * 2 : host_pattern = Host pattern to parse. - * - * Returns : JB_ERR_OK - Success - * JB_ERR_MEMORY - Out of memory - * JB_ERR_PARSE - Cannot parse regex - * - *********************************************************************/ -static jb_err compile_host_pattern(struct url_spec *url, const char *host_pattern) -{ - char *v[150]; - size_t size; - char *p; - - /* - * Parse domain part - */ - if (host_pattern[strlen(host_pattern) - 1] == '.') - { - url->unanchored |= ANCHOR_RIGHT; - } - if (host_pattern[0] == '.') - { - url->unanchored |= ANCHOR_LEFT; - } - - /* - * Split domain into components - */ - url->dbuffer = strdup(host_pattern); - if (NULL == url->dbuffer) - { - free_url_spec(url); - return JB_ERR_MEMORY; - } - - /* - * Map to lower case - */ - for (p = url->dbuffer; *p ; p++) - { - *p = (char)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) - { - free_url_spec(url); - return JB_ERR_MEMORY; - } - else if (url->dcount != 0) - { - /* - * Save a copy of the pointers in dvec - */ - size = (size_t)url->dcount * sizeof(*url->dvec); - - url->dvec = (char **)malloc(size); - if (NULL == url->dvec) - { - free_url_spec(url); - return JB_ERR_MEMORY; - } - - memcpy(url->dvec, v, size); - } - /* - * else dcount == 0 in which case we needn't do anything, - * since dvec will never be accessed and the pattern will - * match all domains. - */ - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : simplematch - * - * Description : String matching, with a (greedy) '*' wildcard that - * stands for zero or more arbitrary characters and - * character classes in [], which take both enumerations - * and ranges. - * - * Parameters : - * 1 : pattern = pattern for matching - * 2 : text = text to be matched - * - * Returns : 0 if match, else nonzero - * - *********************************************************************/ -static int simplematch(const char *pattern, const char *text) -{ - const unsigned char *pat = (const unsigned char *)pattern; - const unsigned char *txt = (const unsigned char *)text; - const unsigned char *fallback = pat; - int wildcard = 0; - - unsigned char lastchar = 'a'; - unsigned i; - unsigned char charmap[32]; - - while (*txt) - { - - /* EOF pattern but !EOF text? */ - if (*pat == '\0') - { - if (wildcard) - { - pat = fallback; - } - else - { - return 1; - } - } - - /* '*' in the pattern? */ - if (*pat == '*') - { - - /* The pattern ends afterwards? Speed up the return. */ - if (*++pat == '\0') - { - return 0; - } - - /* Else, set wildcard mode and remember position after '*' */ - wildcard = 1; - fallback = pat; - } - - /* Character range specification? */ - if (*pat == '[') - { - memset(charmap, '\0', sizeof(charmap)); - - while (*++pat != ']') - { - if (!*pat) - { - return 1; - } - else if (*pat == '-') - { - if ((*++pat == ']') || *pat == '\0') - { - return(1); - } - for (i = lastchar; i <= *pat; i++) - { - charmap[i / 8] |= (unsigned char)(1 << (i % 8)); - } - } - else - { - charmap[*pat / 8] |= (unsigned char)(1 << (*pat % 8)); - lastchar = *pat; - } - } - } /* -END- if Character range specification */ - - - /* - * Char match, or char range match? - */ - if ( (*pat == *txt) - || (*pat == '?') - || ((*pat == ']') && (charmap[*txt / 8] & (1 << (*txt % 8)))) ) - { - /* - * Sucess: Go ahead - */ - pat++; - } - else if (!wildcard) - { - /* - * No match && no wildcard: No luck - */ - return 1; - } - else if (pat != fallback) - { - /* - * Increment text pointer if in char range matching - */ - if (*pat == ']') - { - txt++; - } - /* - * Wildcard mode && nonmatch beyond fallback: Rewind pattern - */ - pat = fallback; - /* - * Restart matching from current text pointer - */ - continue; - } - txt++; - } - - /* Cut off extra '*'s */ - if(*pat == '*') pat++; - - /* If this is the pattern's end, fine! */ - return(*pat); - -} - - -/********************************************************************* - * - * 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; - } - -} -#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */ - - -/********************************************************************* - * - * Function : create_url_spec - * - * Description : Creates a "url_spec" structure from a string. - * When finished, free with free_url_spec(). - * - * 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, char *buf) -{ - assert(url); - assert(buf); - - memset(url, '\0', sizeof(*url)); - - /* Remember the original specification for the CGI pages. */ - url->spec = strdup(buf); - if (NULL == url->spec) - { - return JB_ERR_MEMORY; - } - - /* Is it tag pattern? */ - if (0 == strncmpic("TAG:", url->spec, 4)) - { - /* The pattern starts with the first character after "TAG:" */ - const char *tag_pattern = buf + 4; - return compile_pattern(tag_pattern, NO_ANCHORING, url, &url->tag_regex); - } - - /* If it isn't a tag pattern it must be a URL pattern. */ - return compile_url_pattern(url, buf); -} - - -/********************************************************************* - * - * 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); -#ifdef FEATURE_EXTENDED_HOST_PATTERNS - if (url->host_regex) - { - regfree(url->host_regex); - freez(url->host_regex); - } -#else - freez(url->dbuffer); - freez(url->dvec); - url->dcount = 0; -#endif /* ndef FEATURE_EXTENDED_HOST_PATTERNS */ - freez(url->port_list); - if (url->preg) - { - regfree(url->preg); - freez(url->preg); - } - if (url->tag_regex) - { - regfree(url->tag_regex); - freez(url->tag_regex); - } -} - - -/********************************************************************* - * - * Function : url_match - * - * Description : Compare a URL against a URL pattern. - * - * Parameters : - * 1 : pattern = a URL pattern - * 2 : url = URL to match - * - * Returns : Nonzero if the URL matches the pattern, else 0. - * - *********************************************************************/ -int url_match(const struct url_spec *pattern, - const struct http_request *http) -{ - /* XXX: these should probably be functions. */ -#define PORT_MATCHES ((NULL == pattern->port_list) || match_portlist(pattern->port_list, http->port)) -#ifdef FEATURE_EXTENDED_HOST_PATTERNS -#define DOMAIN_MATCHES ((NULL == pattern->host_regex) || (0 == regexec(pattern->host_regex, http->host, 0, NULL, 0))) -#else -#define DOMAIN_MATCHES ((NULL == pattern->dbuffer) || (0 == domain_match(pattern, http))) -#endif -#define PATH_MATCHES ((NULL == pattern->preg) || (0 == regexec(pattern->preg, http->path, 0, NULL, 0))) - - if (pattern->tag_regex != NULL) - { - /* It's a tag pattern and shouldn't be matched against URLs */ - return 0; - } - - return (PORT_MATCHES && DOMAIN_MATCHES && PATH_MATCHES); - -} - - -/********************************************************************* - * - * 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)) - { - freez(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)) - { - freez(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'; - } - } - - freez(portlist_copy); - return 0; - -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/urlmatch.h b/external/privoxy/urlmatch.h deleted file mode 100644 index db5c60b..0000000 --- a/external/privoxy/urlmatch.h +++ /dev/null @@ -1,136 +0,0 @@ -#ifndef URLMATCH_H_INCLUDED -#define URLMATCH_H_INCLUDED -#define URLMATCH_H_VERSION "$Id: urlmatch.h,v 1.13 2009/03/02 19:18:11 fabiankeil 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-2002, 2006 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.13 2009/03/02 19:18:11 fabiankeil - * Streamline parse_http_request()'s prototype. As - * cparser pointed out it doesn't actually use csp. - * - * Revision 1.12 2008/05/04 16:18:32 fabiankeil - * Provide parse_http_url() with a third parameter to specify - * whether or not URLs without protocol are acceptable. - * - * Revision 1.11 2008/05/04 13:30:55 fabiankeil - * Streamline parse_http_url()'s prototype. - * - * Revision 1.10 2008/04/14 18:11:21 fabiankeil - * The compiler might not notice it, but the buffer passed to - * create_url_spec() is modified later on and thus shouldn't - * be declared immutable. - * - * Revision 1.9 2008/04/08 16:07:39 fabiankeil - * Make it harder to mistake url_match()'s - * second parameter for an url_spec. - * - * Revision 1.8 2007/09/02 15:31:20 fabiankeil - * Move match_portlist() from filter.c to urlmatch.c. - * It's used for url matching, not for filtering. - * - * Revision 1.7 2007/01/06 14:24:38 fabiankeil - * Mark *csp as immutable for parse_http_url() - * and url_match(). - * - * Revision 1.6 2006/12/06 19:12:43 fabiankeil - * Added prototype for init_domain_components(). - * - * Revision 1.5 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.3 2002/03/26 22:29:55 swa - * we have a new homepage! - * - * 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 init_domain_components(struct http_request *http); -extern jb_err parse_http_request(const char *req, struct http_request *http); -extern jb_err parse_http_url(const char *url, - struct http_request *http, - int require_protocol); -#define REQUIRE_PROTOCOL 1 - -extern int url_match(const struct url_spec *pattern, - const struct http_request *http); - -extern jb_err create_url_spec(struct url_spec *url, char *buf); -extern void free_url_spec(struct url_spec *url); -extern int match_portlist(const char *portlist, int port); - - -/* 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/external/privoxy/user.action b/external/privoxy/user.action deleted file mode 100644 index 7b18dd9..0000000 --- a/external/privoxy/user.action +++ /dev/null @@ -1,169 +0,0 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/user.action,v $ -# -# $Id: user.action,v 1.9 2008/03/27 18:27:37 fabiankeil Exp $ -# -# Purpose : User-maintained actions file, see -# http://www.privoxy.org/user-manual/actions-file.html -# -###################################################################### - -# This is the place to add your personal exceptions and additions to -# the general policies as defined in default.action. (Here they will be -# safe from updates to default.action.) Later defined actions always -# take precedence, so anything defined here should have the last word. - -# See http://www.privoxy.org/user-manual/actions-file.html, or the -# comments in default.action, for an explanation of what an "action" is -# and what each action does. - -# The examples included here either use bogus sites, or have the actual -# rules commented out (with the '#' character). Useful aliases are -# included in the top section as a convenience. - -############################################################################# -# Aliases -############################################################################# -{{alias}} -############################################################################# -# -# You can define a short form for a list of permissions - e.g., instead -# of "-crunch-incoming-cookies -crunch-outgoing-cookies -filter -fast-redirects", -# you can just write "shop". This is called an alias. -# -# 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. -# -# Aliases beginning with '+' or '-' may be used for system action names -# in future releases - so try to avoid alias names like this. (e.g. -# "+crunch-all-cookies" below is not a good name) -# -# Aliases must be defined before they are used. -# -# These aliases just save typing later: -# -+crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies --crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies - allow-all-cookies = -crunch-all-cookies -session-cookies-only -filter{content-cookies} - allow-popups = -filter{all-popups} -filter{unsolicited-popups} -+block-as-image = +block{Blocked image request.} +handle-as-image --block-as-image = -block - -# These aliases define combinations of actions -# that are useful for certain types of sites: -# -fragile = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -prevent-compression -shop = -crunch-all-cookies allow-popups - -# Your favourite blend of filters: -# -myfilters = +filter{html-annoyances} +filter{js-annoyances} +filter{all-popups}\ - +filter{webbugs} +filter{banners-by-size} - -# Allow ads for selected useful free sites: -# -allow-ads = -block -filter{banners-by-size} -filter{banners-by-link} -#... etc. Customize to your heart's content. - -## end aliases ######################################################## -####################################################################### - -# Begin examples: ##################################################### - -# Say you have accounts on some sites that you visit regularly, and you -# don't want to have to log in manually each time. So you'd like to allow -# persistent cookies for these sites. The allow-all-cookies alias defined -# above does exactly that, i.e. it disables crunching of cookies in any -# direction, and the processing of cookies to make them only temporary. -# -{ allow-all-cookies } -#.sourceforge.net -#sunsolve.sun.com -#slashdot.org -#.yahoo.com -#.msdn.microsoft.com -#.redhat.com - -# Say the site where you do your homebanking needs to open popup -# windows, but you have chosen to kill popups uncoditionally by default. -# This will allow it for your-example-bank.com: -# -{ -filter{all-popups} } -.banking.example.com - -# Some hosts and some file types you may not want to filter for -# various reasons: -# -{ -filter } - -# Technical documentation is likely to contain strings that might -# erroneously get altered by the JavaScript-oriented filters: -# -#.tldp.org -#/(.*/)?selfhtml/ - -# And this stupid host sends streaming video with a wrong MIME type, -# so that Privoxy thinks it is getting HTML and starts filtering: -# -stupid-server.example.com/ - - -# Example of a simple "block" action. Say you've seen an ad on your -# favourite page on example.com that you want to get rid of. You have -# right-clicked the image, selected "copy image location" and pasted -# the URL below while removing the leading http://, into a { +block{reason} } -# section. Note that { +handle-as-image } need not be specified, since -# all URLs ending in .gif will be tagged as images by the general rules -# as set in default.action anyway: -# -{ +block{Nasty ads.} } -www.example.com/nasty-ads/sponsor.gif - -# The URLs of dynamically generated banners, especially from large banner -# farms, often don't use the well-known image file name extensions, which -# makes it impossible for Privoxy to guess the file type just by looking -# at the URL. -# You can use the +block-as-image alias defined above for these cases. -# Note that objects which match this rule but then turn out NOT to be an -# image are typically rendered as a "broken image" icon by the browser. -# Use cautiously. -# -{ +block-as-image } -#.doubleclick.net -#/Realmedia/ads/ -#ar.atwola.com/ - -# Now you noticed that the default configuration breaks Forbes -# Magazine, but you were too lazy to find out which action is the -# culprit, and you were again too lazy to give feedback, so you just -# used the fragile alias on the site, and -- whoa! -- it worked. The -# 'fragile' aliases disables those actions that are most likely to break -# a site. Also, good for testing purposes to see if it is Privoxy that -# is causing the problem or not. -# -{ fragile } -#.forbes.com - -# Here are some sites we wish to support, and we will allow their ads -# through. -# -{ allow-ads } -#.sourceforge.net -#.slashdot.org -#.osdn.net - -# user.action is generally the best place to define exceptions and -# additions to the default policies of default.action. Some actions are -# safe to have their default policies set here though. So let's set a -# default policy to have a 'blank' image as opposed to the checkerboard -# pattern for ALL sites. '/' of course matches all URLs. -# patterns: -# -{ +set-image-blocker{blank} } -#/ - -## set vi:nowrap tw=72 diff --git a/external/privoxy/user.filter b/external/privoxy/user.filter deleted file mode 100644 index 98de1c6..0000000 --- a/external/privoxy/user.filter +++ /dev/null @@ -1,75 +0,0 @@ -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/user.filter,v $ -# -# $Id: user.filter,v 1.3 2008/05/21 20:17:03 fabiankeil Exp $ -# -# Purpose : Rules to process the content of web pages -# -# Copyright : Written by and Copyright (C) 2006-2008 the -# Privoxy team. http://www.privoxy.org/ -# -# 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=brow... -# -# 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: -# -# Generally filters start with a line like "FILTER: name description". -# They are then referrable from the actionsfile with +filter{name} -# -# FILTER marks a filter as content filter, other filter -# types are CLIENT-HEADER-FILTER, CLIENT-HEADER-TAGGER, -# SERVER-HEADER-FILTER and SERVER-HEADER-TAGGER. -# -# Inside the filters, write one Perl-Style substitution (job) per line. -# Jobs that precede the first FILTER: line are ignored. -# -# For Details see the pcrs manpage contained in this distribution. -# (and the perlre, perlop and pcre manpages) -# -# Note that you are free to choose the delimiter as you see fit. -# -# Note2: In addition to the Perl options gimsx, the following nonstandard -# options are supported: -# -# 'U' turns the default to ungreedy matching. Add ? to quantifiers to -# switch back to greedy. -# -# 'T' (trivial) prevents parsing for backreferences in the substitute. -# Use if you want to include text like '$&' in your substitute without -# quoting. -# -# 'D' (Dynamic) allows the use of variables. Supported variables are: -# $host, $origin (the IP address the request came from), $path and $url. -# -# Note that '$' is a bad choice as delimiter for dynamic filters as you -# might end up with unintended variables if you use a variable name -# directly after the delimiter. Variables will be resolved without -# escaping anything, therefore you also have to be careful not to chose -# delimiters that appear in the replacement text. For example '<' should -# be save, while '?' will sooner or later cause conflicts with $url. -# -################################################################################# diff --git a/external/privoxy/utils/changelog2doc.pl b/external/privoxy/utils/changelog2doc.pl deleted file mode 100755 index a12cb32..0000000 --- a/external/privoxy/utils/changelog2doc.pl +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/perl - -# $Id: changelog2doc.pl,v 1.2 2008/09/26 16:49:09 fabiankeil Exp $ -# $Source: /cvsroot/ijbswa/current/utils/changelog2doc.pl,v $ - -# Filter to parse the ChangeLog and translate the changes for -# the most recent version into something that looks like markup -# for the documentation but still needs fine-tuning. - -use strict; -use warnings; - -my @entries; - -sub read_entries() { - my $section_reached = 0; - my $i = -1; - - while (<>) { - if (/^*{3} /) { - last if $section_reached; - $section_reached = 1; - next; - } - next unless $section_reached; - next if /^\s*$/; - - if (/^-/) { - $i++; - $entries[$i] = ''; - } - s@^-?\s*@@; - - $entries[$i] .= $_; - } - print "Parsed " . @entries . " entries.\n"; -} - -sub generate_markup() { - my $markup = ''; - - $markup .= "<para>\n" . - " <itemizedlist>\n"; - - foreach my $entry (@entries) { - chomp $entry; - $entry =~ s@\n@\n @g; - $markup .= " <listitem>\n" . - " <para>\n" . - " " . $entry . "\n" . - " </para>\n" . - " </listitem>\n" - ; - } - $markup .= " </itemizedlist>\n" . - "</para>\n"; - - print $markup; -} - -sub main () { - read_entries(); - generate_markup(); -} - -main(); diff --git a/external/privoxy/utils/docbook2man/COPYING b/external/privoxy/utils/docbook2man/COPYING deleted file mode 100644 index d60c31a..0000000 --- a/external/privoxy/utils/docbook2man/COPYING +++ /dev/null @@ -1,340 +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. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/external/privoxy/utils/docbook2man/docbook2man-spec.pl b/external/privoxy/utils/docbook2man/docbook2man-spec.pl deleted file mode 100644 index 4e6d484..0000000 --- a/external/privoxy/utils/docbook2man/docbook2man-spec.pl +++ /dev/null @@ -1,1229 +0,0 @@ -=head1 NAME - -docbook2man-spec - convert DocBook RefEntries to Unix manpages - -=head1 SYNOPSIS - -The SGMLSpm package from CPAN. This contains the sgmlspl script which -is used to grok this file. Use it like this: - -nsgmls some-docbook-document.sgml | sgmlspl docbook2man-spec.pl - -=head1 DESCRIPTION - -This is a sgmlspl spec file that produces Unix-style -manpages from RefEntry markup. - -See the accompanying RefEntry man page for 'plain new' documentation. :) - -=head1 LIMITATIONS - -Trying docbook2man on non-DocBook or non-conformant SGML results in -undefined behavior. :-) - -This program is a slow, dodgy Perl script. - -This program does not come close to supporting all the possible markup -in DocBook, and will produce wrong output in some cases with supported -markup. - -=head1 TODO - -Add new element handling and fix existing handling. Be robust. -Produce cleanest, readable man output as possible (unlike some -other converters). Follow Linux man(7) convention. -If this results in added logic in this script, -that's okay. The code should still be reasonably organized. - -Make it faster. If Perl sucks port it to another language. - -=head1 COPYRIGHT - -Copyright (C) 1998-1999 Steve Cheng steve@ggi-project.org - -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, or (at your option) any later -version. - -You should have received a copy of the GNU General Public License along with -this program; see the file COPYING. If not, please write to the Free -Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -=cut - -# $Id: docbook2man-spec.pl,v 1.4 2006/07/18 14:49:14 david__schmidt Exp $ - -use SGMLS; # Use the SGMLS package. -use SGMLS::Output; # Use stack-based output. -use SGMLS::Refs; - -######################################################################## -# SGMLSPL script produced automatically by the script sgmlspl.pl -# -# Document Type: any, but processes only RefEntries -# Edited by: me :) -######################################################################## - -$write_manpages = 0; -$blank_xrefs = 0; - -sgml('start', sub { - push_output('nul'); - $raw_cdata = 1; # Makes it a bit faster. - - # Links file - open(LINKSFILE, ">manpage.links"); - - $Refs = new SGMLS::Refs("manpage.refs"); -}); -sgml('end', sub { - close(LINKSFILE); - if($blank_xrefs) { - print STDERR "Warning: output contains unresolved XRefs\n"; - } -}); - - - - -######################################################################## -# -# Output helpers -# -######################################################################## - -# Our own version of sgml() and output() to allow simple string output -# to play well with roff's stupid whitespace rules. - -sub man_sgml -{ - if(ref($_[1]) eq 'CODE') { - return &sgml; - } - - my $s = $_[1]; - - $s =~ s/\/\\/g; - $s =~ s/'/\'/g; - - # \n at the beginning means start at beginning of line - if($s =~ s/^\n//) { - $sub = 'sub { output "\n" unless $newline_last++; '; - if($s eq '') { - sgml($_[0], eval('sub { output "\n" unless $newline_last++; }')); - } elsif($s =~ /\n$/) { - sgml($_[0], eval("sub { output "\n" unless $newline_last++; output '$s'; }")); - } else { - sgml($_[0], eval("sub { output "\n" unless $newline_last; output '$s'; $newline_last = 0; }")); - } - } else { - if($s =~ /\n$/) { - sgml($_[0], eval("sub { output '$s'; $newline_last = 1; }")); - } else { - sgml($_[0], eval("sub { output '$s'; $newline_last = 0; }")); - } - } -} - -sub man_output -{ - $_ = shift; - if(s/^\n//) { - output "\n" unless $newline_last++; - } - return if $_ eq ''; - - output $_; - - if(@_) { - output @_; - $newline_last = (pop(@_) =~ /\n$/); - } else { - $newline_last = ($_ =~ /\n$/) - } -} - -# Fold lines into one, quote some characters -sub fold_string -{ - $_ = shift; - - s/\/\\/g; - s/"/\&"/g; - - # Change tabs to spaces - tr/\t\n/ /; - - # Trim whitespace from beginning and end. - s/^ +//; - s/ +$//; - - return $_; -} - -sub save_cdata() -{ - $raw_cdata++; - push_output('string'); -} - -sub bold_on() -{ - # If the last font is also bold, don't change anything. - # Basically this is to just get more readable man output. - if($fontstack[$#fontstack] ne 'bold') { - if(!$raw_cdata) { - output '\fB'; - $newline_last = 0; - } - } - push(@fontstack, 'bold'); -} - -sub italic_on() -{ - # If the last font is also italic, don't change anything. - if($fontstack[$#fontstack] ne 'italic') { - if(!$raw_cdata) { - output '\fI'; - $newline_last = 0; - } - } - push(@fontstack, 'italic'); -} - -sub font_off() -{ - my $thisfont = pop(@fontstack); - my $lastfont = $fontstack[$#fontstack]; - - # Only output font change if it is different - if($thisfont ne $lastfont) { - if($raw_cdata) { return; } - elsif($lastfont eq 'bold') { output '\fB'; } - elsif($lastfont eq 'italic') { output '\fI'; } - else { output '\fR'; } - - $newline_last = 0; - } -} - - - - - - -######################################################################## -# -# Manpage management -# -######################################################################## - -sgml('<REFENTRY>', sub { - # This will be overwritten at end of REFMETA, when we know the name of the page. - pop_output(); - - $write_manpages = 1; # Currently writing manpage. - - $nocollapse_whitespace = 0; # Current whitespace collapse counter. - $newline_last = 1; # At beginning of line? - # Just a bit of warning, you will see this variable manipulated - # manually a lot. It makes the code harder to follow but it - # saves you from having to worry about collapsing at the end of - # parse, stopping at verbatims, etc. - $raw_cdata = 0; # Instructs certain output functions to - # leave CDATA alone, so we can assign - # it to a string and process it, etc. - @fontstack = (); # Fonts being activated. - - $manpage_title = ''; # Needed for indexing. - $manpage_sect = ''; - @manpage_names = (); - - $manpage_misc = ''; - - $list_nestlevel = 0; # Indent certain nested content. -}); -sgml('</REFENTRY>', sub { - if(!$newline_last) { - output "\n"; - } - - $write_manpages = 0; - $raw_cdata = 1; - push_output('nul'); -}); - -sgml('</REFMETA>', sub { - push_output('file', "$manpage_title.$manpage_sect"); - - output <<_END_BANNER; -.\" This manpage has been automatically generated by docbook2man -.\" from a DocBook document. This tool can be found at: -.\" http://shell.ipoline.com/~elmert/comp/docbook2X/ -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng <steve@ggi-project.org>. -_END_BANNER - - my $manpage_date = `date "+%d %B %Y"`; - - output '.TH "'; - - # If the title is not mixed-case, convention says to - # uppercase the whole title. (The canonical title is - # lowercase.) - if($manpage_title =~ /[A-Z]/) { - output fold_string($manpage_title); - } else { - output uc(fold_string($manpage_title)); - } - - output '" "', fold_string($manpage_sect), - '" "', fold_string(`date "+%d %B %Y"`), - '" "', $manpage_misc, - '" "', $manpage_manual, - ""\n"; - - $newline_last = 1; - - # References to this RefEntry. - my $id = $_[0]->parent->attribute('ID')->value; - if($id ne '') { - # The 'package name' part of the section should - # not be used when citing it. - my ($sectnum) = ($manpage_sect =~ /([0-9]*)/); - - if($_[0]->parent->attribute('XREFLABEL')->value eq '') { - $Refs->put("refentry:$id", "$manpage_title($sectnum)"); - } else { - $Refs->put("refentry:$id", - $_[0]->parent->attribute('XREFLABEL')->value . - "($sectnum)"); - } - } -}); - -sgml('<REFENTRYTITLE>', sub { - if($_[0]->in('REFMETA')) { - save_cdata(); - } else { - # Manpage citations are in bold. - bold_on(); - } -}); -sgml('</REFENTRYTITLE>', sub { - if($_[0]->in('REFMETA')) { - $raw_cdata--; - $manpage_title = pop_output(); - } - else { font_off(); } -}); - -sgml('<MANVOLNUM>', sub { - if($_[0]->in('REFMETA')) { - save_cdata(); - } else { - # Manpage citations use (). - output '('; - } -}); -sgml('</MANVOLNUM>', sub { - if($_[0]->in('REFMETA')) { - $raw_cdata--; - $manpage_sect = pop_output(); - } - else { output ')' } -}); - -sgml('<REFMISCINFO>', &save_cdata); -sgml('</REFMISCINFO>', sub { - $raw_cdata--; - $manpage_misc = fold_string(pop_output()); -}); - - -# NAME section -man_sgml('<REFNAMEDIV>', "\n.SH NAME\n"); - -sgml('<REFNAME>', &save_cdata); -sgml('</REFNAME>', sub { - $raw_cdata--; - push(@manpage_names, pop_output()); -}); - -sgml('<REFPURPOSE>', &save_cdata); -sgml('</REFPURPOSE>', sub { - $raw_cdata--; - my $manpage_purpose = fold_string(pop_output()); - - for(my $i = 0; $i < $#manpage_names; $i++) { - output fold_string($manpage_names[$i]), ', '; - } - - output fold_string($manpage_names[$#manpage_names]); - output " \- $manpage_purpose\n"; - - $newline_last = 1; - - foreach(@manpage_names) { - # Don't link to itself - if($_ ne $manpage_title) { - print LINKSFILE "$manpage_title.$manpage_sect $_.$manpage_sect\n"; - } - } -}); - -man_sgml('<REFCLASS>', "\n.sp\n"); - -#RefDescriptor - - - - - -######################################################################## -# -# SYNOPSIS section and synopses -# -######################################################################## - -man_sgml('<REFSYNOPSISDIV>', "\n.SH SYNOPSIS\n"); -man_sgml('</REFSYNOPSISDIV>', "\n"); - -## FIXME! Must be made into block elements!! -#sgml('<FUNCSYNOPSIS>', &bold_on); -#sgml('</FUNCSYNOPSIS>', &font_off); -#sgml('<CMDSYNOPSIS>', &bold_on); -#sgml('</CMDSYNOPSIS>', &font_off); - -man_sgml('<FUNCSYNOPSIS>', sub { - man_output("\n.sp\n"); - bold_on(); -}); -man_sgml('</FUNCSYNOPSIS>', sub { - font_off(); - man_output("\n"); -}); - -man_sgml('<CMDSYNOPSIS>', "\n\n"); -man_sgml('</CMDSYNOPSIS>', "\n\n"); - -man_sgml('<FUNCPROTOTYPE>', "\n.sp\n"); - -# Arguments to functions. This is C convention. -sub paramdef -{ - if($_[0]->parent->ext->{'inparams'}) { - output ', '; - } else { - output ' ('; - $_[0]->parent->ext->{'inparams'} = 1; - } -} -man_sgml('<PARAMDEF>', ¶mdef); -man_sgml('</FUNCPROTOTYPE>', ");\n"); -man_sgml('<VOID>', "(void"); -man_sgml('<VARARGS>', "(..."); - - - -sub group_start -{ - if(not $_[0]->parent->in('TERM')) { - if($_[0]->attribute('CHOICE')->value =~ /opt/i) { - output ' ['; - } elsif($_[0]->attribute('CHOICE')->value =~ /req/i) { - output ' {'; - } - } - $_[0]->ext->{'count'} = 1; -} -sub group_end -{ - if($_[0]->attribute('REP')->value =~ /^Repeat/i) { - italic_on(); - output ' ...'; - font_off(); - } - if(not $_[0]->parent->in('TERM')) { - if($_[0]->attribute('CHOICE')->value =~ /opt/i) { - output ' ]'; - } elsif($_[0]->attribute('CHOICE')->value =~ /req/i) { - output ' }'; - } - } -} - -sub arg_start -{ - # my $choice = $_[0]->attribute('CHOICE')->value; - - # The content model for CmdSynopsis doesn't include #PCDATA, - # so we won't see any of the whitespace in the source file, - # so we have to add it after each component. - output ' '; - - if($_[0]->in('GROUP')) { - output '| ' if $_[0]->parent->ext->{'count'} > 1; - $_[0]->parent->ext->{'count'}++; - } elsif($_[0]->attribute('CHOICE')->value =~ /opt/i) { - output '[ '; - } - bold_on(); -} -sub arg_end -{ - font_off(); - if($_[0]->attribute('REP')->value =~ /^Repeat/i) { - italic_on(); - output ' ...'; - font_off(); - } - if($_[0]->attribute('CHOICE')->value =~ /opt/i and - not $_[0]->in('GROUP')) { - output ' ]'; - } -} - -sgml('<ARG>', &arg_start); -sgml('</ARG>', &arg_end); -sgml('<GROUP>', &group_start); -sgml('</GROUP>', &group_end); - -sgml('<OPTION>', &bold_on); -sgml('</OPTION>', &font_off); - -man_sgml('<SBR>', "\n "); - - -######################################################################## -# -# General sections -# -######################################################################## - -# The name of the section is handled by TITLE. This just sets -# up the roff markup. -man_sgml('<REFSECT1>', "\n.SH "); -man_sgml('<REFSECT2>', "\n.SS "); -man_sgml('<REFSECT3>', "\n.SS "); - - -######################################################################## -# -# Titles, metadata. -# -######################################################################## - -sgml('<TITLE>', sub { - if($_[0]->in('REFERENCE') or $_[0]->in('BOOK')) { - $write_manpages = 1; - } - save_cdata(); -}); -sgml('</TITLE>', sub { - my $title = fold_string(pop_output()); - $raw_cdata--; - - if($_[0]->in('REFERENCE') or $_[0]->in('BOOK')) { - # We use TITLE of enclosing Reference or Book as manual name - $manpage_manual = $title; - $write_manpages = 0; - } - elsif(exists $_[0]->parent->ext->{'title'}) { - # By far the easiest case. Just fold the string as - # above, and then set the parent element's variable. - $_[0]->parent->ext->{'title'} = $title; - } - else { - # If the parent element's handlers are lazy, - # output the folded string for them :) - # We assume they want uppercase and a newline. - output '"', uc($title), ""\n"; - $newline_last = 1; - } -}); - -sgml('<ATTRIBUTION>', sub { push_output('string') }); -sgml('</ATTRIBUTION>', sub { $_[0]->parent->ext->{'attribution'} = pop_output(); }); - - -# IGNORE. -sgml('<DOCINFO>', sub { push_output('nul'); }); -sgml('</DOCINFO>', sub { pop_output(); }); -sgml('<REFSECT1INFO>', sub { push_output('nul'); }); -sgml('</REFSECT1INFO>', sub { pop_output(); }); -sgml('<REFSECT2INFO>', sub { push_output('nul'); }); -sgml('</REFSECT2INFO>', sub { pop_output(); }); -sgml('<REFSECT3INFO>', sub { push_output('nul'); }); -sgml('</REFSECT3INFO>', sub { pop_output(); }); - -sgml('<INDEXTERM>', sub { push_output('nul'); }); -sgml('</INDEXTERM>', sub { pop_output(); }); - - -######################################################################## -# -# Set bold on enclosed content -# -######################################################################## - -sgml('<APPLICATION>', &bold_on); sgml('</APPLICATION>', &font_off); - -sgml('<CLASSNAME>', &bold_on); sgml('</CLASSNAME>', &font_off); -sgml('<STRUCTNANE>', &bold_on); sgml('</STRUCTNAME>', &font_off); -sgml('<STRUCTFIELD>', &bold_on); sgml('</STRUCTFIELD>', &font_off); -sgml('<SYMBOL>', &bold_on); sgml('</SYMBOL>', &font_off); -sgml('<TYPE>', &bold_on); sgml('</TYPE>', &font_off); - -sgml('<ENVAR>', &bold_on); sgml('</ENVAR>', &font_off); - -sgml('<FUNCTION>', &bold_on); sgml('</FUNCTION>', &font_off); - -sgml('<EMPHASIS>', &bold_on); sgml('</EMPHASIS>', &font_off); - -sgml('<ERRORNAME>', &bold_on); sgml('</ERRORNAME>', &font_off); -# ERRORTYPE - -sgml('<COMMAND>', &bold_on); sgml('</COMMAND>', &font_off); - -sgml('<GUIBUTTON>', &bold_on); sgml('</GUIBUTTON>', &font_off); -sgml('<GUIICON>', &bold_on); sgml('</GUIICON>', &font_off); -# GUILABEL -# GUIMENU -# GUIMENUITEM -# GUISUBMENU -# MENUCHOICE -# MOUSEBUTTON - -sgml('<ACCEL>', &bold_on); sgml('</ACCEL>', &font_off); -sgml('<KEYCAP>', &bold_on); sgml('</KEYCAP>', &font_off); -sgml('<KEYSYM>', &bold_on); sgml('</KEYSYM>', &font_off); -# KEYCODE -# KEYCOMBO -# SHORTCUT - -sgml('<USERINPUT>', &bold_on); sgml('</USERINPUT>', &font_off); - -sgml('<INTERFACEDEFINITION>', &bold_on); -sgml('</INTERFACEDEFINITION>', &font_off); - -# May need to look at the CLASS -sgml('<SYSTEMITEM>', &bold_on); -sgml('</SYSTEMITEM>', &font_off); - - - - - -######################################################################## -# -# Set italic on enclosed content -# -######################################################################## - -sgml('<FIRSTTERM>', &italic_on); sgml('</FIRSTTERM>', &font_off); - -sgml('<FILENAME>', &italic_on); sgml('</FILENAME>', &font_off); -sgml('<PARAMETER>', &italic_on); sgml('</PARAMETER>', &font_off); -sgml('<PROPERTY>', &italic_on); sgml('</PROPERTY>', &font_off); - -sgml('<REPLACEABLE>', sub { - italic_on(); - if($_[0]->in('TOKEN')) { - # When tokenizing, follow more 'intuitive' convention - output "<"; - } -}); -sgml('</REPLACEABLE>', sub { - if($_[0]->in('TOKEN')) { - output ">"; - } - font_off(); -}); - -sgml('<CITETITLE>', &italic_on); sgml('</CITETITLE>', &font_off); -sgml('<FOREIGNPHRASE>', &italic_on); sgml('</FOREIGNPHRASE>', &font_off); - -sgml('<LINEANNOTATION>', &italic_on); sgml('</LINEANNOTATION>', &font_off); - - - - - - -######################################################################## -# -# Other 'inline' elements -# -######################################################################## - -man_sgml('<EMAIL>', '<'); -man_sgml('</EMAIL>', '>'); -man_sgml('<OPTIONAL>', '['); -man_sgml('</OPTIONAL>', ']'); - -man_sgml('</TRADEMARK>', "\u\s-2TM\s+2\d"); - -man_sgml('<COMMENT>', "[Comment: "); -man_sgml('</COMMENT>', "]"); - -man_sgml('<QUOTE>', "``"); -man_sgml('</QUOTE>', "''"); - -#man_sgml('<LITERAL>', '"'); -#man_sgml('</LITERAL>', '"'); - -# No special presentation: - -# AUTHOR -# AUTHORINITIALS - -# ABBREV -# ACTION -# ACRONYM -# ALT -# CITATION -# PHRASE -# QUOTE -# WORDASWORD - -# COMPUTEROUTPUT -# MARKUP -# PROMPT -# RETURNVALUE -# SGMLTAG -# TOKEN - -# DATABASE -# HARDWARE -# INTERFACE -# MEDIALABEL - -# There doesn't seem to be a good way to represent LITERAL in -man - - - -######################################################################## -# -# Paragraph and paragraph-like elements -# -######################################################################## - -sub para_start { - output "\n" unless $newline_last++; - - # In lists, etc., don't start paragraph with .PP since - # the indentation will be gone. - - if($_[0]->parent->ext->{'nobreak'}==1) { - # Usually this is the FIRST element of - # a hanging tag, so we MUST not do a full - # paragraph break. - $_[0]->parent->ext->{'nobreak'} = 2; - } elsif($_[0]->parent->ext->{'nobreak'}==2) { - # Usually these are the NEXT elements of - # a hanging tag. If we break using a blank - # line, we're okay. - output "\n"; - } else { - # Normal case. (For indented blocks too, at least - # -man isn't so braindead in this area.) - output ".PP\n"; - } -} -# Actually applies to a few other block elements as well -sub para_end { - output "\n" unless $newline_last++; -} - -sgml('<PARA>', ¶_start); -sgml('</PARA>', ¶_end); -sgml('<SIMPARA>', ¶_start); -sgml('</SIMPARA>', ¶_end); - -# Nothing special, except maybe FIXME set nobreak. -sgml('<INFORMALEXAMPLE>', ¶_start); -sgml('</INFORMALEXAMPLE>', ¶_end); - - - - - -######################################################################## -# -# Blocks using SS sections -# -######################################################################## - -# FIXME: We need to consider the effects of SS -# in a hanging tag :( - -# Complete with the optional-title dilemma (again). -sgml('<ABSTRACT>', sub { - $_[0]->ext->{'title'} = 'ABSTRACT'; - output "\n" unless $newline_last++; - push_output('string'); -}); -sgml('</ABSTRACT>', sub { - my $content = pop_output(); - - # As ABSTRACT is never on the same level as RefSect1, - # this leaves us with only .SS in terms of -man macros. - output ".SS "", uc($_[0]->ext->{'title'}), ""\n"; - - output $content; - output "\n" unless $newline_last++; -}); - -# Ah, I needed a break. Example always has a title. -man_sgml('<EXAMPLE>', "\n.SS "); -sgml('</EXAMPLE>', ¶_end); - -# Same with sidebar. -man_sgml('<SIDEBAR>', "\n.SS "); -sgml('</SIDEBAR>', ¶_end); - -# NO title. -man_sgml('<HIGHLIGHTS>', "\n.SS HIGHLIGHTS\n"); -sgml('</HIGHLIGHTS>', ¶_end); - - - - -######################################################################## -# -# Indented 'Block' elements -# -######################################################################## - -sub indent_block_start -{ - output "\n" unless $newline_last++; - output ".sp\n.RS\n"; -} -sub indent_block_end -{ - output "\n" unless $newline_last++; - output ".RE\n"; -} - -# This element is almost like an admonition (below), -# only the default title is blank :) - -sgml('<BLOCKQUOTE>', sub { - $_[0]->ext->{'title'} = ''; - output "\n" unless $newline_last++; - push_output('string'); -}); -sgml('</BLOCKQUOTE>', sub { - my $content = pop_output(); - - indent_block_start(); - - if($_[0]->ext->{'title'}) { - output ".B "", $_[0]->ext->{'title'}, ":"\n"; - } - - output $content; - - if($_[0]->ext->{'attribution'}) { - output "\n" unless $newline_last++; - # One place where roff's space-sensitivity makes sense :) - output "\n -- "; - output $_[0]->ext->{'attribution'} . "\n"; - } - - indent_block_end(); -}); - -# Set off admonitions from the rest of the text by indenting. -# FIXME: Need to check if this works inside paragraphs, not enclosing them. -sub admonition_end { - my $content = pop_output(); - - indent_block_start(); - - # When the admonition is only one paragraph, - # it looks nicer if the title was inline. - my $num_para; - while ($content =~ /^.PP/gm) { $num_para++ } - if($num_para==1) { - $content =~ s/^.PP\n//; - } - - output ".B "" . $_[0]->ext->{'title'} . ":"\n"; - output $content; - - indent_block_end(); -} - -sgml('<NOTE>', sub { - # We can't see right now whether or not there is a TITLE - # element, so we have to save the output now and add it back - # at the end of this admonition. - $_[0]->ext->{'title'} = 'Note'; - - # Although admonition_end's indent_block_start will do this, - # we need to synchronize the output _now_ - output "\n" unless $newline_last++; - - push_output('string'); -}); -sgml('</NOTE>', &admonition_end); - -# Same as above. -sgml('<WARNING>', sub { - $_[0]->ext->{'title'} = 'Warning'; - output "\n" unless $newline_last++; - push_output('string'); -}); -sgml('</WARNING>', &admonition_end); - -sgml('<TIP>', sub { - $_[0]->ext->{'title'} = 'Tip'; - output "\n" unless $newline_last++; - push_output('string'); -}); -sgml('</TIP>', &admonition_end); -sgml('<CAUTION>', sub { - $_[0]->ext->{'title'} = 'Caution'; - output "\n" unless $newline_last++; - push_output('string'); -}); -sgml('</CAUTION>', &admonition_end); - -sgml('<IMPORTANT>', sub { - $_[0]->ext->{'title'} = 'Important'; - output "\n" unless $newline_last++; - push_output('string'); -}); -sgml('</IMPORTANT>', &admonition_end); - - - - - - - - - - - - -######################################################################## -# -# Verbatim displays. -# -######################################################################## - -sub verbatim_start { - output "\n" unless $newline_last++; - - if($_[0]->parent->ext->{'nobreak'}==1) { - # Usually this is the FIRST element of - # a hanging tag, so we MUST not do a full - # paragraph break. - $_[0]->parent->ext->{'nobreak'} = 2; - } else { - output "\n"; - } - - output(".nf\n") unless $nocollapse_whitespace++; -} - -sub verbatim_end { - output "\n" unless $newline_last++; - output(".fi\n") unless --$nocollapse_whitespace; -} - -sgml('<PROGRAMLISTING>', &verbatim_start); -sgml('</PROGRAMLISTING>', &verbatim_end); - -sgml('<SCREEN>', &verbatim_start); -sgml('</SCREEN>', &verbatim_end); - -sgml('<LITERALLAYOUT>', &verbatim_start); -sgml('</LITERALLAYOUT>', &verbatim_end); - -#sgml('<SYNOPSIS>', sub { -# if($_[0]->attribute('FORMAT')->value =~ /linespecific/i) { -# &verbatim_start; -# } else { -# roffcmd(""); -# } -#}); -# -#sgml('</SYNOPSIS>', sub { -# if($_[0]->attribute('FORMAT')->value =~ /linespecific/i) { -# &verbatim_end; -# } -# else { -# roffcmd("");# not sure about this. -# } -#}); -sgml('<SYNOPSIS>', &verbatim_start); -sgml('</SYNOPSIS>', &verbatim_end); - - - - - - - - - -######################################################################## -# -# Lists -# -######################################################################## - -# Indent nested lists. -sub indent_list_start { - if($list_nestlevel++) { - output "\n" unless $newline_last++; - output ".RS\n"; - } -} -sub indent_list_end { - if(--$list_nestlevel) { - output "\n" unless $newline_last++; - output ".RE\n"; - } -} - -sgml('<VARIABLELIST>', &indent_list_start); -sgml('</VARIABLELIST>', &indent_list_end); -sgml('<ITEMIZEDLIST>', &indent_list_start); -sgml('</ITEMIZEDLIST>', &indent_list_end); -sgml('<ORDEREDLIST>', sub { - indent_list_start(); - $_[0]->ext->{'count'} = 1; -}); -sgml('</ORDEREDLIST>', &indent_list_end); -sgml('<GLOSSLIST>', &indent_list_start); -sgml('</GLOSSLIST>', &indent_list_end); - -# Output content on one line, bolded. -sgml('<TERM>', sub { - output "\n" unless $newline_last++; - output ".TP\n"; - bold_on(); - push_output('string'); -}); -sgml('</TERM>', sub { - my $term = pop_output(); - $term =~ tr/\n/ /; - output $term; - font_off(); - output "\n"; - $newline_last = 1; -}); -sgml('<GLOSSTERM>', sub { - output "\n" unless $newline_last++; - output ".TP\n"; - bold_on(); - push_output('string'); -}); -sgml('</GLOSSTERM>', sub { - my $term = pop_output(); - $term =~ tr/\n/ /; - output $term; - font_off(); - output "\n"; - $newline_last = 1; -}); - -sgml('<LISTITEM>', sub { - # A bulleted list. - if($_[0]->in('ITEMIZEDLIST')) { - output "\n" unless $newline_last++; - output ".TP 0.2i\n\(bu\n"; - } - - # Need numbers. - # Assume Arabic numeration for now. - elsif($_[0]->in('ORDEREDLIST')) { - output "\n" unless $newline_last++; - output ".TP 3\n", $_[0]->parent->ext->{'count'}++, ". \n"; - } - - $_[0]->ext->{'nobreak'} = 1; -}); -sgml('<GLOSSDEF>', sub { - $_[0]->ext->{'nobreak'} = 1; -}); - -sgml('<SIMPLELIST>', sub { - $_[0]->ext->{'first_member'} = 1; -}); - -sgml('<MEMBER>', sub { - my $parent = $_[0]->parent; - - if($parent->attribute('TYPE')->value =~ /Inline/i) { - if($parent->ext->{'first_member'}) { - # If this is the first member don't put any commas - $parent->ext->{'first_member'} = 0; - } else { - output ", "; - } - } elsif($parent->attribute('TYPE')->value =~ /Vert/i) { - output "\n" unless $newline_last++; - output "\n"; - } -}); - - - - - -######################################################################## -# -# Stuff we don't know how to handle (yet) -# -######################################################################## - -# Address blocks: - -# Credit stuff: -# ACKNO -# ADDRESS -# AFFILIATION -# ARTPAGENUMS -# ATTRIBUTION -# AUTHORBLURB -# AUTHORGROUP -# OTHERCREDIT -# HONORIFIC - -# Areas: -# AREA -# AREASET -# AREASPEC - - - - - -######################################################################## -# -# Linkage, cross references -# -######################################################################## - -# Print the URL -sgml('</ULINK>', sub { - output ' <URL:', $_[0]->attribute('URL')->value, '>'; - $newline_last = 0; -}); - -# If cross reference target is a RefEntry, -# output CiteRefEntry-style references. -sgml('<XREF>', sub { - my $id = $_[0]->attribute('LINKEND')->value; - my $manref = $Refs->get("refentry:$id"); - - if($manref) { - my ($title, $sect) = ($manref =~ /(.*)((.*))/); - bold_on(); - output $title; - font_off(); - output $sect; - } else { - $blank_xrefs++ if $write_manpages; - output "[XRef to $id]"; - } - - $newline_last = 0; -}); - -# Anchor - - - - -######################################################################## -# -# Other handlers -# -######################################################################## - -man_sgml('|[lt ]|', '<'); -man_sgml('|[gt ]|', '>'); -man_sgml('|[amp ]|', '&'); - -# -# Default handlers (uncomment these if needed). Right now, these are set -# up to gag on any unrecognised elements, sdata, processing-instructions, -# or entities. -# -# sgml('start_element',sub { die "Unknown element: " . $_[0]->name; }); -# sgml('end_element',''); - -# This is for weeding out and escaping certain characters. -# This looks like it's inefficient since it's done on every line, but -# in reality, SGMLSpm and sgmlspl parsing ESIS takes _much_ longer. - -sgml('cdata', sub -{ - if(!$write_manpages) { return; } - elsif($raw_cdata) { output $_[0]; return; } - - # Escape backslashes - $_[0] =~ s/\/\\/g; - - # In non-'pre'-type elements: - if(!$nocollapse_whitespace) { - # Change tabs to spaces - $_[0] =~ tr/\t/ /; - - # Do not allow indents at beginning of line - # groff chokes on that. - if($newline_last) { - $_[0] =~ s/^ +//; - - # If the line is all blank, don't do anything. - if($_[0] eq '') { return; } - - $_[0] =~ s/^./\&./; - - # Argh... roff doesn't like ' either... - $_[0] =~ s/^'/\&'/; - } - } - - $newline_last = 0; - - output $_[0]; -}); - - -# When in whitespace-collapsing mode, we disallow consecutive newlines. - -sgml('re', sub -{ - if($nocollapse_whitespace || !$newline_last) { - output "\n"; - } - - $newline_last = 1; -}); - -sgml('sdata',sub -{ - if($_[0] =~ /[minus ]/) { output "-"; } - elsif($_[0] =~ /[copy ]/) { output "(C)"; } - elsif($_[0] =~ /[nbsp ]/) { output " "; } - else { die "Unknown SDATA: " . $_[0]; } -}); -sgml('pi',sub { die "Unknown processing instruction: " . $_[0]; }); -sgml('entity',sub { die "Unknown external entity: " . $_[0]->name; }); -sgml('start_subdoc',sub { die "Unknown subdoc entity: " . $_[0]->name; }); -sgml('end_subdoc',''); -sgml('conforming',''); - -1; - diff --git a/external/privoxy/utils/docbook2man/docbook2man-spec.pl.1 b/external/privoxy/utils/docbook2man/docbook2man-spec.pl.1 deleted file mode 100644 index 4d2bf3b..0000000 --- a/external/privoxy/utils/docbook2man/docbook2man-spec.pl.1 +++ /dev/null @@ -1,99 +0,0 @@ -." This manpage has been automatically generated by docbook2man -." from a DocBook document. This tool can be found at: -." http://shell.ipoline.com/~elmert/comp/docbook2X/ -." Please send any bug reports, improvements, comments, patches, -." etc. to Steve Cheng steve@ggi-project.org. -.TH "DOCBOOK2MAN-SPEC.PL" "1" "27 June 2002" "" "" -.SH NAME -docbook2man-spec.pl - convert DocBook RefEntries to man pages -.SH SYNOPSIS - -\fBsgmlspl\fR \fBdocbook2man-spec.pl\fR - - -\fBnsgmls\fR [ \fB\fIsgml document\fB\fR ]\fB| sgmlspl\fR \fBdocbook2man-spec.pl\fR - -.SH "DESCRIPTION" -.PP -\fBdocbook2man\fR is a sgmlspl spec file that produced man -pages (using the -man macros) from DocBook RefEntry markup. -.PP -The program reads ESIS produced by nsgmls (or other SGML parsers) from -standard input. Markup not found in RefEntry is discarded. -.PP -Its output, the converted man pages, are written to the current directory. If -RefMeta information is not specified in a -RefEntry, then the man page will be written to standard -output. -.PP -The file \fImanpage.links\fR will also be created, which contains -any aliases of the manpages generated. This file is in the format: - -.nf -\fI<man page>\fR \fI<alias -manpage>\fR -.fi -.PP -The \fImanpage.refs\fR file keeps track of -XRef references. Note that if the input document has any -forward references, then \fBdocbook2man\fR may have to be -invoked twice (the first time updating \fImanpage.refs\fR) to -resolve them. -.SH "REQUIREMENTS" - -The SGMLSpm package from CPAN. This package includes the sgmlspl script -that is also needed. -.SH "LIMITATIONS" -.PP -Trying \fBdocbook2man\fR on non-DocBook or non-conformant -SGML results in undefined behavior. :-) -.PP -This program is a slow, dodgy Perl script. -.PP -This program does not come close to supporting all the possible markup -in DocBook, and may produce wrong output in some cases with supported -markup. -.SH "TO DO" -.PP -Obvious stuff: -.TP 0.2i -(bu -Fix \fBdocbook2man\fR breakages found in -the test documents, especially -\fIweird.sgml\fR. -.TP 0.2i -(bu -Add new element handling and fix existing handling. -Be robust. -.TP 0.2i -(bu -Produce cleanest, readable man output as possible (unlike some -other converters). Follow Linux -\fBman\fR(7) -convention. As conversion to man pages is usually not done very often, it is -better to be slower/more complicated than to produce wrong output. Also if -someone wants to give up using DocBook for whatever reason, the last-converted -man pages can then be maintained manually. -.TP 0.2i -(bu -Make it faster. I think most of the speed problems so far is with parsing -ESIS. Rewrite \fISGMLS.pm\fR with C and/or get input directly -from \fBSP\fR. -.TP 0.2i -(bu -Support other (human) languages. But what to do with non-ASCII charsets? -SGMLSpm doesn't report them and \fBroff\fR does not grok them. -[Comment: text after enclosed lists (and SS blocks) will break docbook2man] -If we do this, more people can use DocBook. -.SH "COPYRIGHT" -.PP -Copyright (C) 1998-1999 Steve Cheng steve@ggi-project.org -.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, or (at your option) any -later version. -.PP -You should have received a copy of the GNU General Public License along with -this program; see the file \fICOPYING\fR. If not, please write -to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. diff --git a/external/privoxy/utils/filter2docs.pl b/external/privoxy/utils/filter2docs.pl deleted file mode 100755 index b47e92e..0000000 --- a/external/privoxy/utils/filter2docs.pl +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/perl - -# $Id: filter2docs.pl,v 1.6 2009/01/13 16:48:09 fabiankeil Exp $ -# $Source: /cvsroot/ijbswa/current/utils/filter2docs.pl,v $ - -# Parse the filter names and descriptions from a filter file and -# spit out copy&paste-ready markup for the various places in -# configuration and documentation where all filters are listed. - -use strict; -use warnings; - -my (%comment_lines, %action_lines, %sgml_source_1, %sgml_source_2); - -sub main() { - - die "Usage: $0 filter-file\n" unless (@ARGV == 1) ; - open(INPUT, "< $ARGV[0]") or die "Coudln't open input file $ARGV[0] because $!\n"; - - parse_file(); - print_markup(); -} - -sub parse_file() { - while (<INPUT>) { - if (/^((?:(?:SERVER|CLIENT)-HEADER-)?(?:FILTER|TAGGER)): ([-\w]+) (.*)$/) { - my $type_uc = $1; - my $name = $2; - my $description = $3; - my $type = lc($type_uc); - - my $white_space = ' ' x (($type eq 'filter' ? 20 : 27) - length($name)); - - $comment_lines{$type} .= "# $name:" . $white_space . "$description\n"; - $action_lines{$type} .= "+$type" . "{$name} \\n"; - $sgml_source_1{$type} .= " <para>\n <anchor id="$type-$name">\n" . - " <screen>+$type" . "{$name}" . $white_space . - "# $description</screen>\n </para>\n"; - $sgml_source_2{$type} .= ' -<link linkend="' . $type_uc . "-" . - uc($name) . "">$type" . "{$name}</link> \\n"; - } - } -} - -sub print_markup() { - - my @filter_types = ( - 'filter', - 'server-header-filter', - 'client-header-filter', - 'server-header-tagger', - 'client-header-tagger' - ); - - foreach my $type (@filter_types) { - - next unless defined $action_lines{$type}; - - print "=" x 90; - - print <<" DOCMARKUP"; - -Producing $type markup: - -Comment lines for default.action: - -$comment_lines{$type} -Block of $type actions for default.action: - -$action_lines{$type} -SGML Source for AF chapter in U-M: - -$sgml_source_1{$type} -SGML Source for AF Tutorial chapter in U-M: - -$sgml_source_2{$type} - DOCMARKUP - } -} - -main(); diff --git a/external/privoxy/utils/ldp_print/README b/external/privoxy/utils/ldp_print/README deleted file mode 100644 index 833ae0b..0000000 --- a/external/privoxy/utils/ldp_print/README +++ /dev/null @@ -1,80 +0,0 @@ - -###################################################################### - ldp_print - print tool/script for DocBook SGML/XML documents -###################################################################### - - Copyright (C) 2002-2000 - Greg Ferguson (gferg@metalab.unc.edu) - - 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 - -###################################################################### - -This process/script is used in the production environment for the -LDP. It relies on the HTMLDOC software package (GPL'ed) which can be -obtained from the Easy Software Products (c) web site: - - http://www.easysw.com/htmldoc/ - -This process creates a PDF variant from the single-file HTML -representation of a DocBook SGML (or XML) instance. The simple -wrapper script (ldp_print) assumes that the file was created using -{open}jade in a manner similar to: - - jade -t sgml -i html -V nochunks -d $style $fname > $fname.html - -Give the script the filename as an argument. It will then parse the -file into 'title.html' and 'body.html' and send each to htmldoc (as -the corresponding title page and body of the document). - - -CAVEATS -======= - -o Assumes perl is in /usr/bin; adjust if necessary - -o You may need to specify where the htmldoc executable resides. - The script assumes it's within your $PATH. - -o If you want Postscript as an output variant, uncomment the - appropriate lines (see below). - -o Relies on output from a DocBook instance created via DSSSL/{open}jade! - -o Cleans up (removes) the intermediate files it creates (but not the - PDF or Postscript files, obviously!) - -o Works silently; PDF (PostScript) will be created in the same directory - as was specified for the input (single-file HTML) file. - -o Provided without warranty or support! - -o I ran into a problem with htmldoc v1.8.8 which required a source - code change (I was getting a core dump from the htmldoc process). - Here is the change required: - - htmldoc/ps-pdf.cxx : - 3662,3665d3661 - < /* gjf = 11Oct2000 */ - < if( temprow == NULL ) - < break; - < - - UPDATE (2001-10-10): It appears that later versions of htmldoc - have this problem corrected. The patch is not required. - -==== -Greg Ferguson / gferg (at) metalab.unc.edu -11 Jan 2000 - diff --git a/external/privoxy/utils/ldp_print/VERSION b/external/privoxy/utils/ldp_print/VERSION deleted file mode 100644 index 8f00eb7..0000000 --- a/external/privoxy/utils/ldp_print/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.7.0, 2002-04-04 diff --git a/external/privoxy/utils/ldp_print/fix_print_html.lib b/external/privoxy/utils/ldp_print/fix_print_html.lib deleted file mode 100644 index fdb9ab4..0000000 --- a/external/privoxy/utils/ldp_print/fix_print_html.lib +++ /dev/null @@ -1,227 +0,0 @@ -# -# fix_print_html.lib -# -# Dan Scott / <dan.scott (at) acm.org> -# Ferg / <gferg (at) sgi.com> -# -# Used to prepare single-file HTML variant for PDF/Postscript creation -# thru htmldoc. -# -# log: -# 16Oct2000 - 0.1 - initial entry <gferg (at) sgi.com> -# 03Apr2001 - 0.2 - fix for <preface> -# 05Jul2001 - 0.3 - fix for <tt> and -f -# 12Oct2001 - 0.4 - fix for sections; loop thru both files (body/title) -# 27Nov2001 - 0.5 - fixed bug in determining where doc-index lies -# 18Jan2002 - 0.5.1 - entity fix (822*) -# 02Apr2002 - 0.6 - misc fixes (bibliography/appendix, etc). -# 04Apr2002 - 0.7 - fix for newer DSSSL -# - -sub fix_print_html { - - my($in,$out,$ttl) = @_; - - open(IN_FILE, "< $in") || do { - print "fix_print_html: cannot open $in: $!\n"; - return 0; - }; - - my($buf, $ttl_buf) = ''; - my($indx) = -1; - my($is_article) = 1; - while(<IN_FILE>) { - - if( $indx == 1 ) { - - # ignore everything until we see the chapter or sect - # - if( $_ =~ /CLASS="CHAP/i || $_ =~ /CLASS="PREF/i - || - $_ =~ /CLASS="SECT/i ) { - - $buf .= $_; - $indx++; - - } else { - next; - } - - } elsif( $indx == 0 ) { - - # write out the title page file - # - if( $_ =~ /CLASS="TOC"/ ) { - - $ttl_buf .= "></DIV>\n</BODY>\n</HTML>\n"; - $ttl_buf =~ s/</H1\n/</H1\n><P><BR><BR\n/ms; - $ttl_buf =~ s/<HR></DIV\n><HR>/<HR></DIV\n>/ms; - &fix_html($ttl_buf, 1); - - open(TOC_FILE, "> $ttl") || do { - print "fix_print_html: cannot open $ttl: $!\n"; - close(IN_FILE); - return 0; - }; - print TOC_FILE $ttl_buf; - close(TOC_FILE); - $ttl_buf = ''; - $indx++; - - } else { - $ttl_buf .= $_; - } - - } elsif( $indx < 0 ) { - - if( $_ =~ /CLASS="BOOK"/i ) { - $is_article = 0; - } - - # up to this point, both buffers get the line - # - if( $_ =~ /CLASS="TITLEPAGE"/ ) { - - $ttl_buf .= $_ . ">\n<P>\n<BR><BR><BR><BR>\n</P\n"; - $indx++; - - } else { - $buf .= $_; - $ttl_buf .= $_; - } - - } else { - - $buf .= $_; - } - } - close(IN_FILE); - - - # fix body file - # - open(OUT_FILE, "> $out") || do { - print "fix_print_html: cannot open $out: $!\n"; - return 0; - }; - - &fix_html($buf, $is_article); - - print OUT_FILE $buf; - close(OUT_FILE); - - - return 1; -} - - -sub fix_html { - - my($buf, $is_article) = @_; - my($indx) = -1; - - - # make corrections and write out the file - # - - $$buf =~ s/(\n><LI\n)><P\n(.*?)</P\n>/$1$2\n/gms; - $$buf =~ s/(\n><LI\n><DIV\nCLASS="FORMALPARA"\n)><P\n(.*?)</P\n>/$1$2\n/gms; - $$buf =~ s/(\n><LI\nSTYLE="[^"]+"\n)><P\n(.*?)</P\n>/$1$2\n/gms; - if( $is_article == 0 ) { - $$buf =~ - s/(\nCLASS="SECT[TION\d]+"\n>)<H1\n(.*?)</H1/$1<H0\n$2</H0/gims; - $$buf =~ - s/(\nCLASS="SECT[TION\d]+"\n><HR>)<H1\n(.*?)</H1/$1<H0\n$2</H0/gims; - } - $$buf =~ s/<H1(\nCLASS="INDEXDIV"\n)(.*?)</H1/<H2$1$2</H2/gims; - if( ($indx = rindex($$buf, "<H1\n><A\nNAME="DOC-INDEX"")) > -1 ) { - $$buf = substr($$buf, 0, $indx); - $$buf .= "\n</BODY>\n</HTML>\n\n"; - } elsif( ($indx = rindex($$buf, "<H1\n><A\nNAME="doc-index"")) > -1 ) { - $$buf = substr($$buf, 0, $indx); - $$buf .= "\n</BODY>\n</HTML>\n\n"; - } - - $$buf =~ s/ //g; - $$buf =~ s/</</g; - $$buf =~ s/>/>/g; - $$buf =~ s/–/-/g; - $$buf =~ s/“/"/g; - $$buf =~ s/”/"/g; - $$buf =~ s/WIDTH="\d"//g; - $$buf =~ s/><[/]*TBODY//g; - $$buf =~ s/><[/]*THEAD//g; - $$buf =~ s/TYPE="1"\n//gim; - - $$buf =~ s/<P\nCLASS="LITERALLAYOUT"(.*?)</P/<P CLASS="LITERALLAYOUT"><FONT FACE="courier"$1</FONT></P/gms; - - my($cnt, $j) = 0; - - if( $$buf !~ /<H1/ ) { - - # for newer docbook styles, set h2 to h1, etc. - # - for($cnt=2; $cnt < 7; $cnt++ ) { - $j = $cnt - 1; - $$buf =~ s/<H${cnt}/<H${j}/g; - $$buf =~ s/</H${cnt}/</H${j}/g; - } - - } elsif( $is_article == 0 ) { - - # decrement the headers by 1 and then re-set the - # chapter level only to H1... - # - for($cnt=5; $cnt >= 0; $cnt--) { - $j = $cnt + 1; - if( $cnt == 0 ) { - $j = 2; - } - $$buf =~ s/<H${cnt}/<H${j}/g; - $$buf =~ s/</H${cnt}/</H${j}/g; - } - - my(@l) = split(/\n/, $$buf); - for( $cnt=0; $cnt < (@l + 0); $cnt++ ) { - - if( $j == 1 ) { - if( $l[$cnt] =~ /<DIV/ ) { - $j = 0; - next; - } - $l[$cnt] =~ s/<H2/<H1/g; - $l[$cnt] =~ s/</H2/</H1/g; - } - - if( $l[$cnt] =~ /^CLASS="CHAP/i - || - $l[$cnt] =~ /^NAME="BIBL/i - || - $l[$cnt] =~ /^CLASS="APPENDIX/i - || - $l[$cnt] =~ /^CLASS="GLOSSARY/i - || - $l[$cnt] =~ /^CLASS="PREF/i ) { - $j = 1; - } - } - - $$buf = join("\n", @l); - - } - $$buf =~ s/><DIV\nCLASS="\w+"\n//gms; - $$buf =~ s/></DIV\n//gms; - - $buf =~ s/<SPAN\n[^>]*?>//gms; - $buf =~ s/</SPAN\n>//gms; - - $$buf =~ s/(><LI\n)><P\n(.*?)</P\n>(</LI\n)/$1$2$3/gms; - - return; -} - - -# Return true from package include -# -1; - diff --git a/external/privoxy/utils/ldp_print/ldp_print b/external/privoxy/utils/ldp_print/ldp_print deleted file mode 100755 index 35b6053..0000000 --- a/external/privoxy/utils/ldp_print/ldp_print +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/perl -w -# -# usage: ldp_print <single_file.html> -# -# Creates a PDF variant of a single-file HTML representation of a -# DocBook SGML (or XML) instance. This simple wrapper assumes that -# the file was created using {open}jade in a manner similar to: -# -# jade -t sgml -i html -V nochunks -d $style $fname > $fname.html -# -# Give this script the filename as an argument. It will then parse -# the file into 'title.html' and 'body.html' and send each to -# htmldoc (as the corresponding title page and body of the document). -# -# -# CAVEATS: -# -# Assumes perl is in /usr/bin; adjust if necessary -# -# You may need to specify where the htmldoc executable resides. -# The script assumes it's within your $PATH. -# -# If you want Postscript as an output variant, uncomment the -# appropriate lines (see below). -# -# Relies on output from a DocBook instance created via DSSSL/{open}jade! -# -# Cleans up (removes) the intermediate files it creates (but not the -# PDF or Postscript files, obviously!) -# -# Works silently; PDF (PostScript) will be created in the same directory -# as was specified for the input (single-file HTML) file. -# -# Provided without warranty or support! -# -# gferg@sgi.com / Ferg (used as part of the LDP production env) -# - -use strict; -push(@INC, "./"); -require 'fix_print_html.lib'; - -if( $ARGV[0] eq '' || !(-r $ARGV[0]) ) { - die "\nusage: ldp_print <single_file.html>\n\n"; -} - -my($fname_wo_ext) = $ARGV[0]; -$fname_wo_ext =~ s/.[\w]+$//; - - -# create new files from single HTML file to use for print -# -&fix_print_html($ARGV[0], 'body.html', 'title.html'); - -my($cmd) = "htmldoc --size universal --bodyfont helvetica --fontsize 8 " . - "-t pdf -f ${fname_wo_ext}.pdf --firstpage p1 --titlefile title.html" . - " body.html --footer c.1"; - -# For postscript output; append onto the above cmd string: -# -# "; htmldoc --size universal -t ps -f ${fname_wo_ext}.ps " . -# "--firstpage p1 --titlefile title.html body.html"; -# -system($cmd); -die "\nldp_print: could not create ${fname_wo_ext}.pdf ($!)\n" if ($?); - -# cleanup -# -system("rm -f body.html title.html"); - -exit(0); - diff --git a/external/privoxy/utils/prepare-configfile.pl b/external/privoxy/utils/prepare-configfile.pl deleted file mode 100755 index e3b2b55..0000000 --- a/external/privoxy/utils/prepare-configfile.pl +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/local/bin/perl - -use strict; -use warnings; - -sub main() { - my $hit_header = 0; - my $hit_option = 0; - my $header_len; - - while (<>) { - s/^1. @@TITLE@@/ /i; - - if (m/^(\d.)(\d.)(\d.)?\s/) { - # Remove the first digit as it's the - # config file section in the User Manual. - s/^(\d.)//; - - # If it's a section header, uppercase it. - $_ = uc() if (/^\d.\s+/); - - # Remember to underline it. - $hit_header = 1; - $header_len = length($_); - } - - s/^/# /; - - # XXX: someone should figure out what this stuff - # is supposed to do (and if it really does that). - s/^# #/####/ if /^# #{12,}/; - s/^.*$// if $hit_option; - $hit_option = 0; - s/^\n//; - s/^#\s*-{20,}//; - s/ *$//; - $hit_option = 1 if s/^#\s+@@//; - - print; - - if ($hit_header) { - # The previous line was a section - # header so we better underline it. - die "Invalid header length" unless defined $header_len; - print "# " . "=" x $header_len . "\n"; - $hit_header = 0; - }; - } -} -main(); diff --git a/external/privoxy/vc_config_pthreads.h b/external/privoxy/vc_config_pthreads.h deleted file mode 100644 index 638f5bd..0000000 --- a/external/privoxy/vc_config_pthreads.h +++ /dev/null @@ -1,484 +0,0 @@ -#ifndef CONFIG_H_INCLUDED -#define CONFIG_H_INCLUDED -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/vc_config_pthreads.h,v $ - * - * Purpose : This file should be the first thing included in every - * .c file. (Before even system headers). It contains - * #define statements for various features. It was - * introduced because the compile command line started - * getting ludicrously long with feature defines. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * 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: vc_config_pthreads.h,v $ - * Revision 1.6 2008/03/27 18:27:38 fabiankeil - * Remove kill-popups action. - * - * Revision 1.5 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.3 2002/05/03 22:54:24 jongfoster - * Version number bump to 2.9.15 - * - * Revision 1.2 2002/04/26 18:26:09 jongfoster - * Bumping version numbers - * - * Revision 1.1 2002/04/06 20:38:01 jongfoster - * Renaming VC++ versions of config.h - * - * Revision 1.20 2002/04/03 22:28:03 gliptak - * Removed references to gnu_regex - * - * Revision 1.19 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.18 2002/03/24 17:08:12 jongfoster - * Version number bump - * - * Revision 1.17 2002/03/24 13:33:26 swa - * name change related issues - * - * Revision 1.16 2002/03/16 14:27:22 jongfoster - * Ignoring a very common warning. - * - * Revision 1.15 2002/03/13 00:28:32 jongfoster - * Hiding all the warnings generated by #include<windows.h> - * - * Revision 1.14 2001/11/30 21:35:54 jongfoster - * Bumping version number to 2.9.10 - * - * Revision 1.13 2001/10/23 21:24:09 jongfoster - * Support for FEATURE_CGI_EDIT_ACTIONS - * - * Revision 1.12 2001/10/07 15:33:14 oes - * Removed FEATURE_DENY_GZIP - * Bumped up version number - * - * Revision 1.11 2001/09/16 16:59:34 jongfoster - * Bugfix - couldn't build resources with previous version. - * - * Revision 1.10 2001/09/16 16:19:02 jongfoster - * New version based on latest configure.in and acconfig.h - * - * Revision 1.9 2001/07/30 22:16:07 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.8 2001/07/25 19:16:27 oes - * Bumping version number to 2.9.8 - * - * Revision 1.7 2001/07/21 18:00:07 jongfoster - * Bumping version number to 2.9.7 - * - * Revision 1.6 2001/07/15 20:08:40 jongfoster - * New build files for VC++ which provide the option of POSIX - * or Win32 threads. - * - * Revision 1.5 2001/07/15 18:00:46 jongfoster - * Renaming STATIC to STATIC_PCRE. - * Replacing this file with one built by "configure" from - * "config.h.in", for consistency. - * - * Revision 1.6 2001/07/15 17:54:29 jongfoster - * Renaming #define STATIC to STATIC_PCRE - * Adding new #define FEATURE_PTHREAD that will be used to enable - * POSIX threads support. - * - * Revision 1.5 2001/07/13 13:48:37 oes - * - (Fix:) Copied CODE_STATUS #define from config.h.in - * - split REGEX #define into REGEX_GNU and REGEX_PCRE - * and removed PCRE. - * (REGEX = REGEX_GNU || REGEX_PCRE per project.h) - * - Moved STATIC (for pcre) here from Makefile.in - * - Introduced STATIC_PCRS #define to allow for dynaimc linking with - * libpcrs - * - Removed PCRS #define, since pcrs is now needed for CGI anyway - * - * Revision 1.4 2001/05/29 09:50:24 jongfoster - * Unified blocklist/imagelist/permissionslist. - * File format is still under discussion, but the internal changes - * are (mostly) done. - * - * Also modified interceptor behaviour: - * - We now intercept all URLs beginning with one of the following - * prefixes (and *only* these prefixes): - * * http://i.j.b/ - * * http://ijbswa.sf.net/config/ - * * http://ijbswa.sourceforge.net/config/ - * - New interceptors "home page" - go to http://i.j.b/ to see it. - * - Internal changes so that intercepted and fast redirect pages - * are not replaced with an image. - * - Interceptors now have the option to send a binary page direct - * to the client. (i.e. ijb-send-banner uses this) - * - Implemented show-url-info interceptor. (Which is why I needed - * the above interceptors changes - a typical URL is - * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". - * The previous mechanism would not have intercepted that, and - * if it had been intercepted then it then it would have replaced - * it with an image.) - * - * Revision 1.3 2001/05/26 01:26:34 jongfoster - * New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor. - * This #define cannot be set from ./configure - there's no point, it - * doesn't work yet. See feature request # 425722 - * - * Revision 1.2 2001/05/22 17:43:35 oes - * - * - Enabled filtering banners by size rather than URL - * by adding patterns that replace all standard banner - * sizes with the "Junkbuster" gif to the re_filterfile - * - * - Enabled filtering WebBugs by providing a pattern - * which kills all 1x1 images - * - * - Added support for PCRE_UNGREEDY behaviour to pcrs, - * which is selected by the (nonstandard and therefore - * capital) letter 'U' in the option string. - * It causes the quantifiers to be ungreedy by default. - * Appending a ? turns back to greedy (!). - * - * - Added a new interceptor ijb-send-banner, which - * sends back the "Junkbuster" gif. Without imagelist or - * MSIE detection support, or if tinygif = 1, or the - * URL isn't recognized as an imageurl, a lame HTML - * explanation is sent instead. - * - * - Added new feature, which permits blocking remote - * script redirects and firing back a local redirect - * to the browser. - * The feature is conditionally compiled, i.e. it - * can be disabled with --disable-fast-redirects, - * plus it must be activated by a "fast-redirects" - * line in the config file, has its own log level - * and of course wants to be displayed by show-proxy-args - * Note: Boy, all the #ifdefs in 1001 locations and - * all the fumbling with configure.in and acconfig.h - * were *way* more work than the feature itself :-( - * - * - Because a generic redirect template was needed for - * this, tinygif = 3 now uses the same. - * - * - Moved GIFs, and other static HTTP response templates - * to project.h - * - * - Many minor fixes - * - * - Removed some >400 CRs again (Jon, you really worked - * a lot! ;-) - * - * Revision 1.1.1.1 2001/05/15 13:58:45 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -/* - * Version number - Major (X._._) - */ -#define VERSION_MAJOR 2 - -/* - * Version number - Minor (_.X._) - */ -#define VERSION_MINOR 9 - -/* - * Version number - Point (_._.X) - */ -#define VERSION_POINT 15 - -/* - * Version number, as a string - */ -#define VERSION "2.9.15" - -/* - * Status of the code: alpha, beta or stable - */ -#define CODE_STATUS "beta" - -/* - * Regular expression matching for URLs. (Highly recommended). - * If neither of these are defined then you can ony use prefix matching. - * Don't bother to change this here! Use configure instead. - */ -#define REGEX_PCRE 1 - -/* - * Should pcre be statically built in instead of linkling with libpcre? - * (This is determined by configure depending on the availiability of - * libpcre and user preferences). The name is ugly, but pcre needs it. - * Don't bother to change this here! Use configure instead. - */ -#define STATIC_PCRE 1 - -/* - * Should pcrs be statically built in instead of linkling with libpcrs? - * (This is determined by configure depending on the availiability of - * libpcrs and user preferences). - * Don't bother to change this here! Use configure instead. - */ -#define STATIC_PCRS 1 - -/* - * Allows the use of an ACL to control access to the proxy by IP address. - */ -#define FEATURE_ACL 1 - -/* - * Enables the web-based configuration (actionsfile) editor. If you - * have a shared proxy, you might want to turn this off. - */ -#define FEATURE_CGI_EDIT_ACTIONS 1 - -/* - * Allows the use of jar files to capture cookies. - */ -#define FEATURE_COOKIE_JAR 1 - -/* - * Locally redirect remote script-redirect URLs - */ -#define FEATURE_FAST_REDIRECTS 1 - -/* - * Bypass filtering for 1 page only - */ -#define FEATURE_FORCE_LOAD 1 - -/* - * Allow blocking using images as well as HTML. - * If you do not define this then everything is blocked as HTML. - * - * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE. - */ -#define FEATURE_IMAGE_BLOCKING 1 - -/* - * Detect image requests automatically for MSIE. Will fall back to - * other image-detection methods (i.e. "+image" permission) for other - * browsers. - * - * You must also define FEATURE_IMAGE_BLOCKING to use this feature. - * - * It detects the following header pair as an image request: - * - * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) - * Accept: * / * - * - * And the following as a HTML request: - * - * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) - * Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, * / * - * - * And no, I haven't got that backwards - IE is being wierd. - * - * Known limitations: - * 1) If you press shift-reload on a blocked HTML page, you get - * the image "blocked" page, not the HTML "blocked" page. - * 2) Once an image "blocked" page has been sent, viewing it - * in it's own browser window *should* bring up the HTML - * "blocked" page, but it doesn't. You need to clear the - * browser cache to get the HTML version again. - * - * These limitations are due to IE making inconsistent choices - * about which "Accept:" header to send. - */ -#define FEATURE_IMAGE_DETECT_MSIE 1 - -/* - * Use POSIX threads instead of native threads. - */ -#define FEATURE_PTHREAD 1 - -/* - * Enables statistics function. - */ -#define FEATURE_STATISTICS 1 - -/* - * Allow JunkBuster to be "disabled" so it is just a normal non-blocking - * non-anonymizing proxy. This is useful if you're trying to access a - * blocked or broken site - just change the setting in the config file, - * or use the handy "Disable" menu option in the Windows GUI. - */ -#define FEATURE_TOGGLE 1 - -/* - * Allows the use of trust files. - */ -#define FEATURE_TRUST 1 - - -/**************************************************************************** - * The following values are correct for MS VC++97. - * You should normally not change them. - ***************************************************************************/ - - -/* - * Defined on Solaris only. Makes the system libraries thread safe. - */ -/* #define _REENTRANT 1 */ - -/* - * Defined on Solaris only. Without this, many important functions are not - * defined in the system headers. - */ -/* #define __EXTENSIONS__ 1 */ - -/* - * Defined always. - * FIXME: Don't know what it does or why we need it. - * (presumably something to do with MultiThreading?) - */ -#define __MT__ 1 - - -/* Define if you have the `bcopy' function. */ -/* #define HAVE_BCOPY 1 */ - -/* Define if you have the <inttypes.h> header file. */ -/* #define HAVE_INTTYPES_H 1 */ - -/* Define if you have the `memmove' function. */ -#define HAVE_MEMMOVE 1 - -/* Define if you have the <memory.h> header file. */ -#define HAVE_MEMORY_H 1 - -/* Define if you have the <stdint.h> header file. */ -/* #define HAVE_STDINT_H 1 */ - -/* Define if you have the <stdlib.h> header file. */ -#define HAVE_STDLIB_H 1 - -/* Define if you have the `strerror' function. */ -#define HAVE_STRERROR 1 - -/* Define if you have the <strings.h> header file. */ -/* #define HAVE_STRINGS_H 1 */ - -/* Define if you have the <string.h> header file. */ -#define HAVE_STRING_H 1 - -/* Define if you have the <sys/stat.h> header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define if you have the <unistd.h> header file. */ -/* #define HAVE_UNISTD_H 1 */ - -/* The size of a `char *', as computed by sizeof. */ -#define SIZEOF_CHAR_P 4 - -/* The size of a `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of a `long', as computed by sizeof. */ -#define SIZEOF_LONG 4 - -/* The size of a `long long', as computed by sizeof. */ -/* #define SIZEOF_LONG_LONG ---not supported--- */ - -/* The size of a `size_t', as computed by sizeof. */ -#define SIZEOF_SIZE_T 4 - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #define const */ - -/* Define to `unsigned' if <sys/types.h> does not define. */ -/* #define size_t unsigned */ - -/* - * Defined always. - * FIXME: Don't know what it does or why we need it. - * (presumably something to do with ANSI Standard C?) - */ -/* Don't define for MS VC++ or you don't get strdup() declared. -#ifndef __STDC__ -#define __STDC__ 1 -#endif -*/ - -/* - * Need to set up this define only for the Pthreads library for - * Win32, available from http://sources.redhat.com/pthreads-win32/ - */ -#if defined(FEATURE_PTHREAD) && defined(_WIN32) -#define __CLEANUP_C -#endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */ - -/* - * BEOS does not currently support POSIX threads. - * This *should* be detected by ./configure, but let's be sure. - */ -#if defined(FEATURE_PTHREAD) && defined(__BEOS__) -#error BEOS does not support pthread - please run ./configure again with "--disable-pthread" - -#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */ - - -#if (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) -#error This file is only intended for MS VC++ on Win32. For other compilers, please run configure. -#endif /* (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) */ - -#pragma warning ( disable: 4100 4115 4201 4214 4244 4514 ) - -/* - * C4100 : unreferenced formal parameter - * Very common, not a bug - * - * C4115 : named type definition in parentheses - * #include <windows.h> causes a warning about one of these. - * - * C4201 : nonstandard extension used : nameless struct/union - * Endemic in <windows.h> - * - * C4214 nonstandard extension used : bit field types other than int - * Endemic in <windows.h> - * - * C4244 conversion from 'int' to 'char', possible loss of data - * Should really fix this one. Throughout the JB code. - * - * C4514 unreferenced inline/local function has been removed - * Caused by #include <windows.h> - */ - -#endif /* CONFIG_H_INCLUDED */ - diff --git a/external/privoxy/vc_config_winthreads.h b/external/privoxy/vc_config_winthreads.h deleted file mode 100644 index ca863a9..0000000 --- a/external/privoxy/vc_config_winthreads.h +++ /dev/null @@ -1,675 +0,0 @@ -#ifndef CONFIG_H_INCLUDED -#define CONFIG_H_INCLUDED -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/vc_config_winthreads.h,v $ - * - * Purpose : This file should be the first thing included in every - * .c file. (Before even system headers). It contains - * #define statements for various features. It was - * introduced because the compile command line started - * getting ludicrously long with feature defines. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * 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: vc_config_winthreads.h,v $ - * Revision 1.6 2008/03/27 18:27:39 fabiankeil - * Remove kill-popups action. - * - * Revision 1.5 2006/07/18 14:48:47 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.3.2.1 2006/04/08 21:57:26 david__schmidt - * Synchronize with a more modern copy of config.h. - * - * Revision 1.3 2002/05/03 22:54:24 jongfoster - * Version number bump to 2.9.15 - * - * Revision 1.2 2002/04/26 18:26:09 jongfoster - * Bumping version numbers - * - * Revision 1.1 2002/04/06 20:38:01 jongfoster - * Renaming VC++ versions of config.h - * - * Revision 1.14 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.13 2002/03/24 17:08:12 jongfoster - * Version number bump - * - * Revision 1.12 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.11 2002/03/16 14:27:22 jongfoster - * Ignoring a very common warning. - * - * Revision 1.10 2002/03/13 00:28:32 jongfoster - * Hiding all the warnings generated by #include<windows.h> - * - * Revision 1.9 2001/11/30 21:35:54 jongfoster - * Bumping version number to 2.9.10 - * - * Revision 1.8 2001/10/23 21:24:09 jongfoster - * Support for FEATURE_CGI_EDIT_ACTIONS - * - * Revision 1.7 2001/10/07 15:33:14 oes - * Removed FEATURE_DENY_GZIP - * Bumped up version number - * - * Revision 1.6 2001/09/16 16:59:34 jongfoster - * Bugfix - couldn't build resources with previous version. - * - * Revision 1.5 2001/09/16 16:19:02 jongfoster - * New version based on latest configure.in and acconfig.h - * - * Revision 1.9 2001/07/30 22:16:07 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.8 2001/07/25 19:16:27 oes - * Bumping version number to 2.9.8 - * - * Revision 1.7 2001/07/21 18:00:07 jongfoster - * Bumping version number to 2.9.7 - * - * Revision 1.6 2001/07/15 20:08:40 jongfoster - * New build files for VC++ which provide the option of POSIX - * or Win32 threads. - * - * Revision 1.5 2001/07/15 18:00:46 jongfoster - * Renaming STATIC to STATIC_PCRE. - * Replacing this file with one built by "configure" from - * "config.h.in", for consistency. - * - * Revision 1.6 2001/07/15 17:54:29 jongfoster - * Renaming #define STATIC to STATIC_PCRE - * Adding new #define FEATURE_PTHREAD that will be used to enable - * POSIX threads support. - * - * Revision 1.5 2001/07/13 13:48:37 oes - * - (Fix:) Copied CODE_STATUS #define from config.h.in - * - split REGEX #define into REGEX_GNU and REGEX_PCRE - * and removed PCRE. - * (REGEX = REGEX_GNU || REGEX_PCRE per project.h) - * - Moved STATIC (for pcre) here from Makefile.in - * - Introduced STATIC_PCRS #define to allow for dynaimc linking with - * libpcrs - * - Removed PCRS #define, since pcrs is now needed for CGI anyway - * - * Revision 1.4 2001/05/29 09:50:24 jongfoster - * Unified blocklist/imagelist/permissionslist. - * File format is still under discussion, but the internal changes - * are (mostly) done. - * - * Also modified interceptor behaviour: - * - We now intercept all URLs beginning with one of the following - * prefixes (and *only* these prefixes): - * * http://i.j.b/ - * * http://ijbswa.sf.net/config/ - * * http://ijbswa.sourceforge.net/config/ - * - New interceptors "home page" - go to http://i.j.b/ to see it. - * - Internal changes so that intercepted and fast redirect pages - * are not replaced with an image. - * - Interceptors now have the option to send a binary page direct - * to the client. (i.e. ijb-send-banner uses this) - * - Implemented show-url-info interceptor. (Which is why I needed - * the above interceptors changes - a typical URL is - * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". - * The previous mechanism would not have intercepted that, and - * if it had been intercepted then it then it would have replaced - * it with an image.) - * - * Revision 1.3 2001/05/26 01:26:34 jongfoster - * New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor. - * This #define cannot be set from ./configure - there's no point, it - * doesn't work yet. See feature request # 425722 - * - * Revision 1.2 2001/05/22 17:43:35 oes - * - * - Enabled filtering banners by size rather than URL - * by adding patterns that replace all standard banner - * sizes with the "Junkbuster" gif to the re_filterfile - * - * - Enabled filtering WebBugs by providing a pattern - * which kills all 1x1 images - * - * - Added support for PCRE_UNGREEDY behaviour to pcrs, - * which is selected by the (nonstandard and therefore - * capital) letter 'U' in the option string. - * It causes the quantifiers to be ungreedy by default. - * Appending a ? turns back to greedy (!). - * - * - Added a new interceptor ijb-send-banner, which - * sends back the "Junkbuster" gif. Without imagelist or - * MSIE detection support, or if tinygif = 1, or the - * URL isn't recognized as an imageurl, a lame HTML - * explanation is sent instead. - * - * - Added new feature, which permits blocking remote - * script redirects and firing back a local redirect - * to the browser. - * The feature is conditionally compiled, i.e. it - * can be disabled with --disable-fast-redirects, - * plus it must be activated by a "fast-redirects" - * line in the config file, has its own log level - * and of course wants to be displayed by show-proxy-args - * Note: Boy, all the #ifdefs in 1001 locations and - * all the fumbling with configure.in and acconfig.h - * were *way* more work than the feature itself :-( - * - * - Because a generic redirect template was needed for - * this, tinygif = 3 now uses the same. - * - * - Moved GIFs, and other static HTTP response templates - * to project.h - * - * - Many minor fixes - * - * - Removed some >400 CRs again (Jon, you really worked - * a lot! ;-) - * - * Revision 1.1.1.1 2001/05/15 13:58:45 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -/* - * Version number - Major (X._._) - */ -#define VERSION_MAJOR 0 - -/* - * Version number - Minor (_.X._) - */ -#define VERSION_MINOR 0 - -/* - * Version number - Point (_._.X) - */ -#define VERSION_POINT 0 - -/* - * Version number, as a string - */ -#define VERSION "0.0.0" - -/* - * Status of the code: alpha, beta or stable - */ -#define CODE_STATUS "UNRELEASED" - -/* - * Regular expression matching for URLs. (Highly recommended). - * If neither of these are defined then you can ony use prefix matching. - * Don't bother to change this here! Use configure instead. - */ -/* #define REGEX_GNU 1 */ -#define REGEX_PCRE 1 - -/* - * Should pcre be statically built in instead of linkling with libpcre? - * (This is determined by configure depending on the availiability of - * libpcre and user preferences). The name is ugly, but pcre needs it. - * Don't bother to change this here! Use configure instead. - */ -#define STATIC_PCRE 1 - -/* - * Should pcrs be statically built in instead of linkling with libpcrs? - * (This is determined by configure depending on the availiability of - * libpcrs and user preferences). - * Don't bother to change this here! Use configure instead. - */ -#define STATIC_PCRS 1 - -/* - * Allows the use of an ACL to control access to the proxy by IP address. - */ -#define FEATURE_ACL 1 - -/* - * Enables the web-based configuration (actionsfile) editor. If you - * have a shared proxy, you might want to turn this off. - */ -#define FEATURE_CGI_EDIT_ACTIONS 1 - -/* - * Allows the use of jar files to capture cookies. - */ -#define FEATURE_COOKIE_JAR 1 - -/* - * Locally redirect remote script-redirect URLs - */ -#define FEATURE_FAST_REDIRECTS 1 - -/* - * Bypass filtering for 1 page only - */ -#define FEATURE_FORCE_LOAD 1 - -/* - * Allow blocking using images as well as HTML. - * If you do not define this then everything is blocked as HTML. - * - * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE. - */ -#define FEATURE_IMAGE_BLOCKING 1 - -/* - * Detect image requests automatically for MSIE. Will fall back to - * other image-detection methods (i.e. "+image" permission) for other - * browsers. - * - * You must also define FEATURE_IMAGE_BLOCKING to use this feature. - * - * It detects the following header pair as an image request: - * - * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) - * Accept: * / * - * - * And the following as a HTML request: - * - * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) - * Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, * / * - * - * And no, I haven't got that backwards - IE is being wierd. - * - * Known limitations: - * 1) If you press shift-reload on a blocked HTML page, you get - * the image "blocked" page, not the HTML "blocked" page. - * 2) Once an image "blocked" page has been sent, viewing it - * in it's own browser window *should* bring up the HTML - * "blocked" page, but it doesn't. You need to clear the - * browser cache to get the HTML version again. - * - * These limitations are due to IE making inconsistent choices - * about which "Accept:" header to send. - */ -#define FEATURE_IMAGE_DETECT_MSIE 1 - -/* - * Use PNG instead of GIF for built-in images - */ -/* #undef FEATURE_NO_GIFS */ - -/* - * Use POSIX threads instead of native threads. - */ -/* #define FEATURE_PTHREAD 1 */ - -/* - * Enables statistics function. - */ -#define FEATURE_STATISTICS 1 - -/* - * Allow JunkBuster to be "disabled" so it is just a normal non-blocking - * non-anonymizing proxy. This is useful if you're trying to access a - * blocked or broken site - just change the setting in the config file, - * or use the handy "Disable" menu option in the Windows GUI. - */ -#define FEATURE_TOGGLE 1 - -/* - * Allows the use of trust files. - */ -#define FEATURE_TRUST 1 - - -/**************************************************************************** - * The following values are correct for MS VC++97. - * You should normally not change them. - ***************************************************************************/ - - -/* - * Defined on Solaris only. Makes the system libraries thread safe. - */ -/* #define _REENTRANT 1 */ - -/* - * Defined on Solaris only. Without this, many important functions are not - * defined in the system headers. - */ -/* #define __EXTENSIONS__ 1 */ - -/* - * Defined always. - * FIXME: Don't know what it does or why we need it. - * (presumably something to do with MultiThreading?) - */ -#define __MT__ 1 - -/* If the (nonstandard and thread-safe) function gethostbyname_r - * is available, select which signature to use - */ -/* #undef HAVE_GETHOSTBYNAME_R_6_ARGS */ -/* #undef HAVE_GETHOSTBYNAME_R_5_ARGS */ -/* #undef HAVE_GETHOSTBYNAME_R_3_ARGS */ - -/* If the (nonstandard and thread-safe) function gethostbyaddr_r - * is available, select which signature to use - */ -/* #undef HAVE_GETHOSTBYADDR_R_8_ARGS */ -/* #undef HAVE_GETHOSTBYADDR_R_7_ARGS */ -/* #undef HAVE_GETHOSTBYADDR_R_5_ARGS */ - -/* Defined if you have gmtime_r and localtime_r with a signature - * of (struct time *, struct tm *) - */ -#undef HAVE_GMTIME_R - -/* #define HAVE_LOCALTIME_R 1 */ - -/* Define to 'int' if <sys/socket.h> doesn't have it. - */ -#define socklen_t int - -/* Define if pcre.h must be included as <pcre/pcre.h> - */ -/* #undef PCRE_H_IN_SUBDIR */ - -/* Define if pcreposix.h must be included as <pcre/pcreposix.h> - */ -/* #undef PCREPOSIX_H_IN_SUBDIR */ - - -/* Define to 1 if you have the <arpa/inet.h> header file. */ -#define HAVE_ARPA_INET_H 1 - -/* Define to 1 if you have the `atexit' function. */ -#define HAVE_ATEXIT 1 - -/* Define if you have the `bcopy' function. */ -/* #define HAVE_BCOPY 1 */ - -/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'. - */ -#define HAVE_DIRENT_H 1 - -/* Define to 1 if you have the <errno.h> header file. */ -#define HAVE_ERRNO_H 1 - -/* Define to 1 if you have the <fcntl.h> header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if you have the `getcwd' function. */ -#define HAVE_GETCWD 1 - -/* Define to 1 if you have the `gethostbyaddr' function. */ -#define HAVE_GETHOSTBYADDR 1 - -/* Define to 1 if you have the `gethostbyname' function. */ -#define HAVE_GETHOSTBYNAME 1 - -/* Define to 1 if you have the `inet_ntoa' function. */ -#define HAVE_INET_NTOA 1 - -/* Define if you have the <inttypes.h> header file. */ -/* #define HAVE_INTTYPES_H 1 */ - -/* Define to 1 if you have the `nsl' library (-lnsl). */ -/* #undef HAVE_LIBNSL */ - -/* Define to 1 if you have the <limits.h> header file. */ -#define HAVE_LIMITS_H 1 - -/* Define to 1 if you have the <locale.h> header file. */ -#define HAVE_LOCALE_H 1 - -/* Define to 1 if you have the `localtime_r' function. */ -#undef HAVE_LOCALTIME_R - -/* Define to 1 if you have the `memchr' function. */ -#define HAVE_MEMCHR 1 - -/* Define if you have the `memmove' function. */ -#define HAVE_MEMMOVE 1 - -/* Define if you have the <memory.h> header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `memset' function. */ -#define HAVE_MEMSET 1 - -/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ -/* #undef HAVE_NDIR_H */ - -/* Define to 1 if you have the <netdb.h> header file. */ -#define HAVE_NETDB_H 1 - -/* Define to 1 if you have the <netinet/in.h> header file. */ -#define HAVE_NETINET_IN_H 1 - -/* Define to 1 if you have the <OS.h> header file. */ -/* #undef HAVE_OS_H */ - -/* Define to 1 if you have the `regcomp' function. */ -#define HAVE_REGCOMP 1 - -/* Define to 1 if you have the `select' function. */ -#define HAVE_SELECT 1 - -/* Define to 1 if you have the `setlocale' function. */ -#define HAVE_SETLOCALE 1 - -/* Define to 1 if you have the `socket' function. */ -#define HAVE_SOCKET 1 - -/* Define to 1 if you have the <stddef.h> header file. */ -#define HAVE_STDDEF_H 1 - -/* Define if you have the <stdint.h> header file. */ -/* #define HAVE_STDINT_H 1 */ - -/* Define if you have the <stdlib.h> header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strchr' function. */ -#define HAVE_STRCHR 1 - -/* Define to 1 if you have the `strdup' function. */ -#define HAVE_STRDUP 1 - -/* Define if you have the `strerror' function. */ -#define HAVE_STRERROR 1 - -/* Define to 1 if you have the `strftime' function. */ -#define HAVE_STRFTIME 1 - -/* Define if you have the <strings.h> header file. */ -/* #define HAVE_STRINGS_H 1 */ - -/* Define if you have the <string.h> header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the `strstr' function. */ -#define HAVE_STRSTR 1 - -/* Define to 1 if you have the `strtoul' function. */ -#define HAVE_STRTOUL 1 - -/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. - */ -/* #undef HAVE_SYS_DIR_H */ - -/* Define to 1 if you have the <sys/ioctl.h> header file. */ -#define HAVE_SYS_IOCTL_H 1 - -/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'. - */ -/* #undef HAVE_SYS_NDIR_H */ - -/* Define to 1 if you have the <sys/socket.h> header file. */ -#define HAVE_SYS_SOCKET_H 1 - -/* Define if you have the <sys/stat.h> header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the <sys/timeb.h> header file. */ -#define HAVE_SYS_TIMEB_H 1 - -/* Define to 1 if you have the <sys/time.h> header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the <sys/wait.h> header file. */ -#define HAVE_SYS_WAIT_H 1 - -/* Define if you have the <unistd.h> header file. */ -/* #define HAVE_UNISTD_H 1 */ - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "" - -/* Define as the return type of signal handlers (`int' or `void'). */ -#define RETSIGTYPE void - -/* Define to 1 if the `setpgrp' function takes no argument. */ -#define SETPGRP_VOID 1 - -/* The size of a `char *', as computed by sizeof. */ -#define SIZEOF_CHAR_P 4 - -/* The size of a `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of a `long', as computed by sizeof. */ -#define SIZEOF_LONG 4 - -/* The size of a `long long', as computed by sizeof. */ -/* #define SIZEOF_LONG_LONG ---not supported--- */ - -/* The size of a `size_t', as computed by sizeof. */ -#define SIZEOF_SIZE_T 4 - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ -#define TIME_WITH_SYS_TIME 1 - -/* Define to 1 if your <sys/time.h> declares `struct tm'. */ -/* #undef TM_IN_SYS_TIME */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #define const */ - -/* Define to `int' if <sys/types.h> does not define. */ -/* #undef pid_t */ - -/* Define to `unsigned' if <sys/types.h> does not define. */ -/* #define size_t unsigned */ - -/* Define to 'int' if <sys/socket.h> doesn't have it. */ -#define socklen_t int - -/* - * Defined always. - * FIXME: Don't know what it does or why we need it. - * (presumably something to do with ANSI Standard C?) - */ -/* Don't define for MS VC++ or you don't get strdup() declared. -#ifndef __STDC__ -#define __STDC__ 1 -#endif -*/ - -/* - * Need to set up this define only for the Pthreads library for - * Win32, available from http://sources.redhat.com/pthreads-win32/ - */ -#if defined(FEATURE_PTHREAD) && defined(_WIN32) -#define __CLEANUP_C -#endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */ - -/* - * Need to keep errlog.c from trying to inline the non-existent - * locking stubs. Could be removed once a real platform-specific - * solution is generated. - */ -#define inline "" - -/* - * BEOS does not currently support POSIX threads. - * This *should* be detected by ./configure, but let's be sure. - */ -#if defined(FEATURE_PTHREAD) && defined(__BEOS__) -#error BEOS does not support pthread - please run ./configure again with "--disable-pthread" - -#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */ - - -#if (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) -#error This file is only intended for MS VC++ on Win32. For other compilers, please run configure. -#endif /* (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) */ - -#pragma warning ( disable: 4100 4115 4201 4214 4244 4514 ) - -/* - * C4100 : unreferenced formal parameter - * Very common, not a bug - * - * C4115 : named type definition in parentheses - * #include <windows.h> causes a warning about one of these. - * - * C4201 : nonstandard extension used : nameless struct/union - * Endemic in <windows.h> - * - * C4214 nonstandard extension used : bit field types other than int - * Endemic in <windows.h> - * - * C4244 conversion from 'int' to 'char', possible loss of data - * Should really fix this one. Throughout the JB code. - * - * C4514 unreferenced inline/local function has been removed - * Caused by #include <windows.h> - */ - - -#endif /* CONFIG_H_INCLUDED */ - diff --git a/external/privoxy/vc_console.dsp b/external/privoxy/vc_console.dsp deleted file mode 100644 index 3561b5e..0000000 --- a/external/privoxy/vc_console.dsp +++ /dev/null @@ -1,405 +0,0 @@ -# Microsoft Developer Studio Project File - Name="vc_console" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 5.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=vc_console - 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_console.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_console.mak"\ - CFG="vc_console - Win32 Debug with Win32 threads" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "vc_console - Win32 Release" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "vc_console - Win32 Debug" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "vc_console - Win32 Debug with Win32 threads" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "vc_console - 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_console - 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 "console_release" -# PROP Intermediate_Dir "console_release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /YX /FD /c -# 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 ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "vc_console - 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 "console_debug" -# PROP Intermediate_Dir "console_debug" -# 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 /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /FR /YX /FD /c -# 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 ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ELSEIF "$(CFG)" == "vc_console - Win32 Debug with Win32 threads" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "console_" -# PROP BASE Intermediate_Dir "console_" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "console_debug_winthr" -# PROP Intermediate_Dir "console_debug_winthr" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /FR /YX /FD /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /FR /YX /FD /c -# 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: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 ws2_32.lib comctl32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ELSEIF "$(CFG)" == "vc_console - Win32 Release with Win32 threads" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "console0" -# PROP BASE Intermediate_Dir "console0" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "console_release_winthr" -# PROP Intermediate_Dir "console_release_winthr" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /YX /FD /c -# 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: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 ws2_32.lib comctl32.lib /nologo /subsystem:console /machine:I386 - -!ENDIF - -# Begin Target - -# Name "vc_console - Win32 Release" -# Name "vc_console - Win32 Debug" -# Name "vc_console - Win32 Debug with Win32 threads" -# Name "vc_console - Win32 Release with Win32 threads" -# Begin Group "JunkBuster" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\actionlist.h -# End Source File -# Begin Source File - -SOURCE=.\actions.c -# End Source File -# Begin Source File - -SOURCE=.\actions.h -# End Source File -# Begin Source File - -SOURCE=.\cgi.c -# End Source File -# Begin Source File - -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 - -SOURCE=.\errlog.h -# End Source File -# Begin Source File - -SOURCE=.\filters.c -# End Source File -# Begin Source File - -SOURCE=.\filters.h -# End Source File -# Begin Source File - -SOURCE=.\jcc.c -# End Source File -# Begin Source File - -SOURCE=.\jcc.h -# End Source File -# Begin Source File - -SOURCE=.\loadcfg.c -# End Source File -# Begin Source File - -SOURCE=.\loadcfg.h -# End Source File -# Begin Source File - -SOURCE=.\loaders.c -# End Source File -# Begin Source File - -SOURCE=.\loaders.h -# End Source File -# Begin Source File - -SOURCE=.\parsers.c -# End Source File -# Begin Source File - -SOURCE=.\parsers.h -# End Source File -# Begin Source File - -SOURCE=.\project.h -# End Source File -# Begin Source File - -SOURCE=.\urlmatch.c -# End Source File -# Begin Source File - -SOURCE=.\urlmatch.h -# End Source File -# End Group -# Begin Group "Win32" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\cygwin.h -# End Source File -# Begin Source File - -SOURCE=.\win32.c -# End Source File -# Begin Source File - -SOURCE=.\win32.h -# End Source File -# End Group -# Begin Group "PCRE" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\pcre\chartables.c - -!IF "$(CFG)" == "vc_console - Win32 Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_console - Win32 Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_console - Win32 Debug with Win32 threads" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_console - 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\config.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\get.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\internal.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\maketables.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcre.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcre.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcreposix.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcreposix.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\study.c -# End Source File -# End Group -# Begin Group "PCRS" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\pcrs.c -# End Source File -# Begin Source File - -SOURCE=.\pcrs.h -# End Source File -# End Group -# Begin Group "Sockets" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\gateway.c -# End Source File -# Begin Source File - -SOURCE=.\gateway.h -# End Source File -# Begin Source File - -SOURCE=.\jbsockets.c -# End Source File -# Begin Source File - -SOURCE=.\jbsockets.h -# End Source File -# End Group -# Begin Group "Utilities" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\encode.c -# End Source File -# Begin Source File - -SOURCE=.\encode.h -# End Source File -# Begin Source File - -SOURCE=.\list.c -# End Source File -# Begin Source File - -SOURCE=.\list.h -# End Source File -# Begin Source File - -SOURCE=.\miscutil.c -# End Source File -# Begin Source File - -SOURCE=.\miscutil.h -# End Source File -# Begin Source File - -SOURCE=.\ssplit.c -# End Source File -# Begin Source File - -SOURCE=.\ssplit.h -# End Source File -# End Group -# End Target -# End Project diff --git a/external/privoxy/vc_privoxy.dsp b/external/privoxy/vc_privoxy.dsp deleted file mode 100644 index 5afaec9..0000000 --- a/external/privoxy/vc_privoxy.dsp +++ /dev/null @@ -1,488 +0,0 @@ -# Microsoft Developer Studio Project File - Name="vc_privoxy" - 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 -!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 -!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 -!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 - -# Begin Project -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "vc_privoxy - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "vc_release" -# PROP BASE Intermediate_Dir "vc_release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "vc_release" -# PROP Intermediate_Dir "vc_release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /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 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 - -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "vc_debug" -# PROP BASE Intermediate_Dir "vc_debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "vc_debug" -# PROP Intermediate_Dir "vc_debug" -# 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 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 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" -# Begin Group "JunkBuster" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\actionlist.h -# End Source File -# Begin Source File - -SOURCE=.\actions.c -# End Source File -# Begin Source File - -SOURCE=.\actions.h -# End Source File -# Begin Source File - -SOURCE=.\cgi.c -# End Source File -# Begin Source File - -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 - -SOURCE=.\errlog.h -# End Source File -# Begin Source File - -SOURCE=.\filters.c -# End Source File -# Begin Source File - -SOURCE=.\filters.h -# End Source File -# Begin Source File - -SOURCE=.\jcc.c -# End Source File -# Begin Source File - -SOURCE=.\jcc.h -# End Source File -# Begin Source File - -SOURCE=.\loadcfg.c -# End Source File -# Begin Source File - -SOURCE=.\loadcfg.h -# End Source File -# Begin Source File - -SOURCE=.\loaders.c -# End Source File -# Begin Source File - -SOURCE=.\loaders.h -# End Source File -# Begin Source File - -SOURCE=.\parsers.c -# End Source File -# Begin Source File - -SOURCE=.\parsers.h -# End Source File -# Begin Source File - -SOURCE=.\project.h -# End Source File -# Begin Source File - -SOURCE=.\urlmatch.c -# End Source File -# Begin Source File - -SOURCE=.\urlmatch.h -# End Source File -# End Group -# Begin Group "Win32" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\cygwin.h -# End Source File -# Begin Source File - -SOURCE=.\w32log.c -# End Source File -# Begin Source File - -SOURCE=.\w32log.h -# End Source File -# Begin Source File - -SOURCE=.\w32res.h -# End Source File -# Begin Source File - -SOURCE=.\w32taskbar.c -# End Source File -# Begin Source File - -SOURCE=.\w32taskbar.h -# End Source File -# Begin Source File - -SOURCE=.\win32.c -# End Source File -# Begin Source File - -SOURCE=.\win32.h -# End Source File -# Begin Source File - -SOURCE=.\w32svrapi.c -# End Source File -# Begin Source File - -SOURCE=.\w32svrapi.h -# End Source File -# End Group -# Begin Group "Resources" - -# PROP Default_Filter "rc,ico,bmp" -# Begin Source File - -SOURCE=.\icons\ico00001.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\ico00002.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\ico00003.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\ico00004.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\ico00005.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\ico00006.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\ico00007.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\ico00008.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\idle.ico -# End Source File -# Begin Source File - -SOURCE=.\icons\privoxy.ico -# End Source File -# Begin Source File - -SOURCE=.\w32.rc -# End Source File -# End Group -# Begin Group "PCRE" - -# PROP Default_Filter "" -# 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 - -SOURCE=.\pcre\config.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\get.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\internal.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\maketables.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcre.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcre.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcreposix.c -# End Source File -# Begin Source File - -SOURCE=.\pcre\pcreposix.h -# End Source File -# Begin Source File - -SOURCE=.\pcre\study.c -# End Source File -# End Group -# Begin Group "PCRS" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\pcrs.c -# End Source File -# Begin Source File - -SOURCE=.\pcrs.h -# End Source File -# End Group -# Begin Group "Sockets" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\gateway.c -# End Source File -# Begin Source File - -SOURCE=.\gateway.h -# End Source File -# Begin Source File - -SOURCE=.\jbsockets.c -# End Source File -# Begin Source File - -SOURCE=.\jbsockets.h -# End Source File -# End Group -# Begin Group "Utilities" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\encode.c -# End Source File -# Begin Source File - -SOURCE=.\encode.h -# End Source File -# Begin Source File - -SOURCE=.\list.c -# End Source File -# Begin Source File - -SOURCE=.\list.h -# End Source File -# Begin Source File - -SOURCE=.\miscutil.c -# End Source File -# Begin Source File - -SOURCE=.\miscutil.h -# End Source File -# Begin Source File - -SOURCE=.\ssplit.c -# End Source File -# Begin Source File - -SOURCE=.\ssplit.h -# End Source File -# End Group -# End Target -# End Project diff --git a/external/privoxy/vc_privoxy.dsw b/external/privoxy/vc_privoxy.dsw deleted file mode 100644 index 9685de2..0000000 --- a/external/privoxy/vc_privoxy.dsw +++ /dev/null @@ -1,59 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 5.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "vc_console"=".\vc_console.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name vc_dftables - End Project Dependency -}}} - -############################################################################### - -Project: "vc_dftables"=".\pcre\vc_dftables.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "vc_privoxy"=".\vc_privoxy.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name vc_dftables - End Project Dependency -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/external/privoxy/w32.rc b/external/privoxy/w32.rc deleted file mode 100644 index 93b518a..0000000 --- a/external/privoxy/w32.rc +++ /dev/null @@ -1,343 +0,0 @@ -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/w32.rc,v $ - * - * Purpose : Windows GUI resource script. - * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the 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: w32.rc,v $ - * Revision 1.22 2009/01/01 15:09:23 ler762 - * Change the Windows taskbar icon when privoxy is toggled off. - * - * Revision 1.21 2008/11/02 14:37:47 ler762 - * commit the part of the patches I've been using that were written by torford and gjmurphy - * [ 1824315 ] Minor code cleanup - * [ 1781135 ] Patch - Add clear log, select all, and Accelerators for w32 - * http://sourceforge.net/tracker/?func=detail&atid=311118&aid=1781135&... - * The full patch adds control keys A(select all), C(copy) and D(delete all) to the - * Privoxy log window menu. Select all and copy work for me without the patch - * (albeit without showing the accelerator keys on the menu), so the only part of the - * patch I've been using for the last year or so has been the ctrl-d to delete - * everything in the Privoxy log window. - * - * Revision 1.20 2006/08/18 02:06:25 david__schmidt - * Making icon go back to blue when idle. - * See: bug #967648. - * - * Revision 1.19 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.17.2.1 2002/08/21 17:58:40 oes - * - Reorder of Win32 menu - * - "Show Privoxy Window" now a toggle - * - Temp kludge to let user and default action file be edited through win32 GUI (FR 592080) - * - * Revision 1.17 2002/03/31 17:19:00 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.16 2002/03/26 22:57:44 jongfoster - * Web server name should begin www. - * - * 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". - * - * Revision 1.7 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.6 2001/05/26 14:15:18 jongfoster - * Cosmetic fix: // -> block comment - * - * Revision 1.5 2001/05/26 13:24:31 jongfoster - * New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor. - * This #define cannot be set from ./configure - there's no point, it - * doesn't work yet. See feature request # 425722 - * (I missed this file in my original checkin) - * - * Revision 1.4 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.3 2001/05/25 22:33:40 jongfoster - * CRLF->LF - * - * 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:59:07 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - -#include "config.h" - -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> - -#include "w32res.h" - -#ifdef __MINGW32__ -#include "cygwin.h" -#endif - -/**************************************************************************** - * Language-neutral resources - ****************************************************************************/ - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) -#ifdef _WIN32 -/* LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL */ -#pragma code_page(1252) -#endif /* _WIN32 */ - -/* - * Icons - * - * 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_IDLE ICON DISCARDABLE "icons/privoxy.ico" -IDI_OFF ICON DISCARDABLE "icons/off.ico" - -#endif /* Neutral resources */ - - -/**************************************************************************** - * English (U.S.) resources - ****************************************************************************/ - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -/* LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US */ -#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 - */ - -IDR_TRAYMENU MENU DISCARDABLE -BEGIN - POPUP "Popup" - BEGIN - MENUITEM "E&xit Privoxy", ID_FILE_EXIT - MENUITEM SEPARATOR - POPUP "E&dit.." - BEGIN - MENUITEM "&Main Configuration", ID_TOOLS_EDITCONFIG - MENUITEM "&Default Actions", ID_TOOLS_EDITDEFAULTACTIONS - MENUITEM "&User Actions", ID_TOOLS_EDITUSERACTIONS - MENUITEM "&Filters", ID_TOOLS_EDITFILTERS -#ifdef FEATURE_TRUST - MENUITEM "&Trust list", ID_TOOLS_EDITTRUST -#endif /* def FEATURE_TRUST */ - END - MENUITEM SEPARATOR -#ifdef FEATURE_TOGGLE - MENUITEM "&Enable", ID_TOGGLE_ENABLED, CHECKED -#endif /* def FEATURE_TOGGLE */ - MENUITEM "Show Privoxy &Window", ID_TOGGLE_SHOWWINDOW, CHECKED - END -END - -IDR_LOGVIEW MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", ID_FILE_EXIT - END - POPUP "&Edit" - BEGIN - MENUITEM "Copy", ID_EDIT_COPY - END - POPUP "&View" - BEGIN - MENUITEM "&Clear Log\tCtrl+D", ID_VIEW_CLEARLOG - MENUITEM SEPARATOR - MENUITEM "&Log Messages", ID_VIEW_LOGMESSAGES, CHECKED - MENUITEM "Message &Highlighting", ID_VIEW_MESSAGEHIGHLIGHTING, CHECKED - MENUITEM "Limit &Buffer Size", ID_VIEW_LIMITBUFFERSIZE, CHECKED - MENUITEM "&Activity Animation", ID_VIEW_ACTIVITYANIMATION, CHECKED - END - POPUP "&Options" - BEGIN -#ifdef FEATURE_TOGGLE - MENUITEM "&Enable", ID_TOGGLE_ENABLED, CHECKED - MENUITEM SEPARATOR -#endif /* def FEATURE_TOGGLE */ - MENUITEM "Edit Main &Configuration", ID_TOOLS_EDITCONFIG - MENUITEM "Edit &Default Actions", ID_TOOLS_EDITDEFAULTACTIONS - MENUITEM "Edit &User Actions", ID_TOOLS_EDITUSERACTIONS - MENUITEM "Edit &Filters", ID_TOOLS_EDITFILTERS -#ifdef FEATURE_TRUST - MENUITEM "Edit &Trust list", ID_TOOLS_EDITTRUST -#endif /* def FEATURE_TRUST */ - END - POPUP "&Help" - BEGIN - MENUITEM "Privoxy &FAQ", ID_HELP_FAQ - MENUITEM "Privoxy &Manual", ID_HELP_MANUAL - MENUITEM "GNU &General Public Licence", ID_HELP_GPL - MENUITEM SEPARATOR - MENUITEM "Privoxy Status...", ID_HELP_STATUS - MENUITEM SEPARATOR - MENUITEM "About Privoxy...", ID_HELP_ABOUT - END -END - -IDR_POPUP_SELECTION MENU DISCARDABLE -BEGIN - POPUP "Popup" - BEGIN - MENUITEM "&Copy", ID_EDIT_COPY - END -END - - -/* - * Accelerators - */ - -IDR_ACCELERATOR ACCELERATORS DISCARDABLE -BEGIN - "C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT - "D", ID_VIEW_CLEARLOG, VIRTKEY, CONTROL, NOINVERT -END - -#endif /* English (U.S.) resources */ diff --git a/external/privoxy/w32log.c b/external/privoxy/w32log.c deleted file mode 100644 index e5df8b0..0000000 --- a/external/privoxy/w32log.c +++ /dev/null @@ -1,1480 +0,0 @@ -const char w32log_rcs[] = "$Id: w32log.c,v 1.33 2009/03/09 19:02:09 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/w32log.c,v $ - * - * Purpose : Functions for creating and destroying the log window, - * ouputting strings, processing messages and so on. - * - * Copyright : Written by and Copyright (C) 2001-2009 members of - * the Privoxy team. http://www.privoxy.org/ - * - * Written by and Copyright (C) 1999 Adam Lock - * locka@iol.ie - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: w32log.c,v $ - * Revision 1.33 2009/03/09 19:02:09 fabiankeil - * Request the default charset in LogPutStringNoMatch(). - * Submitted by Burberry in #2674342 as fix for #2662382. - * - * Revision 1.32 2009/03/09 18:32:48 fabiankeil - * Use the Privoxy icon in the alt+tab window. - * Patch submitted by Burberry in #2674342. - * - * Revision 1.31 2009/03/07 17:58:02 fabiankeil - * Fix two mingw32-only buffer overflows. Note that triggering - * them requires control over the configuration file in which - * case all bets are off anyway. - * - * Revision 1.30 2009/01/01 15:09:23 ler762 - * Change the Windows taskbar icon when privoxy is toggled off. - * - * Revision 1.29 2008/12/20 15:27:40 ler762 - * The crunch log message format changed, so update the strings to highlight - * in the log window. - * - * Revision 1.28 2008/11/02 14:37:47 ler762 - * commit the part of the patches I've been using that were written by torford and gjmurphy - * [ 1824315 ] Minor code cleanup - * [ 1781135 ] Patch - Add clear log, select all, and Accelerators for w32 - * http://sourceforge.net/tracker/?func=detail&atid=311118&aid=1781135&... - * The full patch adds control keys A(select all), C(copy) and D(delete all) to the - * Privoxy log window menu. Select all and copy work for me without the patch - * (albeit without showing the accelerator keys on the menu), so the only part of the - * patch I've been using for the last year or so has been the ctrl-d to delete - * everything in the Privoxy log window. - * - * Revision 1.27 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.25.2.5 2003/04/04 12:48:51 oes - * Fixed bug #711865: - * - Made tray menu correctly reflect initial window visibility state - * - Hopefully fixed problem where log window contents wasn't visible - * until vertical scroll bar was clicked. Thanks to Guy for the fix! - * - * Revision 1.25.2.4 2003/03/11 11:53:59 oes - * Cosmetic: Renamed cryptic variable - * - * Revision 1.25.2.3 2002/11/20 14:39:05 oes - * Fixed compiler warning - * - * Revision 1.25.2.2 2002/09/25 15:23:10 oes - * Uncheck the "Show Privoxy Window" taskbar menu item when window gets minimized. Fixes bug #606804 - * - * Revision 1.25.2.1 2002/08/21 17:59:05 oes - * - "Show Privoxy Window" now a toggle - * - Temp kludge to let user and default action file be edited through win32 GUI (FR 592080) - * - * Revision 1.25 2002/04/04 00:36:36 gliptak - * always use pcre for matching - * - * Revision 1.24 2002/03/31 17:19:00 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.23 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * 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". - * - * Revision 1.9 2001/05/31 17:33:13 oes - * - * CRLF -> LF - * - * 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 01:26:34 jongfoster - * New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor. - * This #define cannot be set from ./configure - there's no point, it - * doesn't work yet. See feature request # 425722 - * - * Revision 1.6 2001/05/26 00:31:30 jongfoster - * Fixing compiler warning about comparing signed/unsigned. - * - * 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:56:28 oes - * CRLF -> LF - * - * Revision 1.3 2001/05/20 15:07:54 jongfoster - * File is now ignored if _WIN_CONSOLE is defined. - * - * 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:59:07 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#include "config.h" - -#include <assert.h> -#include <stdio.h> - -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> -#include <richedit.h> - -#include "project.h" -#include "w32log.h" -#include "w32taskbar.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; - -#ifdef __MINGW32__ -#include "cygwin.h" -const char cygwin_h_rcs[] = CYGWIN_H_VERSION; -#endif - -const char w32log_h_rcs[] = W32LOG_H_VERSION; - -#ifndef _WIN_CONSOLE /* entire file */ - -/* - * Timers and the various durations - */ -#define TIMER_ANIM_ID 1 -#define TIMER_ANIM_TIME 100 -#define TIMER_ANIMSTOP_ID 2 -#define TIMER_ANIMSTOP_TIME 1000 -#define TIMER_CLIPBUFFER_ID 3 -#define TIMER_CLIPBUFFER_TIME 1000 -#define TIMER_CLIPBUFFER_FORCE_ID 4 -#define TIMER_CLIPBUFFER_FORCE_TIME 5000 - -/* - * Styles of text that can be output - */ -#define STYLE_NONE 0 -#define STYLE_HIGHLIGHT 1 -#define STYLE_LINK 2 -#define STYLE_HEADER 3 - -/* - * Number of frames of animation in tray activity sequence - */ -#define ANIM_FRAMES 8 - -#define DEFAULT_MAX_BUFFER_LINES 200 -#define DEFAULT_LOG_FONT_NAME "MS Sans Serif" -#define DEFAULT_LOG_FONT_SIZE 8 - -/* - * These values affect the way the log window behaves, they should be read - * from a file but for the moment, they are hardcoded here. Some options are - * configurable through the UI. - */ - -/* Indicates whether task bar shows activity animation */ -BOOL g_bShowActivityAnimation = 1; - -/* Indicates whether the log window is shown */ -BOOL g_bShowLogWindow = 1; - -/* Indicates if the log window appears on the task bar */ -BOOL g_bShowOnTaskBar = 0; - -/* Indicates whether closing the log window really just hides it */ -BOOL g_bCloseHidesWindow = 1; - -/* Indicates if messages are logged at all */ -BOOL g_bLogMessages = 1; - -/* Indicates whether log messages are highlighted */ -BOOL g_bHighlightMessages = 1; - -/* Indicates if buffer is limited in size */ -BOOL g_bLimitBufferSize = 1; - -/* Maximum number of lines allowed in buffer when limited */ -int g_nMaxBufferLines = DEFAULT_MAX_BUFFER_LINES; - -/* Font to use */ -char g_szFontFaceName[32] = DEFAULT_LOG_FONT_NAME; - -/* Size of font to use */ -int g_nFontSize = DEFAULT_LOG_FONT_SIZE; - - -/* FIXME: this is a kludge */ - -const char * g_default_actions_file = NULL; -const char * g_user_actions_file = NULL; -const char * g_re_filterfile = NULL; -#ifdef FEATURE_TRUST -const char * g_trustfile = NULL; -#endif /* def FEATURE_TRUST */ - -/* FIXME: end kludge */ - -/* Regular expression for detected URLs */ -#define RE_URL "http:[^ \n\r]*" - -/* - * Regular expressions that are used to perform highlight in the log window - */ -static struct _Pattern -{ - const char *str; - int style; - regex_t buffer; -} patterns_to_highlight[] = -{ - /* url headers */ - { RE_URL, STYLE_LINK }, -/* { "[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[^ \n\r]*", STYLE_LINK }, */ - /* interesting text to highlight */ - /* see jcc.c crunch_reason for the full list */ - { "Crunch: Blocked:", STYLE_HIGHLIGHT }, - { "Crunch: Untrusted", STYLE_HIGHLIGHT }, - { "Crunch: Redirected:", STYLE_HIGHLIGHT }, - { "Crunch: DNS failure", STYLE_HIGHLIGHT }, - { "Crunch: Forwarding failed", STYLE_HIGHLIGHT }, - { "Crunch: Connection failure", STYLE_HIGHLIGHT }, - { "Crunch: Out of memory", STYLE_HIGHLIGHT }, - /* what are all the possible error strings?? */ - { "Error:", STYLE_HIGHLIGHT }, - /* http headers */ - { "referer:", STYLE_HEADER }, - { "proxy-connection:", STYLE_HEADER }, - { "proxy-agent:", STYLE_HEADER }, - { "user-agent:", STYLE_HEADER }, - { "host:", STYLE_HEADER }, - { "accept:", STYLE_HEADER }, - { "accept-encoding:", STYLE_HEADER }, - { "accept-language:", STYLE_HEADER }, - { "accept-charset:", STYLE_HEADER }, - { "accept-ranges:", STYLE_HEADER }, - { "date:", STYLE_HEADER }, - { "cache-control:", STYLE_HEADER }, - { "cache-last-checked:", STYLE_HEADER }, - { "connection:", STYLE_HEADER }, - { "content-type", STYLE_HEADER }, - { "content-length", STYLE_HEADER }, - { "cookie", STYLE_HEADER }, - { "last-modified:", STYLE_HEADER }, - { "pragma:", STYLE_HEADER }, - { "server:", STYLE_HEADER }, - { "etag:", STYLE_HEADER }, - { "expires:", STYLE_HEADER }, - { "warning:", STYLE_HEADER }, - /* this is the terminator statement - do not delete! */ - { NULL, STYLE_NONE } -}; - -/* - * Public variables - */ -HWND g_hwndLogFrame; -HICON g_hiconApp; - -/* - * Private variables - */ -static CRITICAL_SECTION g_criticalsection; -static HWND g_hwndTray; -static HWND g_hwndLogBox; -static WNDPROC g_fnLogBox; -static HICON g_hiconAnim[ANIM_FRAMES]; -static HICON g_hiconIdle; -static HICON g_hiconOff; -static int g_nAnimFrame; -static BOOL g_bClipPending = FALSE; -static int g_nRichEditVersion = 0; - -/* - * Private functions - */ -static HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow); -static HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance); -static LRESULT CALLBACK LogWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -static LRESULT CALLBACK LogOwnerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -static LRESULT CALLBACK LogRichEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -static BOOL InitRichEdit(void); -static void LogClipBuffer(void); -static void LogCreatePatternMatchingBuffers(void); -static void LogDestroyPatternMatchingBuffers(void); -static int LogPutStringNoMatch(const char *pszText, int style); -static void SetIdleIcon(void); - - -/********************************************************************* - * - * Function : InitLogWindow - * - * Description : Initialise the log window. - * - * Parameters : None - * - * Returns : Always TRUE (there should be error checking on the resources). - * - *********************************************************************/ -BOOL InitLogWindow(void) -{ - int i; - - /* Load the icons */ - g_hiconIdle = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IDLE)); - g_hiconOff = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_OFF)); - for (i = 0; i < ANIM_FRAMES; i++) - { - g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ANIMATED1 + i)); - } - g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAINICON)); - - /* Create the user interface */ - g_hwndLogFrame = CreateLogWindow(g_hInstance, g_nCmdShow); - g_hwndTray = CreateTrayWindow(g_hInstance); - TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Privoxy"); - - /* Create pattern matching buffers (for highlighting */ - LogCreatePatternMatchingBuffers(); - - /* Create a critical section to protect multi-threaded access to certain things */ - InitializeCriticalSection(&g_criticalsection); - - return TRUE; - -} - - -/********************************************************************* - * - * Function : TermLogWindow - * - * Description : Cleanup the logwindow. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void TermLogWindow(void) -{ - int i; - - LogDestroyPatternMatchingBuffers(); - - TrayDeleteIcon(g_hwndTray, 1); - DeleteObject(g_hiconApp); - DeleteObject(g_hiconIdle); - DeleteObject(g_hiconOff); - for (i = 0; i < ANIM_FRAMES; i++) - { - DeleteObject(g_hiconAnim[i]); - } - -} - - -/********************************************************************* - * - * Function : LogCreatePatternMatchingBuffers - * - * Description : Compile the pattern matching buffers. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void LogCreatePatternMatchingBuffers(void) -{ - int i; - for (i = 0; patterns_to_highlight[i].str != NULL; i++) - { - regcomp(&patterns_to_highlight[i].buffer, patterns_to_highlight[i].str, REG_ICASE); - } -} - - -/********************************************************************* - * - * Function : LogDestroyPatternMatchingBuffers - * - * Description : Free up the pattern matching buffers. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void LogDestroyPatternMatchingBuffers(void) -{ - int i; - for (i = 0; patterns_to_highlight[i].str != NULL; i++) - { - regfree(&patterns_to_highlight[i].buffer); - } -} - - -/********************************************************************* - * - * Function : LogGetURLUnderCursor - * - * Description : Returns the URL from under the cursor (remember to free it!). - * - * Parameters : None - * - * Returns : NULL or a pointer to an URL string. - * - *********************************************************************/ -char *LogGetURLUnderCursor(void) -{ - char *szResult = NULL; - regex_t re; - POINT ptCursor; - POINTL ptl; - DWORD nPos; - DWORD nWordStart = 0; - DWORD nWordEnd = 0; - - regcomp(&re, RE_URL, REG_ICASE); - - /* Get the position of the cursor over the text window */ - GetCursorPos(&ptCursor); - ScreenToClient(g_hwndLogBox, &ptCursor); - ptl.x = ptCursor.x; - ptl.y = ptCursor.y; - - /* Search backwards and fowards to obtain the word that is highlighted */ - nPos = LOWORD(SendMessage(g_hwndLogBox, EM_CHARFROMPOS, 0, (LPARAM) &ptl)); - nWordStart = SendMessage(g_hwndLogBox, EM_FINDWORDBREAK, WB_LEFT, nPos); - nWordEnd = SendMessage(g_hwndLogBox, EM_FINDWORDBREAK, WB_RIGHTBREAK, nPos); - - /* Compare the string to the pattern */ - if (nWordEnd > nWordStart) - { - TEXTRANGE range; - regmatch_t match; - - range.chrg.cpMin = nWordStart; - range.chrg.cpMax = nWordEnd; - range.lpstrText = (LPSTR)zalloc(nWordEnd - nWordStart + 1); - SendMessage(g_hwndLogBox, EM_GETTEXTRANGE, 0, (LPARAM) &range); - - if (regexec(&re, range.lpstrText, 1, &match, 0) == 0) - { - szResult = range.lpstrText; - } - else - { - free(range.lpstrText); - } - - regfree(&re); - } - return szResult; - -} - - -/********************************************************************* - * - * Function : LogPutString - * - * Description : Inserts text into the logging window. This is really - * a regexp aware wrapper function to `LogPutStringNoMatch'. - * - * Parameters : - * 1 : pszText = pointer to string going to the log window - * - * Returns : 1 => success, else the return code from `LogPutStringNoMatch'. - * FIXME: this is backwards to the rest of IJB and to common - * programming practice. Please use 0 => success instead. - * - *********************************************************************/ -int LogPutString(const char *pszText) -{ - int i; - int result = 0; - - if (pszText == NULL || strlen(pszText) == 0) - { - return 1; - } - - if (!g_bLogMessages) - { - return 1; - } - - /* Critical section stops multiple threads doing nasty interactions that - * foul up the highlighting and output. - */ - EnterCriticalSection(&g_criticalsection); - - if (g_bHighlightMessages) - { - regmatch_t match; - - /* First things first, regexp scan for various things that we would like highlighted */ - for (i = 0; patterns_to_highlight[i].str != NULL; i++) - { - if (regexec(&patterns_to_highlight[i].buffer, pszText, 1, &match, 0) == 0) - { - char *pszBefore = NULL; - char *pszMatch = NULL; - char *pszAfter = NULL; - int nMatchSize; - - /* Split the string up into pieces representing the strings, before - at and after the matching pattern - */ - if (match.rm_so > 0) - { - pszBefore = (char *)malloc((match.rm_so + 1) * sizeof(char)); - memset(pszBefore, 0, (match.rm_so + 1) * sizeof(char)); - strncpy(pszBefore, pszText, match.rm_so); - } - if (match.rm_eo < (regoff_t)strlen(pszText)) - { - pszAfter = strdup(&pszText[match.rm_eo]); - } - nMatchSize = match.rm_eo - match.rm_so; - pszMatch = (char *)malloc(nMatchSize + 1); - strncpy(pszMatch, &pszText[match.rm_so], nMatchSize); - pszMatch[nMatchSize] = '\0'; - - /* Recursively call LogPutString */ - if (pszBefore) - { - LogPutString(pszBefore); - free(pszBefore); - } - if (pszMatch) - { - LogPutStringNoMatch(pszMatch, patterns_to_highlight[i].style); - free(pszMatch); - } - if (pszAfter) - { - LogPutString(pszAfter); - free(pszAfter); - } - - result = 1; - goto end; - } - } - } - - result = LogPutStringNoMatch(pszText, STYLE_NONE); - -end: - LeaveCriticalSection(&g_criticalsection); - - return result; - -} - - -/********************************************************************* - * - * Function : LogPutStringNoMatch - * - * Description : Puts a string into the logging window. - * - * Parameters : - * 1 : pszText = pointer to string going to the log window - * 2 : style = STYLE_NONE, STYLE_HEADER, STYLE_HIGHLIGHT, or STYLE_LINK - * - * Returns : Always 1 => success. - * FIXME: this is backwards to the rest of IJB and to common - * programming practice. Please use 0 => success instead. - * - *********************************************************************/ -int LogPutStringNoMatch(const char *pszText, int style) -{ - CHARRANGE range; - CHARFORMAT format; - int nTextLength; - - assert(g_hwndLogBox); - if (g_hwndLogBox == NULL) - { - return 1; - } - - /* TODO preserve existing selection */ - - /* Go to the end of the text */ - nTextLength = GetWindowTextLength(g_hwndLogBox); - range.cpMin = nTextLength; - range.cpMax = nTextLength; - SendMessage(g_hwndLogBox, EM_EXSETSEL, 0, (LPARAM) &range); - - /* Apply a formatting style */ - memset(&format, 0, sizeof(format)); - format.cbSize = sizeof(format); - format.dwMask = CFM_BOLD | CFM_UNDERLINE | CFM_STRIKEOUT | - CFM_ITALIC | CFM_COLOR | CFM_FACE | CFM_SIZE | CFM_CHARSET; - format.bCharSet = DEFAULT_CHARSET; - format.yHeight = (g_nFontSize * 1440) / 72; - strlcpy(format.szFaceName, g_szFontFaceName, sizeof(format.szFaceName)); - if (style == STYLE_NONE) - { - /* DO NOTHING */ - format.dwEffects |= CFE_AUTOCOLOR; - } - else if (style == STYLE_HEADER) - { - format.dwEffects |= CFE_AUTOCOLOR | CFE_ITALIC; - } - else if (style == STYLE_HIGHLIGHT) - { - format.dwEffects |= CFE_AUTOCOLOR | CFE_BOLD; - } - else if (style == STYLE_LINK) - { - format.dwEffects |= CFE_UNDERLINE; - format.crTextColor = RGB(0, 0, 255); - } - SendMessage(g_hwndLogBox, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &format); - - /* Append text to the end */ - SendMessage(g_hwndLogBox, EM_REPLACESEL, FALSE, (LPARAM) pszText); - - /* TODO Restore the old selection */ - - /* Purge buffer */ - if (strchr(pszText, '\n') != NULL) - { - SetTimer(g_hwndLogFrame, TIMER_CLIPBUFFER_ID, TIMER_CLIPBUFFER_TIME, NULL); - if (!g_bClipPending) - { - /* Set the force clip timer going. This timer ensures clipping is done - intermittently even when there is a sustained burst of logging - */ - SetTimer(g_hwndLogFrame, TIMER_CLIPBUFFER_FORCE_ID, TIMER_CLIPBUFFER_FORCE_TIME, NULL); - } - g_bClipPending = TRUE; - } - - return 1; - -} - - -/********************************************************************* - * - * Function : LogShowActivity - * - * Description : Start the spinner. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void LogShowActivity(void) -{ - /* Start some activity timers */ - if (g_bShowActivityAnimation) - { - SetTimer(g_hwndLogFrame, TIMER_ANIM_ID, TIMER_ANIM_TIME, NULL); - SetTimer(g_hwndLogFrame, TIMER_ANIMSTOP_ID, TIMER_ANIMSTOP_TIME, NULL); - } - -} - - -/********************************************************************* - * - * Function : LogClipBuffer - * - * Description : Prunes old lines from the log. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void LogClipBuffer(void) -{ - int nLines = SendMessage(g_hwndLogBox, EM_GETLINECOUNT, 0, 0); - if (g_bLimitBufferSize && nLines > g_nMaxBufferLines) - { - /* Compute the range representing the lines to be deleted */ - LONG nLastLineToDelete = nLines - g_nMaxBufferLines; - LONG nLastChar = SendMessage(g_hwndLogBox, EM_LINEINDEX, nLastLineToDelete, 0); - CHARRANGE range; - range.cpMin = 0; - range.cpMax = nLastChar; - - /* TODO get current selection */ - - /* TODO adjust and clip old selection against range to be deleted */ - - /* Select range and erase it (turning off autoscroll to prevent - nasty scrolling) */ - SendMessage(g_hwndLogBox, EM_SETOPTIONS, ECOOP_XOR, ECO_AUTOVSCROLL); - SendMessage(g_hwndLogBox, EM_EXSETSEL, 0, (LPARAM) &range); - SendMessage(g_hwndLogBox, EM_REPLACESEL, FALSE, (LPARAM) ""); - SendMessage(g_hwndLogBox, EM_SETOPTIONS, ECOOP_XOR, ECO_AUTOVSCROLL); - - /* reposition (back to) the end of the log content */ - range.cpMin = SendMessage (g_hwndLogBox, WM_GETTEXTLENGTH, 0, 0); - range.cpMax = -1; - SendMessage(g_hwndLogBox, EM_EXSETSEL, 0, (LPARAM) &range); - - /* restore vertical ScrollBar stuff (messed up by AUTOVSCROLL) */ - SendMessage (g_hwndLogBox, EM_SCROLL, SB_LINEDOWN, 0); - - } - -} - - -/********************************************************************* - * - * Function : CreateHiddenLogOwnerWindow - * - * Description : Creates a hidden owner window that stops the log - * window appearing in the task bar. - * - * Parameters : - * 1 : hInstance = application's instance handle - * - * Returns : Handle to newly created window. - * - *********************************************************************/ -HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance) -{ - static const char *szWndName = "PrivoxyLogOwner"; - WNDCLASS wc; - HWND hwnd; - - wc.style = 0; - wc.lpfnWndProc = LogOwnerWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = g_hiconApp; - wc.hCursor = 0; - wc.hbrBackground = 0; - wc.lpszMenuName = 0; - wc.lpszClassName = szWndName; - - RegisterClass(&wc); - - hwnd = CreateWindow(szWndName, szWndName, - WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); - - return hwnd; - -} - - -/********************************************************************* - * - * Function : LogOwnerWindowProc - * - * Description : Dummy procedure that does nothing special. - * - * Parameters : - * 1 : hwnd = window handle - * 2 : uMsg = message number - * 3 : wParam = first param for this message - * 4 : lParam = next param for this message - * - * Returns : Same as `DefWindowProc'. - * - *********************************************************************/ -LRESULT CALLBACK LogOwnerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - return DefWindowProc(hwnd, uMsg, wParam, lParam); - -} - - -/********************************************************************* - * - * Function : CreateLogWindow - * - * Description : Create the logging window. - * - * Parameters : - * 1 : hInstance = application's instance handle - * 2 : nCmdShow = window show value (MIN, MAX, NORMAL, etc...) - * - * Returns : Handle to newly created window. - * - *********************************************************************/ -HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow) -{ - static const char *szWndName = "PrivoxyLogWindow"; - static const char *szWndTitle = "Privoxy"; - - HWND hwnd = NULL; - HWND hwndOwner = (g_bShowOnTaskBar) ? NULL : CreateHiddenLogOwnerWindow(hInstance); - RECT rcClient; - WNDCLASSEX wc; - - memset(&wc, 0, sizeof(wc)); - wc.cbSize = sizeof(wc); - wc.style = CS_DBLCLKS; - wc.lpfnWndProc = LogWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = g_hiconApp; - wc.hCursor = 0; - wc.hbrBackground = 0; - wc.lpszMenuName = MAKEINTRESOURCE(IDR_LOGVIEW); - wc.lpszClassName = szWndName; - wc.hbrBackground = GetStockObject(WHITE_BRUSH); - RegisterClassEx(&wc); - - hwnd = CreateWindowEx(WS_EX_APPWINDOW, szWndName, szWndTitle, - WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, hwndOwner, NULL, hInstance, NULL); - - /* Now create a child list box */ - GetClientRect(hwnd, &rcClient); - - /* Create a rich edit control */ - InitRichEdit(); - g_hwndLogBox = CreateWindowEx(0, (g_nRichEditVersion == 0x0100) ? "RichEdit" : RICHEDIT_CLASS, "", - ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY | ES_NOHIDESEL | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE, - rcClient.left, rcClient.top, rcClient.right, rcClient.bottom, - hwnd, NULL, hInstance, NULL); -/* SendMessage(g_hwndLogBox, EM_SETWORDWRAPMODE, 0, 0); */ - - /* Subclass the control to catch certain messages */ - g_fnLogBox = (WNDPROC) GetWindowLong(g_hwndLogBox, GWL_WNDPROC); - SetWindowLong(g_hwndLogBox, GWL_WNDPROC, (LONG) LogRichEditProc); - - /* Minimizing looks stupid when the log window is not on the task bar, so hide instead */ - if (!g_bShowOnTaskBar && - (nCmdShow == SW_SHOWMINIMIZED || - nCmdShow == SW_MINIMIZE || - nCmdShow == SW_SHOWMINNOACTIVE)) - { - g_bShowLogWindow = FALSE; - nCmdShow = SW_HIDE; - } - - ShowWindow(hwnd, nCmdShow); - UpdateWindow(hwnd); - - - GetClientRect(g_hwndLogFrame, &rcClient); - SetWindowPos(g_hwndLogBox, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, SWP_NOZORDER); - - return hwnd; - -} - - -/********************************************************************* - * - * Function : InitRichEdit - * - * Description : Initialise the rich edit control library. - * - * Parameters : None - * - * Returns : TRUE => success, FALSE => failure. - * FIXME: this is backwards to the rest of IJB and to common - * programming practice. Please use 0 => success instead. - * - *********************************************************************/ -BOOL InitRichEdit(void) -{ - static HINSTANCE hInstRichEdit; - if (hInstRichEdit == NULL) - { - g_nRichEditVersion = 0; - hInstRichEdit = LoadLibraryA("RICHED20.DLL"); - if (hInstRichEdit) - { - g_nRichEditVersion = _RICHEDIT_VER; - } - else - { - hInstRichEdit = LoadLibraryA("RICHED32.DLL"); - if (hInstRichEdit) - { - g_nRichEditVersion = 0x0100; - } - } - } - return (hInstRichEdit != NULL) ? TRUE : FALSE; - -} - - -/********************************************************************* - * - * Function : ShowLogWindow - * - * Description : Shows or hides the log window. We will also raise the - * window on a show command in case it is buried. - * - * Parameters : - * 1 : bShow = TRUE to show, FALSE to mimize/hide - * - * Returns : N/A - * - *********************************************************************/ -void ShowLogWindow(BOOL bShow) -{ - if (bShow) - { - SetForegroundWindow(g_hwndLogFrame); - SetWindowPos(g_hwndLogFrame, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); - - } - else if (g_bShowOnTaskBar) - { - ShowWindow(g_hwndLogFrame, SW_MINIMIZE); - } - else - { - ShowWindow(g_hwndLogFrame, SW_HIDE); - } -} - - -/********************************************************************* - * - * 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. - * - * Returns : N/A - * - *********************************************************************/ -void EditFile(const char *filename) -{ - if (filename) - { - ShellExecute(g_hwndLogFrame, "open", filename, NULL, NULL, SW_SHOWNORMAL); - } - -} - - -/*--------------------------------------------------------------------------*/ -/* Windows message handlers */ -/*--------------------------------------------------------------------------*/ - - -/********************************************************************* - * - * Function : OnLogRButtonUp - * - * Description : Handler for WM_RBUTTONUP messages. - * - * Parameters : - * 1 : nModifier = wParam from mouse message (unused) - * 2 : x = x coordinate of the mouse event - * 3 : y = y coordinate of the mouse event - * - * Returns : N/A - * - *********************************************************************/ -void OnLogRButtonUp(int nModifier, int x, int y) -{ - HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_POPUP_SELECTION)); - if (hMenu != NULL) - { - HMENU hMenuPopup = GetSubMenu(hMenu, 0); - - /* Check if there is a selection */ - CHARRANGE range; - SendMessage(g_hwndLogBox, EM_EXGETSEL, 0, (LPARAM) &range); - if (range.cpMin == range.cpMax) - { - EnableMenuItem(hMenuPopup, ID_EDIT_COPY, MF_BYCOMMAND | MF_GRAYED); - } - else - { - EnableMenuItem(hMenuPopup, ID_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED); - } - - /* Display the popup */ - TrackPopupMenu(hMenuPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, x, y, 0, g_hwndLogFrame, NULL); - DestroyMenu(hMenu); - } - -} - - -/********************************************************************* - * - * Function : OnLogCommand - * - * Description : Handler for WM_COMMAND messages. - * - * Parameters : - * 1 : nCommand = the command portion of the menu selection event - * - * Returns : N/A - * - *********************************************************************/ -void OnLogCommand(int nCommand) -{ - switch (nCommand) - { - case ID_TOGGLE_SHOWWINDOW: - g_bShowLogWindow = !g_bShowLogWindow; - - ShowLogWindow(g_bShowLogWindow); - break; - - case ID_FILE_EXIT: - PostMessage(g_hwndLogFrame, WM_CLOSE, 0, 0); - break; - - case ID_EDIT_COPY: - SendMessage(g_hwndLogBox, WM_COPY, 0, 0); - break; - - case ID_VIEW_CLEARLOG: - SendMessage(g_hwndLogBox, WM_SETTEXT, 0, (LPARAM) ""); - break; - - case ID_VIEW_LOGMESSAGES: - g_bLogMessages = !g_bLogMessages; - /* SaveLogSettings(); */ - break; - - case ID_VIEW_MESSAGEHIGHLIGHTING: - g_bHighlightMessages = !g_bHighlightMessages; - /* SaveLogSettings(); */ - break; - - case ID_VIEW_LIMITBUFFERSIZE: - g_bLimitBufferSize = !g_bLimitBufferSize; - /* SaveLogSettings(); */ - break; - - case ID_VIEW_ACTIVITYANIMATION: - g_bShowActivityAnimation = !g_bShowActivityAnimation; - /* SaveLogSettings(); */ - break; - -#ifdef FEATURE_TOGGLE - /* by haroon - change toggle to its opposite value */ - case ID_TOGGLE_ENABLED: - global_toggle_state = !global_toggle_state; - if (global_toggle_state) - { - log_error(LOG_LEVEL_INFO, "Now toggled ON."); - } - else - { - log_error(LOG_LEVEL_INFO, "Now toggled OFF."); - } - SetIdleIcon(); - break; -#endif /* def FEATURE_TOGGLE */ - - case ID_TOOLS_EDITCONFIG: - EditFile(configfile); - break; - - case ID_TOOLS_EDITDEFAULTACTIONS: - EditFile(g_default_actions_file); - break; - - case ID_TOOLS_EDITUSERACTIONS: - EditFile(g_user_actions_file); - break; - - case ID_TOOLS_EDITFILTERS: - EditFile(g_re_filterfile); - break; - -#ifdef FEATURE_TRUST - case ID_TOOLS_EDITTRUST: - EditFile(g_trustfile); - break; -#endif /* def FEATURE_TRUST */ - - case ID_HELP_GPL: - ShellExecute(g_hwndLogFrame, "open", "LICENSE.txt", NULL, NULL, SW_SHOWNORMAL); - break; - - case ID_HELP_FAQ: - ShellExecute(g_hwndLogFrame, "open", "doc\faq\index.html", NULL, NULL, SW_SHOWNORMAL); - break; - - case ID_HELP_MANUAL: - ShellExecute(g_hwndLogFrame, "open", "doc\user-manual\index.html", NULL, NULL, SW_SHOWNORMAL); - break; - - case ID_HELP_STATUS: - ShellExecute(g_hwndLogFrame, "open", CGI_PREFIX "show-status", NULL, NULL, SW_SHOWNORMAL); - break; - - case ID_HELP_ABOUT: - MessageBox(g_hwndLogFrame, win32_blurb, "About Privoxy", MB_OK); - break; - - default: - /* DO NOTHING */ - break; - } - -} - - -/********************************************************************* - * - * Function : OnLogInitMenu - * - * Description : Handler for WM_INITMENU messages. Enable, disable, - * check, and/or uncheck menu options as apropos. - * - * Parameters : - * 1 : hmenu = handle to menu to "make current" - * - * Returns : N/A - * - *********************************************************************/ -void OnLogInitMenu(HMENU hmenu) -{ - /* Only enable editors if there is a file to edit */ - EnableMenuItem(hmenu, ID_TOOLS_EDITDEFAULTACTIONS, MF_BYCOMMAND | (g_default_actions_file ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(hmenu, ID_TOOLS_EDITUSERACTIONS, MF_BYCOMMAND | (g_user_actions_file ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(hmenu, ID_TOOLS_EDITFILTERS, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED)); -#ifdef FEATURE_TRUST - EnableMenuItem(hmenu, ID_TOOLS_EDITTRUST, MF_BYCOMMAND | (g_trustfile ? MF_ENABLED : MF_GRAYED)); -#endif /* def FEATURE_TRUST */ - - /* 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 - /* by haroon - menu item for Enable toggle on/off */ - CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (global_toggle_state ? MF_CHECKED : MF_UNCHECKED)); -#endif /* def FEATURE_TOGGLE */ - CheckMenuItem(hmenu, ID_TOGGLE_SHOWWINDOW, MF_BYCOMMAND | (g_bShowLogWindow ? MF_CHECKED : MF_UNCHECKED)); - -} - - -/********************************************************************* - * - * Function : OnLogTimer - * - * Description : Handler for WM_TIMER messages. - * - * Parameters : - * 1 : nTimer = timer id (animation start/stop or clip buffer) - * - * Returns : N/A - * - *********************************************************************/ -void OnLogTimer(int nTimer) -{ - switch (nTimer) - { - case TIMER_ANIM_ID: - TraySetIcon(g_hwndTray, 1, g_hiconAnim[g_nAnimFrame++ % ANIM_FRAMES]); - break; - - case TIMER_ANIMSTOP_ID: - g_nAnimFrame = 0; - SetIdleIcon(); - KillTimer(g_hwndLogFrame, TIMER_ANIM_ID); - KillTimer(g_hwndLogFrame, TIMER_ANIMSTOP_ID); - break; - - case TIMER_CLIPBUFFER_ID: - case TIMER_CLIPBUFFER_FORCE_ID: - LogClipBuffer(); - g_bClipPending = FALSE; - KillTimer(g_hwndLogFrame, TIMER_CLIPBUFFER_ID); - KillTimer(g_hwndLogFrame, TIMER_CLIPBUFFER_FORCE_ID); - break; - - default: - /* DO NOTHING */ - break; - } - -} - - -/********************************************************************* - * - * Function : SetIdleIcon - * - * Description : Sets the tray icon to either idle or off - * - * Parameters : none - * - * Returns : N/A - * - *********************************************************************/ -void SetIdleIcon() -{ -#ifdef FEATURE_TOGGLE - if (!global_toggle_state) - { - TraySetIcon(g_hwndTray, 1, g_hiconOff); - /* log_error(LOG_LEVEL_INFO, "Privoxy OFF icon selected."); */ - } - else -#endif /* def FEATURE_TOGGLE */ - TraySetIcon(g_hwndTray, 1, g_hiconIdle); -} - - -/********************************************************************* - * - * Function : LogRichEditProc - * - * Description : Window subclass routine handles some events for the rich edit control. - * - * Parameters : - * 1 : hwnd = window handle of the rich edit control - * 2 : uMsg = message number - * 3 : wParam = first param for this message - * 4 : lParam = next param for this message - * - * Returns : Appropriate M$ window message handler codes. - * - *********************************************************************/ -LRESULT CALLBACK LogRichEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) - { - case WM_RBUTTONUP: - { - POINT pt; - pt.x = LOWORD(lParam); - pt.y = HIWORD(lParam); - ClientToScreen(hwnd, &pt); - OnLogRButtonUp(wParam, pt.x, pt.y); - return 0; - } - case WM_CHAR: - { - if ((GetKeyState(VK_CONTROL) != 0) && (wParam == 4)) /* ctrl+d */ - { - OnLogCommand(ID_VIEW_CLEARLOG); - return 0; - } - } - } - return CallWindowProc(g_fnLogBox, hwnd, uMsg, wParam, lParam); - -} - - -/********************************************************************* - * - * Function : LogWindowProc - * - * Description : Windows call back routine handles events on the log window. - * - * Parameters : - * 1 : hwnd = handle of the logging window - * 2 : uMsg = message number - * 3 : wParam = first param for this message - * 4 : lParam = next param for this message - * - * Returns : Appropriate M$ window message handler codes. - * - *********************************************************************/ -LRESULT CALLBACK LogWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) - { - case WM_CREATE: - return 0; - - case WM_CLOSE: - /* This is the end - beautiful friend - the end */ - DestroyWindow(g_hwndLogBox); - DestroyWindow(g_hwndLogFrame); - return 0; - - case WM_DESTROY: - PostQuitMessage(0); - return 0; - - case WM_SHOWWINDOW: - g_bShowLogWindow = wParam; - case WM_SIZE: - /* Resize the logging window to fit the new frame */ - if (g_hwndLogBox) - { - RECT rc; - GetClientRect(g_hwndLogFrame, &rc); - SetWindowPos(g_hwndLogBox, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER); - } - return 0; - - case WM_INITMENU: - OnLogInitMenu((HMENU) wParam); - return 0; - - case WM_TIMER: - OnLogTimer(wParam); - return 0; - - case WM_COMMAND: - OnLogCommand(LOWORD(wParam)); - return 0; - - case WM_SYSCOMMAND: - switch (wParam) - { - case SC_CLOSE: - if (g_bCloseHidesWindow) - { - ShowLogWindow(FALSE); - return 0; - } - break; - case SC_MINIMIZE: - ShowLogWindow(FALSE); - return 0; - } - break; - - case WM_CHAR: - if ((GetKeyState(VK_CONTROL) != 0) && (wParam == 4)) /* ctrl+d */ - { - OnLogCommand(ID_VIEW_CLEARLOG); - return 0; - } - break; - } - - return DefWindowProc(hwnd, uMsg, wParam, lParam); - -} - -#endif /* ndef _WIN_CONSOLE - entire file */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/w32log.h b/external/privoxy/w32log.h deleted file mode 100644 index fff13ad..0000000 --- a/external/privoxy/w32log.h +++ /dev/null @@ -1,181 +0,0 @@ -#ifndef W32LOG_H_INCLUDED -#define W32LOG_H_INCLUDED -#define W32LOG_H_VERSION "$Id: w32log.h,v 1.13 2009/03/07 17:58:02 fabiankeil Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/w32log.h,v $ - * - * Purpose : Functions for creating and destroying the log window, - * ouputting strings, processing messages and so on. - * - * Copyright : Written by and Copyright (C) 2001-2009 members of - * the Privoxy team. http://www.privoxy.org/ - * - * Written by and Copyright (C) 1999 Adam Lock - * locka@iol.ie - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: w32log.h,v $ - * Revision 1.13 2009/03/07 17:58:02 fabiankeil - * Fix two mingw32-only buffer overflows. Note that triggering - * them requires control over the configuration file in which - * case all bets are off anyway. - * - * Revision 1.12 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.10.2.2 2002/11/20 14:39:05 oes - * Fixed compiler warning - * - * Revision 1.10.2.1 2002/08/21 17:58:05 oes - * Temp kludge to let user and default action file be edited through win32 GUI (FR 592080) - * - * Revision 1.10 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * 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". - * - * Revision 1.3 2001/05/29 09:50:24 jongfoster - * Unified blocklist/imagelist/permissionslist. - * File format is still under discussion, but the internal changes - * are (mostly) done. - * - * Also modified interceptor behaviour: - * - We now intercept all URLs beginning with one of the following - * prefixes (and *only* these prefixes): - * * http://i.j.b/ - * * http://ijbswa.sf.net/config/ - * * http://ijbswa.sourceforge.net/config/ - * - New interceptors "home page" - go to http://i.j.b/ to see it. - * - Internal changes so that intercepted and fast redirect pages - * are not replaced with an image. - * - Interceptors now have the option to send a binary page direct - * to the client. (i.e. ijb-send-banner uses this) - * - Implemented show-url-info interceptor. (Which is why I needed - * the above interceptors changes - a typical URL is - * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". - * The previous mechanism would not have intercepted that, and - * if it had been intercepted then it then it would have replaced - * it with an image.) - * - * Revision 1.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:07 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern HWND g_hwndLogFrame; - -/* Indicates whether task bar shows activity animation */ -extern BOOL g_bShowActivityAnimation; - -/* Indicates if the log window appears on the task bar */ -extern BOOL g_bShowOnTaskBar; - -/* Indicates whether closing the log window really just hides it */ -extern BOOL g_bCloseHidesWindow; - -/* Indicates if messages are logged at all */ -extern BOOL g_bLogMessages; - -/* Indicates whether log messages are highlighted */ -extern BOOL g_bHighlightMessages; - -/* Indicates if buffer is limited in size */ -extern BOOL g_bLimitBufferSize; - -/* Maximum number of lines allowed in buffer when limited */ -extern int g_nMaxBufferLines; - -/* Font to use */ -extern char g_szFontFaceName[32]; - -/* Size of font to use */ -extern int g_nFontSize; - - -/* FIXME: this is a kludge */ - -extern const char * g_default_actions_file; -extern const char * g_user_actions_file; -extern const char * g_re_filterfile; -#ifdef FEATURE_TRUST -extern const char * g_trustfile; -#endif /* def FEATURE_TRUST */ - -/* FIXME: end kludge */ - -extern HICON g_hiconApp; -extern int LogPutString(const char *pszText); -extern BOOL InitLogWindow(void); -extern void TermLogWindow(void); -extern void ShowLogWindow(BOOL bShow); -extern void LogShowActivity(void); - -/* Revision control strings from this header and associated .c file */ -extern const char w32log_rcs[]; -extern const char w32log_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef W32LOG_H_INCLUDED */ - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/w32res.h b/external/privoxy/w32res.h deleted file mode 100644 index ecee2c3..0000000 --- a/external/privoxy/w32res.h +++ /dev/null @@ -1,194 +0,0 @@ -#ifndef W32RES_H_INCLUDED -#define W32RES_H_INCLUDED -#define W32RES_H_VERSION "$Id: w32res.h,v 1.17 2009/01/01 15:09:23 ler762 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/ - * - * 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: w32res.h,v $ - * Revision 1.17 2009/01/01 15:09:23 ler762 - * Change the Windows taskbar icon when privoxy is toggled off. - * - * Revision 1.16 2008/11/02 14:37:47 ler762 - * commit the part of the patches I've been using that were written by torford and gjmurphy - * [ 1824315 ] Minor code cleanup - * [ 1781135 ] Patch - Add clear log, select all, and Accelerators for w32 - * http://sourceforge.net/tracker/?func=detail&atid=311118&aid=1781135&... - * The full patch adds control keys A(select all), C(copy) and D(delete all) to the - * Privoxy log window menu. Select all and copy work for me without the patch - * (albeit without showing the accelerator keys on the menu), so the only part of the - * patch I've been using for the last year or so has been the ctrl-d to delete - * everything in the Privoxy log window. - * - * Revision 1.15 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.13.2.1 2002/08/21 17:59:06 oes - * - "Show Privoxy Window" now a toggle - * - Temp kludge to let user and default action file be edited through win32 GUI (FR 592080) - * - * Revision 1.13 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * 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". - * - * Revision 1.5 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.4 2001/05/26 01:26:34 jongfoster - * New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor. - * This #define cannot be set from ./configure - there's no point, it - * doesn't work yet. See feature request # 425722 - * - * Revision 1.3 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.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:59:08 oes - * Initial import of version 2.9.3 source tree - * - * - *********************************************************************/ - -#define IDR_TRAYMENU 101 -#define IDI_IDLE 102 -#define IDR_LOGVIEW 103 -#define IDR_ACCELERATOR 104 -#define IDR_POPUP_SELECTION 105 - - -#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_OFF 209 - -#define ID_TOGGLE_SHOWWINDOW 4000 -#define ID_HELP_ABOUT 4001 -#define ID_FILE_EXIT 4002 -#define ID_VIEW_CLEARLOG 4003 -#define ID_VIEW_LOGMESSAGES 4004 -#define ID_VIEW_MESSAGEHIGHLIGHTING 4005 -#define ID_VIEW_LIMITBUFFERSIZE 4006 -#define ID_VIEW_ACTIVITYANIMATION 4007 -#define ID_HELP_FAQ 4008 -#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 */ - -/* Break these out so they are easier to extend, but keep consecutive */ -#define ID_TOOLS_EDITCONFIG 5000 -#define ID_TOOLS_EDITDEFAULTACTIONS 5001 -#define ID_TOOLS_EDITUSERACTIONS 5002 -#define ID_TOOLS_EDITFILTERS 5003 - -#ifdef FEATURE_TRUST -#define ID_TOOLS_EDITTRUST 5004 -#endif /* def FEATURE_TRUST */ - -#define ID_EDIT_COPY 30000 - - -#endif /* ndef W32RES_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/w32svrapi.c b/external/privoxy/w32svrapi.c deleted file mode 100644 index aed1232..0000000 --- a/external/privoxy/w32svrapi.c +++ /dev/null @@ -1,952 +0,0 @@ -const char w32_svrapi_rcs[] = "$Id: w32svrapi.c,v 1.2 2006/09/20 03:15:43 david__schmidt Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/w32svrapi.c,v $ - * - * Purpose : Win32 Services API for Privoxy. - * Provides the implementation of an Win32 service to - * allow the code to directly register and run as a - * native Windows service application. - * - * Since Win9x/ME platforms don't provide or support - * running programs as services, this code uses runtime - * loading and calling of the Win32 Service API, to - * prevent the possibility of getting "entry point not - * found" type errors on unsupported platforms. This adds - * a little more complexity to the code, but it is worth - * doing to provide that isolation. - * - * Copyright : Written by and Copyright (C) 2003, 2006 members of - * the Privoxy team. http://www.privoxy.org/ - * - * Written by and Copyright (C) 2003 Ian Cummings - * ian_a_c@hotmail.com - * - * Special thanks to Mates Dolák matesek@post.cz for - * some very helpful feedback and suggestions during the - * development of this code. - * - * 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: w32svrapi.c,v $ - * Revision 1.2 2006/09/20 03:15:43 david__schmidt - * Clean up a variable type declaration which just - * happened to work... - * - * Revision 1.1 2006/08/12 03:54:37 david__schmidt - * Windows service integration - * - * - * - *********************************************************************/ - - -#include "config.h" - -#ifdef _WIN32 - -#include <stdio.h> - -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> -#include <process.h> - -#ifndef _WIN_CONSOLE -# include "w32log.h" -#endif /* ndef _WIN_CONSOLE */ - -#include "w32svrapi.h" -const char w32_svrapi_h_rcs[] = W32_SVRAPI_H_VERSION; - - -/* Only the ANSI Win32 APIs are used at this time. If for some - * reason, we're building under unicode then we must stop - */ -#ifdef UNICODE -#error "Privoxy interface to Win32 Services only runs under ANSI builds. Unicode is not supported at present, but you can volunteer for the job if you like! :)" -#endif - - -/* Default to not running as service, unless the command line says so */ -BOOL bRunAsService = FALSE; - -/* According to the Win32 docs for CreateService, - * the max length for the service name is 256 chars - */ -char szThisServiceName[260]; - -static BOOL get_service_description(const char *pszServiceName, char *pszDisplayName, DWORD dwDispSize); -static void WINAPI privoxy_w32_service_start(DWORD dw, LPSTR* psz); -static void WINAPI privoxy_w32_service_handler(DWORD dwOpcode); -SERVICE_TABLE_ENTRY w32ServiceDispatchTable[] = {{"", privoxy_w32_service_start}, {NULL, NULL}}; -static SERVICE_STATUS_HANDLE hSrv_status = 0; -static SERVICE_STATUS srv_status; - - - -/********************************************************************* - * This function returns TRUE if we are running on an OS that can - * support services, like NT, etc. It returns FALSE for Win9x/ME. - *********************************************************************/ -static BOOL HasServiceControlManager() -{ - HMODULE hDll; - FARPROC pFunc; - SC_HANDLE hScm; - - /* Load the DLL with the SCM functions or return a failure status */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - printf("Can't load Advapi32.dll -- LoadLibrary failed!\n"); - return FALSE; - } - - /* Get the address of the ANSI OpenSCManager function, or return a failure status */ - pFunc = GetProcAddress(hDll, "OpenSCManagerA"); - if (pFunc == NULL) - { - printf("Can't find OpenSCManagerA -- GetProcAddress failed!\n"); - FreeLibrary(hDll); - return FALSE; - } - - /* Try and connect to the SCM. If it fails check and see if the error - * code is ERROR_CALL_NOT_IMPLEMENTED, which means: - * "This function is not supported on this system." - */ - hScm = (SC_HANDLE)(*pFunc)(NULL, NULL, SC_MANAGER_CONNECT); - if (hScm == NULL) - { - DWORD dwErr = GetLastError(); - if (dwErr == ERROR_CALL_NOT_IMPLEMENTED) - { - /* Expected error under Win9x/Me, so don't print any debug info - * here as we'll leave that up to the calling function to do - */ - FreeLibrary(hDll); - return FALSE; - } - - printf("Call to OpenSCManager failed -- GetLastError() returned %lu!\n", dwErr); - FreeLibrary(hDll); - return FALSE; - } - - w32_close_service_handle(hScm); - - /* OpenSCManager function exists and works, so we're on an NT type platform */ - FreeLibrary(hDll); - - return TRUE; - -} /* -END- HasServiceControlManager */ - - -BOOL CanSystemSupportServices() -{ - BOOL bHasScm = HasServiceControlManager(); - return bHasScm; - -} /* -END- CanSystemSupportServices */ - - - -/********************************************************************* - * - * The Service functions are defined in <winsvc.h> which is where - * the declarations used in this file are taken from - * - *********************************************************************/ - - -/********************************************************************* - * Open a connection to the service control manager - *********************************************************************/ -SC_HANDLE w32_open_sc_manager( - LPCTSTR lpMachineName, /* computer name */ - LPCTSTR lpDatabaseName, /* SCM database name */ - DWORD dwDesiredAccess) /* access type */ -{ - HMODULE hDll = NULL; - SC_HANDLE hScm = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - - /* Load the DLL with the SCM functions or return failure */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return NULL; - } - - /* Get the address of the ANSI OpenSCManager function, or return failure */ - pFunc = GetProcAddress(hDll, "OpenSCManagerA"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return NULL; - } - - /* Call the SCM function, and save the error code */ - hScm = (SC_HANDLE)(*pFunc)(lpMachineName, lpDatabaseName, dwDesiredAccess); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return hScm; - -} /* -END- w32_open_sc_manager */ - - - -BOOL w32_close_service_handle( - SC_HANDLE hSCObject) /* handle to service or SCM object */ -{ - HMODULE hDll = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - BOOL bRet; - - /* Load the DLL with the SCM functions or return a failure status */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return FALSE; - } - - /* Get the address of the CloseServiceHandle function, or return a failure status */ - pFunc = GetProcAddress(hDll, "CloseServiceHandle"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return FALSE; - } - - /* Close the handle, and save the error code */ - bRet = (BOOL)(*pFunc)(hSCObject); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return bRet; - -} /* -END- w32_close_service_handle */ - - - -/********************************************************************* - * Open a service - *********************************************************************/ -SC_HANDLE w32_open_service( - SC_HANDLE hSCManager, /* handle to SCM database */ - LPCTSTR lpServiceName, /* service name */ - DWORD dwDesiredAccess) /* access */ -{ - HMODULE hDll = NULL; - SC_HANDLE hSrv = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - - /* Load the DLL with the SCM functions or return failure */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return NULL; - } - - /* Get the address of the ANSI OpenService function, or return failure */ - pFunc = GetProcAddress(hDll, "OpenServiceA"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return NULL; - } - - /* Call the SCM function, and save the error code */ - hSrv = (SC_HANDLE)(*pFunc)(hSCManager, lpServiceName, dwDesiredAccess); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return hSrv; - -} /* -END- w32_open_service */ - - - -SC_HANDLE w32_create_service( - SC_HANDLE hSCManager, /* handle to SCM database */ - LPCTSTR lpServiceName, /* name of service to start */ - LPCTSTR lpDisplayName, /* display name */ - DWORD dwDesiredAccess, /* type of access to service */ - DWORD dwServiceType, /* type of service */ - DWORD dwStartType, /* when to start service */ - DWORD dwErrorControl, /* severity of service failure */ - LPCTSTR lpBinaryPathName, /* name of binary file */ - LPCTSTR lpLoadOrderGroup, /* name of load ordering group */ - LPDWORD lpdwTagId, /* tag identifier */ - LPCTSTR lpDependencies, /* array of dependency names */ - LPCTSTR lpServiceStartName, /* account name */ - LPCTSTR lpPassword) /* account password */ -{ - HMODULE hDll = NULL; - SC_HANDLE hSrv = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - - /* Load the DLL with the SCM functions or return failure */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return NULL; - } - - /* Get the address of the ANSI CreateService function, or return failure */ - pFunc = GetProcAddress(hDll, "CreateServiceA"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return NULL; - } - - /* Call the SCM function, and save the error code */ - hSrv = (SC_HANDLE)(*pFunc)(hSCManager, /* handle to SCM database */ - lpServiceName, /* name of service to start */ - lpDisplayName, /* display name */ - dwDesiredAccess, /* type of access to service */ - dwServiceType, /* type of service */ - dwStartType, /* when to start service */ - dwErrorControl, /* severity of service failure */ - lpBinaryPathName, /* name of binary file */ - lpLoadOrderGroup, /* name of load ordering group */ - lpdwTagId, /* tag identifier */ - lpDependencies, /* array of dependency names */ - lpServiceStartName, /* account name */ - lpPassword); /* account password */ - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return hSrv; - -} /* -END- w32_create_service */ - - - -BOOL w32_delete_service( - SC_HANDLE hService) /* handle to service */ -{ - HMODULE hDll = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - BOOL bRet; - - /* Load the DLL with the SCM functions or return a failure status */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return FALSE; - } - - /* Get the address of the DeleteService function, or return a failure status */ - pFunc = GetProcAddress(hDll, "DeleteService"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return FALSE; - } - - /* Close the handle, and save the error code */ - bRet = (BOOL)(*pFunc)(hService); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return bRet; - -} /* -END- w32_delete_service */ - - - -BOOL w32_query_service_config( - SC_HANDLE hService, /* handle to service */ - LPQUERY_SERVICE_CONFIG lpServiceConfig, /* buffer */ - DWORD cbBufSize, /* size of buffer */ - LPDWORD pcbBytesNeeded) /* bytes needed */ -{ - HMODULE hDll = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - BOOL bRet; - - /* Load the DLL with the SCM functions or return a failure status */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return FALSE; - } - - /* Get the address of the QueryServiceConfig function, or return a failure status */ - pFunc = GetProcAddress(hDll, "QueryServiceConfigA"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return FALSE; - } - - /* Close the handle, and save the error code */ - bRet = (BOOL)(*pFunc)(hService, lpServiceConfig, cbBufSize, pcbBytesNeeded); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return bRet; - -} /* -END- w32_query_service_config */ - - -BOOL w32_start_service_ctrl_dispatcher( - CONST LPSERVICE_TABLE_ENTRY lpServiceTable) /* service table */ -{ - HMODULE hDll = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - BOOL bRet; - - /* Load the DLL with the SCM functions or return a failure status */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return FALSE; - } - - /* Get the address of the StartServiceCtrlDispatcher function, or return a failure status */ - pFunc = GetProcAddress(hDll, "StartServiceCtrlDispatcherA"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return FALSE; - } - - /* Close the handle, and save the error code */ - bRet = (BOOL)(*pFunc)(lpServiceTable); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return bRet; - -} /* -END- w32_start_service_ctrl_dispatcher */ - - - -SERVICE_STATUS_HANDLE w32_register_service_ctrl_handler( - LPCTSTR lpServiceName, /* service name */ - LPHANDLER_FUNCTION lpHandlerProc) /* handler function */ -{ - HMODULE hDll = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - SERVICE_STATUS_HANDLE hServStat = (SERVICE_STATUS_HANDLE)0; - - /* Load the DLL with the SCM functions or return a failure status */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return hServStat; - } - - /* Get the address of the RegisterServiceCtrlHandler function, or return a failure status */ - pFunc = GetProcAddress(hDll, "RegisterServiceCtrlHandlerA"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return hServStat; - } - - /* Close the handle, and save the error code */ - hServStat = (SERVICE_STATUS_HANDLE)(*pFunc)(lpServiceName, lpHandlerProc); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return hServStat; - -} /* -END- w32_register_service_ctrl_handler */ - - - -BOOL w32_set_service_status( - SERVICE_STATUS_HANDLE hServiceStatus, /* service status handle */ - LPSERVICE_STATUS lpServiceStatus) /* status buffer */ -{ - HMODULE hDll = NULL; - FARPROC pFunc = NULL; - DWORD dwLastErr = 0; - BOOL bRet; - - /* Load the DLL with the SCM functions or return a failure status */ - hDll = LoadLibrary("Advapi32.dll"); - if (hDll == NULL) - { - return FALSE; - } - - /* Get the address of the SetServiceStatus function, or return a failure status */ - pFunc = GetProcAddress(hDll, "SetServiceStatus"); - if (pFunc == NULL) - { - FreeLibrary(hDll); - return FALSE; - } - - /* Close the handle, and save the error code */ - bRet = (BOOL)(*pFunc)(hServiceStatus, lpServiceStatus); - dwLastErr = GetLastError(); - - /* Release the library and then restore the last error - * code, in case FreeLibrary altered it. - */ - FreeLibrary(hDll); - SetLastError(dwLastErr); - - return bRet; - -} /* -END- w32_set_service_status */ - - -static void display_win32_msg(BOOL bIsError, char *msg) -{ -#ifdef _WIN_CONSOLE - printf("%s", msg); -#else - if (bIsError) - { - MessageBox(NULL, msg, "Privoxy Error", - MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); - } - else - { - MessageBox(NULL, msg, "Privoxy Information", - MB_OK | MB_ICONINFORMATION | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); - } -#endif - -} /* -END- display_win32_msg */ - - -static BOOL get_service_description(const char *pszServiceName, char *pszDisplayName, DWORD dwDispSize) -{ - /********************************************************************* - * Create a simple display name - *********************************************************************/ - strcpy(pszDisplayName, "Privoxy ("); - strncat(pszDisplayName, pszServiceName, dwDispSize - strlen(pszDisplayName) - 2); - strcat(pszDisplayName, ")"); - - return TRUE; -} - - - -BOOL install_service(const char *service_name) -{ - char szModule[(MAX_PATH*2)+1]; - char szDisplayName[MAX_PATH+2]; - SC_HANDLE hSCM; - SC_HANDLE hService; - - /********************************************************************* - * First check if this system can support a service architecture - *********************************************************************/ - if (!CanSystemSupportServices()) - { - display_win32_msg(TRUE, "This system doesn't support installing Privoxy as a service.\nWinNT/2000/XP are required for this feature.\n"); - return FALSE; - } - - /* Use a default service name if none was supplied */ - if ((service_name == NULL) || (strlen(service_name) == 0)) - { - service_name = "privoxy"; - } - - /********************************************************************* - * Open a handle to the Service Control Manager with full access rights - *********************************************************************/ - hSCM = w32_open_sc_manager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - if (hSCM == NULL) - { - display_win32_msg(TRUE, "Can't open Service Control Manager - Service install failed!\n Administrator rights are required to create a service.\n"); - return FALSE; - } - - - /********************************************************************* - * Work out the full image path plus command line for the service - * We'll temporarily use szDisplayName as a second buffer. - *********************************************************************/ - GetModuleFileName(NULL, szDisplayName, MAX_PATH); - sprintf(szModule, ""%s" --service", szDisplayName); - - - /********************************************************************* - * Get the display name for the service - *********************************************************************/ - get_service_description(service_name, szDisplayName, sizeof(szDisplayName)/sizeof(char)); - - - /********************************************************************* - * Create the service - *********************************************************************/ - hService = w32_create_service(hSCM, - service_name, /* the internal service name */ - szDisplayName, /* the display name */ - SERVICE_ALL_ACCESS, /* get full access during creation */ - SERVICE_WIN32_OWN_PROCESS /* run in our own process */ -#ifndef _WIN_CONSOLE - + SERVICE_INTERACTIVE_PROCESS /* GUI also wants interactive rights */ -#endif - , - SERVICE_DEMAND_START, /* For now, only start when asked to */ - SERVICE_ERROR_NORMAL, /* Normal error handling by the SCM */ - szModule, /* The executable service file */ - NULL, /* No load order info needed */ - NULL, /* No load order info needed */ - NULL, /* No dependencies */ - NULL, /* Default to LocalSystem... */ - NULL); /* ...which doesn't require a password */ - if (hService == NULL) - { - display_win32_msg(TRUE, "Can't install service!\n"); - w32_close_service_handle(hSCM); - return FALSE; - } - - display_win32_msg(FALSE, "Service was successfully created.\n*** IMPORTANT NOTE: You should now use the Services control panel to\n*** configure the startup type and user account details for the service.\n\n"); - - /* tidy up */ - w32_close_service_handle(hService); - w32_close_service_handle(hSCM); - return TRUE; - -} /* -END- install_service */ - - - -BOOL uninstall_service(const char *service_name) -{ - char szDisplayName[MAX_PATH+2]; - SC_HANDLE hSCM; - SC_HANDLE hService; - BOOL bResult = FALSE; - - - /********************************************************************* - * First check if this system can support a service architecture - *********************************************************************/ - if (!CanSystemSupportServices()) - { - display_win32_msg(TRUE, "This system doesn't support installing Privoxy as a service.\nWinNT/2000/XP are required for this feature.\n"); - return FALSE; - } - - - /* Use a default service name if none was supplied */ - if ((service_name == NULL) || (strlen(service_name) == 0)) - { - service_name = "privoxy"; - } - - - /********************************************************************* - * Open a handle to the Service Control Manager with full access rights - *********************************************************************/ - hSCM = w32_open_sc_manager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - if (hSCM == NULL) - { - display_win32_msg(TRUE, "Can't open Service Control Manager - Service uninstall failed!\n Administrator rights are required to delete a service.\n"); - return FALSE; - } - - - /********************************************************************* - * Get the display name for the service - *********************************************************************/ - get_service_description(service_name, szDisplayName, sizeof(szDisplayName)/sizeof(char)); - - - /********************************************************************* - * Open and then delete the service - *********************************************************************/ - hService = w32_open_service(hSCM, service_name, DELETE); - if (hService == NULL) - { - display_win32_msg(TRUE, "Can't open service for delete access rights!\n"); - w32_close_service_handle(hSCM); - return FALSE; - } - - if (w32_delete_service(hService)) - { - display_win32_msg(FALSE, "Service was deleted successfully.\n"); - bResult = TRUE; - } - else - { - display_win32_msg(TRUE, "Service could not be deleted!\n"); - bResult = FALSE; - } - - w32_close_service_handle(hService); - w32_close_service_handle(hSCM); - return bResult; - -} /* -END- uninstall_service */ - - - -/********************************************************************* - * - * Function : privoxy_w32_service_start - * - * Description : This is the entry point function for the service. - * In other words, it's the ServiceMain function. - * - * Parameters : Defined by the Win32 API, but not used here - * - * Returns : void - * - *********************************************************************/ -static void WINAPI privoxy_w32_service_start(DWORD dw, LPSTR* pszArgs) -{ - int child_id; - - /* Arg zero is always the service name, and we need to - * know it when we call RegisterServiceCtrlHandler. - */ - strcpy(szThisServiceName, pszArgs[0]); - - /* Tell the SCM we are running */ - srv_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - srv_status.dwCurrentState = SERVICE_RUNNING; - srv_status.dwCheckPoint = 0; - srv_status.dwControlsAccepted = SERVICE_ACCEPT_STOP; - srv_status.dwWin32ExitCode = NO_ERROR; - srv_status.dwServiceSpecificExitCode = 0; - srv_status.dwWaitHint = 0; - - hSrv_status = w32_register_service_ctrl_handler(szThisServiceName, privoxy_w32_service_handler); - if (!hSrv_status) - { - return; - } - w32_set_service_status(hSrv_status, &srv_status); - -#ifndef FEATURE_PTHREAD - child_id = _beginthread(w32_service_listen_loop, 0, NULL); - if (child_id > 0) -#else -#error "FIXME: Do pthread stuff here!" -#endif - { - w32_set_service_status(hSrv_status, &srv_status); - } - else - { - srv_status.dwCurrentState = SERVICE_STOPPED; - srv_status.dwCheckPoint = 0; - srv_status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - srv_status.dwServiceSpecificExitCode = ERROR_SERVICE_NO_THREAD; - w32_set_service_status(hSrv_status, &srv_status); - } -} - - -/********************************************************************* - * - * Function : w32_set_service_cwd - * - * Description : Simple function to change the current directory to - * the same location as the service executable. - * - * Parameters : void - * - * Returns : void - * - *********************************************************************/ -void w32_set_service_cwd(void) -{ - char exe_name[MAX_PATH+1]; - char dir_name[MAX_PATH+1]; - char *pszFile = NULL; - - /* Get the exe name and path of the service */ - if (GetModuleFileName(NULL, exe_name, MAX_PATH)) - { - /* Ask the API to tell us where the filename portion starts */ - if (GetFullPathName(exe_name, MAX_PATH, dir_name, &pszFile)) - { - /* remove the filename from the string */ - if (pszFile != NULL) - { - *pszFile = '\0'; - /* We have just a directory path now, so make it current */ - SetCurrentDirectory(dir_name); - } - } - } -} - - -/********************************************************************* - * - * Function : w32_service_exit_notify - * - * Description : This is a simple atexit function that is called by the - * C runtime after exit has been called. It allows the - * service code to detect when the app is about to die and - * send an quick notification to the SCM that the service - * now stopped. - * - * Parameters : void - * - * Returns : void - * - *********************************************************************/ -void w32_service_exit_notify(void) -{ - if (hSrv_status != 0) - { - if (srv_status.dwCurrentState != SERVICE_STOPPED) - { - srv_status.dwCurrentState = SERVICE_STOPPED; - srv_status.dwCheckPoint = 0; - srv_status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - srv_status.dwServiceSpecificExitCode = ERROR_PROCESS_ABORTED; - w32_set_service_status(hSrv_status, &srv_status); - } - } -} - - -static void w32_mini_exit(void *p) -{ - Sleep(100); -#ifdef _WIN_CONSOLE - exit(0); -#else - PostMessage(g_hwndLogFrame, WM_CLOSE, 0, 0); -#endif /* def _WIN_CONSOLE */ -} - - -/********************************************************************* - * - * Function : privoxy_w32_service_handler - * - * Description : This is the control message handler function for - * the service. - * - * Parameters : dwOpcode - * requested control code sent by SCM - * - * Returns : void - * - *********************************************************************/ -static void WINAPI privoxy_w32_service_handler(DWORD dwOpcode) -{ - switch(dwOpcode) - { - case SERVICE_CONTROL_STOP: - /* We've stopped - */ - srv_status.dwCurrentState = SERVICE_STOPPED; - srv_status.dwCheckPoint = 0; - srv_status.dwWin32ExitCode = NO_ERROR; - srv_status.dwServiceSpecificExitCode = 0; - - /* Maybe there is a more friendly way to stop, but this will do for now! */ - w32_set_service_status(hSrv_status, &srv_status); - - /* During testing, I kept getting error 109 (ERROR_BROKEN_PIPE) and - * as far as the SCM was concerned the service was still stopping, - * even after the process had disappeared. - * - * It seems that if we call exit in the ServiceMain thread, it causes - * the SCM to not recieve the status we sent in the line above. The - * simple fix was to create a new thread to actually call exit for us - * whilst this thread continues and returns to its caller. - */ - - if (_beginthread(w32_mini_exit, 0, NULL) < 0) - { - /* we failed to create the exit thread, so just force an exit here - * and the SCM will just have to go and whistle! - */ - exit(0); - } - break; - - default: - break; - } - - w32_set_service_status(hSrv_status, &srv_status); -} - - -#endif /* ifdef _WIN32 */ - diff --git a/external/privoxy/w32svrapi.h b/external/privoxy/w32svrapi.h deleted file mode 100644 index 48a6d8d..0000000 --- a/external/privoxy/w32svrapi.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef W32_SVRAPI_H_INCLUDED -#define W32_SVRAPI_H_INCLUDED -#define W32_SVRAPI_H_VERSION "$Id: w32svrapi.h,v 1.1 2006/08/12 03:54:37 david__schmidt Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/w32svrapi.h,v $ - * - * Purpose : Win32 Services API for Privoxy. - * Provides the implementation of an Win32 service to - * allow the code to directly register and run as a - * native Windows service application. - * - * Since Win9x/ME platforms don't provide or support - * running programs as services, this code uses runtime - * loading and calling of the Win32 Service API, to - * prevent the possibility of getting "entry point not - * found" type errors on unsupported platforms. This adds - * a little more complexity to the code, but it is worth - * doing to provide that isolation. - * - * Copyright : Written by and Copyright (C) 2003 members of - * the Privoxy team. http://www.privoxy.org/ - * - * Written by and Copyright (C) 2003 Ian Cummings - * ian_a_c@hotmail.com - * - * Special thanks to Mates Dolák matesek@post.cz for - * some very helpful feedback and suggestions during the - * development of this code. - * - * - * 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: w32svrapi.h,v $ - * Revision 1.1 2006/08/12 03:54:37 david__schmidt - * Windows service integration - * - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - - -extern char szThisServiceName[]; -extern BOOL bRunAsService; -extern SERVICE_TABLE_ENTRY w32ServiceDispatchTable[]; - -extern BOOL install_service(const char *service_name); -extern BOOL uninstall_service(const char *service_name); -extern void w32_service_exit_notify(void); -extern void w32_set_service_cwd(void); -extern void w32_service_listen_loop(void *p); - - -extern BOOL CanSystemSupportServices(); - - -extern SC_HANDLE w32_open_sc_manager( - LPCTSTR lpMachineName, /* computer name */ - LPCTSTR lpDatabaseName, /* SCM database name */ - DWORD dwDesiredAccess); /* access type */ - - -extern BOOL w32_close_service_handle( - SC_HANDLE hSCObject); /* handle to service or SCM object */ - - -extern SC_HANDLE w32_open_service( - SC_HANDLE hSCManager, /* handle to SCM database */ - LPCTSTR lpServiceName, /* service name */ - DWORD dwDesiredAccess); /* access */ - - -extern SC_HANDLE w32_create_service( - SC_HANDLE hSCManager, /* handle to SCM database */ - LPCTSTR lpServiceName, /* name of service to start */ - LPCTSTR lpDisplayName, /* display name */ - DWORD dwDesiredAccess, /* type of access to service */ - DWORD dwServiceType, /* type of service */ - DWORD dwStartType, /* when to start service */ - DWORD dwErrorControl, /* severity of service failure */ - LPCTSTR lpBinaryPathName, /* name of binary file */ - LPCTSTR lpLoadOrderGroup, /* name of load ordering group */ - LPDWORD lpdwTagId, /* tag identifier */ - LPCTSTR lpDependencies, /* array of dependency names */ - LPCTSTR lpServiceStartName, /* account name */ - LPCTSTR lpPassword); /* account password */ - - -extern BOOL w32_delete_service( - SC_HANDLE hService); /* handle to service */ - - -extern BOOL w32_query_service_config( - SC_HANDLE hService, /* handle to service */ - LPQUERY_SERVICE_CONFIG lpServiceConfig, /* buffer */ - DWORD cbBufSize, /* size of buffer */ - LPDWORD pcbBytesNeeded); /* bytes needed */ - - -extern BOOL w32_start_service_ctrl_dispatcher( - CONST LPSERVICE_TABLE_ENTRY lpServiceTable); /* service table */ - - -extern SERVICE_STATUS_HANDLE w32_register_service_ctrl_handler( - LPCTSTR lpServiceName, /* service name */ - LPHANDLER_FUNCTION lpHandlerProc); /* handler function */ - - -extern BOOL w32_set_service_status( - SERVICE_STATUS_HANDLE hServiceStatus, /* service status handle */ - LPSERVICE_STATUS lpServiceStatus); /* status buffer */ - - -#endif /* def _WIN32 */ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef W32_SVRAPI_H_INCLUDED */ - diff --git a/external/privoxy/w32taskbar.c b/external/privoxy/w32taskbar.c deleted file mode 100644 index 079e45e..0000000 --- a/external/privoxy/w32taskbar.c +++ /dev/null @@ -1,313 +0,0 @@ -const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.10 2006/09/23 13:26:38 roro Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/w32taskbar.c,v $ - * - * Purpose : Functions for creating, setting and destroying the - * workspace tray icon - * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ - * - * Written by and Copyright (C) 1999 Adam Lock - * locka@iol.ie - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: w32taskbar.c,v $ - * Revision 1.10 2006/09/23 13:26:38 roro - * Replace TABs by spaces in source code. - * - * Revision 1.9 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.7.2.2 2003/03/19 21:27:42 gliptak - * Corrected compilation error/typo - * - * Revision 1.7.2.1 2002/11/20 14:39:32 oes - * Applied patch by Mattes Dolak which adds re-creation of the win32 taskbar - * icon on reception of the "TaskbarCreated" window message. - * - * Revision 1.7 2002/03/31 17:19:00 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.6 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * 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. - * - * 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 <stdio.h> - -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> - -#include "w32taskbar.h" -#include "w32res.h" -#include "w32log.h" - -const char w32taskbar_h_rcs[] = W32TASKBAR_H_VERSION; - -#ifndef _WIN_CONSOLE /* entire file */ - -#define WM_TRAYMSG WM_USER+1 - -static HMENU g_hmenuTray; -static HWND g_hwndTrayX; -static UINT g_traycreatedmsg; - -static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - - -/********************************************************************* - * - * Function : CreateTrayWindow - * - * Description : Creates and returns the invisible window responsible - * for processing tray messages. - * - * Parameters : - * 1 : hInstance = instance handle of this application - * - * Returns : Handle of the systray window. - * - *********************************************************************/ -HWND CreateTrayWindow(HINSTANCE hInstance) -{ - WNDCLASS wc; - static const char *szWndName = "PrivoxyTrayWindow"; - - wc.style = 0; - wc.lpfnWndProc = TrayProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = 0; - wc.hCursor = 0; - wc.hbrBackground = 0; - wc.lpszMenuName = 0; - wc.lpszClassName = szWndName; - - RegisterClass(&wc); - - /* TaskbarCreated is sent to a window when it should re-add its tray icons */ - g_traycreatedmsg = RegisterWindowMessage("TaskbarCreated"); - - g_hwndTrayX = CreateWindow(szWndName, szWndName, - WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); - - ShowWindow(g_hwndTrayX, SW_HIDE); - UpdateWindow(g_hwndTrayX); - - g_hmenuTray = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_TRAYMENU)); - - return g_hwndTrayX; - -} - - -/********************************************************************* - * - * Function : TraySetIcon - * - * Description : Sets the tray icon to the specified shape. - * - * Parameters : - * 1 : hwnd = handle of the systray window - * 2 : uID = user message number to notify systray window - * 3 : hicon = set the current icon to this handle - * - * Returns : Same value as `Shell_NotifyIcon'. - * - *********************************************************************/ -BOOL TraySetIcon(HWND hwnd, UINT uID, HICON hicon) -{ - NOTIFYICONDATA nid; - - memset(&nid, 0, sizeof(nid)); - - nid.cbSize = sizeof(nid); - nid.hWnd = hwnd; - nid.uID = uID; - nid.uFlags = NIF_ICON; - nid.uCallbackMessage = 0; - nid.hIcon = hicon; - - return( Shell_NotifyIcon(NIM_MODIFY, &nid) ); - -} - - -/********************************************************************* - * - * Function : TrayAddIcon - * - * Description : Adds a tray icon. - * - * Parameters : - * 1 : hwnd = handle of the systray window - * 2 : uID = user message number to notify systray window - * 3 : hicon = handle of icon to add to systray window - * 4 : pszToolTip = tool tip when mouse hovers over systray window - * - * Returns : Same as `Shell_NotifyIcon'. - * - *********************************************************************/ -BOOL TrayAddIcon(HWND hwnd, UINT uID, HICON hicon, const char *pszToolTip) -{ - NOTIFYICONDATA nid; - - memset(&nid, 0, sizeof(nid)); - - nid.cbSize = sizeof(nid); - nid.hWnd = hwnd; - nid.uID = uID; - nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; - nid.uCallbackMessage = WM_TRAYMSG; - nid.hIcon = hicon; - - if (pszToolTip) - { - strcpy(nid.szTip, pszToolTip); - } - - return( Shell_NotifyIcon(NIM_ADD, &nid) ); - -} - - -/********************************************************************* - * - * Function : TrayDeleteIcon - * - * Description : Deletes a tray icon. - * - * Parameters : - * 1 : hwnd = handle of the systray window - * 2 : uID = user message number to notify systray window - * - * Returns : Same as `Shell_NotifyIcon'. - * - *********************************************************************/ -BOOL TrayDeleteIcon(HWND hwnd, UINT uID) -{ - NOTIFYICONDATA nid; - - memset(&nid, 0, sizeof(nid)); - - nid.cbSize = sizeof(nid); - nid.hWnd = hwnd; - nid.uID = uID; - - return( Shell_NotifyIcon(NIM_DELETE, &nid) ); - -} - - -/********************************************************************* - * - * Function : TrayProc - * - * Description : Call back procedure processes tray messages. - * - * Parameters : - * 1 : hwnd = handle of the systray window - * 2 : msg = message number - * 3 : wParam = first param for this message - * 4 : lParam = next param for this message - * - * Returns : Appropriate M$ window message handler codes. - * - *********************************************************************/ -LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_CREATE: - return 0; - - case WM_CLOSE: - PostQuitMessage(0); - return 0; - - case WM_TRAYMSG: - { - /* UINT uID = (UINT) wParam; */ - UINT uMouseMsg = (UINT) lParam; - - if (uMouseMsg == WM_RBUTTONDOWN) - { - POINT pt; - HMENU hmenu = GetSubMenu(g_hmenuTray,0); - GetCursorPos(&pt); - SetForegroundWindow(g_hwndLogFrame); - TrackPopupMenu(hmenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, g_hwndLogFrame, NULL); - PostMessage(g_hwndLogFrame, WM_NULL, 0, 0 ) ; - } - else if (uMouseMsg == WM_LBUTTONDBLCLK) - { - ShowLogWindow(TRUE); - } - } - return 0; - - default: - - if (msg == g_traycreatedmsg) - { - TrayAddIcon(g_hwndTrayX, 1, g_hiconApp, "Privoxy"); - } - break; - } - - return DefWindowProc(hwnd, msg, wParam, lParam); - -} - - -#endif /* ndef _WIN_CONSOLE - entire file */ - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/w32taskbar.h b/external/privoxy/w32taskbar.h deleted file mode 100644 index 7ea7588..0000000 --- a/external/privoxy/w32taskbar.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef W32TASKBAR_H_INCLUDED -#define W32TASKBAR_H_INCLUDED -#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.6 2006/07/18 14:48:48 david__schmidt Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/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/ - * - * Written by and Copyright (C) 1999 Adam Lock - * locka@iol.ie - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: w32taskbar.h,v $ - * Revision 1.6 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.4 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * 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 - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern HWND CreateTrayWindow(HINSTANCE hInstance); -extern BOOL TrayAddIcon(HWND hwnd, UINT uID, HICON hicon, const char *pszToolTip); -extern BOOL TraySetIcon(HWND hwnd, UINT uID, HICON hicon); -extern BOOL TrayDeleteIcon(HWND hwnd, UINT uID); - -/* Revision control strings from this header and associated .c file */ -extern const char w32taskbar_rcs[]; -extern const char w32taskbar_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef W32TASKBAR_H_INCLUDED */ - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/win32.c b/external/privoxy/win32.c deleted file mode 100644 index 3aedd53..0000000 --- a/external/privoxy/win32.c +++ /dev/null @@ -1,366 +0,0 @@ -const char win32_rcs[] = "$Id: win32.c,v 1.15 2009/02/09 19:16:35 fabiankeil Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/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/ - * - * Written by and Copyright (C) 1999 Adam Lock - * locka@iol.ie - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: win32.c,v $ - * Revision 1.15 2009/02/09 19:16:35 fabiankeil - * Bump copyright year in win32_blurb[]. - * - * Revision 1.14 2008/03/02 18:15:41 fabiankeil - * Update copyright year in win32_blurb[]. - * - * Revision 1.13 2007/01/31 16:25:24 fabiankeil - * Update copyright range for the About message. - * - * Revision 1.12 2006/08/12 03:54:37 david__schmidt - * Windows service integration - * - * Revision 1.11 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.9.2.2 2002/08/27 18:03:40 oes - * Fixed stupid typo - * - * Revision 1.9.2.1 2002/08/21 17:59:27 oes - * Sync win32_blurb[] with our standard blurb - * - * Revision 1.9 2002/03/31 17:19:00 jongfoster - * Win32 only: Enabling STRICT to fix a VC++ compile warning. - * - * Revision 1.8 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * 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 - * - * - *********************************************************************/ - - -#include "config.h" - -#ifdef _WIN32 - -#include <stdio.h> - -#include "project.h" -#include "jcc.h" -#include "miscutil.h" - -/* Uncomment this if you want to build Win32 as a console app */ -/* #define _WIN_CONSOLE */ - -#ifndef STRICT -#define STRICT -#endif -#include <windows.h> - -#include <stdarg.h> -#include <process.h> - -#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) -/* Visual C++ Heap debugging */ -#include <crtdbg.h> -#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */ - -#include "win32.h" - -const char win32_h_rcs[] = WIN32_H_VERSION; - -/** - * A short introductory text about Privoxy. Used for the "About" box - * or the console startup message. - */ -const char win32_blurb[] = -"Privoxy version " VERSION " for Windows\n" -"Copyright (C) 2000-2009 the Privoxy Team (" HOME_PAGE_URL ")\n" -"Based on the Internet Junkbuster 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" -"This program comes with ABSOLUTELY NO WARRANTY OF ANY KIND.\n"; - -#ifdef _WIN_CONSOLE - -/** - * Hide the console. If set, the program will disconnect from the - * console and run in the background. This allows the command-prompt - * window to close. - */ -int hideConsole = 0; - - -#else /* ndef _WIN_CONSOLE */ - - -/** - * The application instance handle. - */ -HINSTANCE g_hInstance; - - -/** - * The command to show the window that was specified at startup. - */ -int g_nCmdShow; - -static void __cdecl UserInterfaceThread(void *); - - -#endif /* ndef _WIN_CONSOLE */ - -/********************************************************************* - * - * Function : WinMain - * - * 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). - * - * Parameters : - * 1 : hInstance = instance handle of this execution - * 2 : hPrevInstance = instance handle of previous execution - * 3 : lpCmdLine = command line string which started us - * 4 : nCmdShow = window show value (MIN, MAX, NORMAL, etc...) - * - * Returns : `main' never returns, so WinMain will also never return. - * - *********************************************************************/ -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -{ -#if 0 /* See comment about __argc & __argv below */ - int i; - int argc = 1; - const char *argv[3]; - char szModule[MAX_PATH+1]; -#endif - - int res; -#ifndef _WIN_CONSOLE - HANDLE hInitCompleteEvent = NULL; -#endif - - -#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) */ - - -/************ - * I couldn't figure out why the command line was being sorta parsed here - * instead of using the __argc & __argv globals usually defined in stdlib.h - * - * From what I can tell by looking at the MinWG source, it supports these - * globals, so i'd hope that the other compilers do so as well. - * Obviously, if i'm wrong i'll find out soon enough! :) - ************/ -#if 0 - /* - * Cheat in parsing the command line. We only ever have at most one - * paramater, which may optionally be specified inside double quotes. - */ - - if (lpCmdLine != NULL) - { - /* Make writable copy */ - lpCmdLine = strdup(lpCmdLine); - } - if (lpCmdLine != NULL) - { - chomp(lpCmdLine); - i = strlen(lpCmdLine); - if ((i >= 2) && (lpCmdLine[0] == '"') && (lpCmdLine[i - 1] == '"')) - { - lpCmdLine[i - 1] = '\0'; - lpCmdLine++; - } - if (lpCmdLine[0] == '\0') - { - lpCmdLine = NULL; - } - } - - GetModuleFileName(hInstance, szModule, MAX_PATH); - argv[0] = szModule; - argv[1] = lpCmdLine; - argv[2] = NULL; - argc = ((lpCmdLine != NULL) ? 2 : 1); -#endif /* -END- 0 */ - - -#ifndef _WIN_CONSOLE - /* Create a user-interface thread and wait for it to initialise */ - hInitCompleteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - g_hInstance = hInstance; - g_nCmdShow = nCmdShow; - _beginthread(UserInterfaceThread, 0, &hInitCompleteEvent); - WaitForSingleObject(hInitCompleteEvent, INFINITE); - DeleteObject(hInitCompleteEvent); -#endif - -#ifdef __MINGW32__ - res = real_main( __argc, __argv ); -#else - res = main( __argc, __argv ); -#endif - - return res; - -} - -#endif - -/********************************************************************* - * - * Function : InitWin32 - * - * Description : Initialise windows, setting up the console or windows as appropriate. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void InitWin32(void) -{ - WORD wVersionRequested; - WSADATA wsaData; - -#ifdef _WIN_CONSOLE - SetProcessShutdownParameters(0x100, SHUTDOWN_NORETRY); - if (hideConsole) - { - FreeConsole(); - } -#endif - wVersionRequested = MAKEWORD(2, 0); - if (WSAStartup(wVersionRequested, &wsaData) != 0) - { -#ifndef _WIN_CONSOLE - MessageBox(NULL, "Cannot initialize WinSock library", "Privoxy Error", - MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); -#endif - exit(1); - } - -} - - -#ifndef _WIN_CONSOLE -#include <signal.h> -#include <assert.h> - -#include "win32.h" -#include "w32log.h" - - -/********************************************************************* - * - * Function : UserInterfaceThread - * - * 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. - * - * Parameters : - * 1 : pData = pointer to `hInitCompleteEvent'. - * - * Returns : N/A - * - *********************************************************************/ -static void __cdecl UserInterfaceThread(void *pData) -{ - MSG msg; - HANDLE hInitCompleteEvent = *((HANDLE *) pData); - - /* Initialise */ - InitLogWindow(); - SetEvent(hInitCompleteEvent); - - /* Enter a message processing loop */ - while (GetMessage(&msg, (HWND) NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - /* Cleanup */ - TermLogWindow(); - - /* Time to die... */ - exit(0); - -} - - -#endif /* ndef _WIN_CONSOLE */ - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/external/privoxy/win32.h b/external/privoxy/win32.h deleted file mode 100644 index 1b4e814..0000000 --- a/external/privoxy/win32.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef WIN32_H_INCLUDED -#define WIN32_H_INCLUDED -#define WIN32_H_VERSION "$Id: win32.h,v 1.7 2006/07/18 14:48:48 david__schmidt Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/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/ - * - * Written by and Copyright (C) 1999 Adam Lock - * locka@iol.ie - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: win32.h,v $ - * Revision 1.7 2006/07/18 14:48:48 david__schmidt - * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) - * with what was really the latest development (the v_3_0_branch branch) - * - * Revision 1.5 2002/03/26 22:57:10 jongfoster - * Web server name should begin www. - * - * 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 - * - * - *********************************************************************/ - - -#ifdef __cplusplus -extern "C" { -#endif - -extern const char win32_blurb[]; - -extern void InitWin32(void); - -#ifdef _WIN_CONSOLE -extern int hideConsole; -#endif /*def _WIN_CONSOLE */ - -extern HINSTANCE g_hInstance; -extern int g_nCmdShow; - -extern int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); - -/* Revision control strings from this header and associated .c file */ -extern const char win32_rcs[]; -extern const char win32_h_rcs[]; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef WIN32_H_INCLUDED */ - -/* - Local Variables: - tab-width: 3 - end: -*/
tor-commits@lists.torproject.org